首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写run方法

重写run方法
EN

Stack Overflow用户
提问于 2013-12-03 02:26:55
回答 2查看 47关注 0票数 0
代码语言:javascript
复制
class Car extends Vehicle { 
    public static void main(String [] args) {
        new Car().run(); 
     }
     private final void run() {
         System.out.println("Car");
     }
 }

class Vehicle {
     private final void run() {
         System.out.println("Vehicle");
     }
 }

这是“J2SE 5平台SCJP考试”中的一个练习题,它显然还车。

但是汽车扩展了车辆,覆盖了run()。但是在超类中运行是最终结果。我不认为你能推翻最终的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-03 02:39:43

秘密在于private修饰符。JLS 8.4.3.3.最终方法

私有方法和在最终类中立即声明的所有方法(§8.1.1.2)表现得好像它们是最终的,因为不可能覆盖它们。

私有方法在自身之外的任何地方都是不可见的,因此不能被重写。

他们只是碰巧有相同的名字,但他们没有分享任何以外的东西。

如果扩展源代码中不知道的类,这种行为也很有意义。您需要知道所有您看不到的私有方法签名,这样您就不会意外地覆盖和破坏它们。

票数 1
EN

Stack Overflow用户

发布于 2013-12-03 02:39:51

重要的是要注意。

代码语言:javascript
复制
 private final void run() {
     System.out.println("Car");
 }

可以在Car类中访问私有类,而在Vehicle类中,您已经将方法声明为final。Final是一个关键字,您不能覆盖到其他类,但是如果您为Vehicle创建一个对象引用。因此,newCar().run()将以"Car“的形式打印输出。在这里,覆盖概念将不适用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20341714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档