java - 子类里继承的方法为什么会去使用父类的prvate属性?
迷茫
迷茫 2017-04-18 10:01:37
[Java讨论组]
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(5)
高洛峰

我自己来回答这个问题吧,今天研究了下,可能是我对继承的理解不太对。

这里子类SmallHomeTest,虽然继承了父类的HomeTest的printHome()方法,其实仅表示,子类可以以父类的身份去调用父类的printHome()方法,而不是指子类有这个方法。

所以说,当编译执行时候,编译器发现子类里的small.printHome()语句时,会先检查子类有没有printHome方法,如果没有,再看其父类有没有,如果有,则是以父类的身份,来调用这个printHome()方法,则里面的home变量是来自父类的private home变量(父类是看不到子类定义的的private home变量的)。

怪我咯
public class Entry {
    public static void main(String[] args) {
        SmallHomeTest small = new SmallHomeTest();
        small.printHome();//........①
    }
}

你①处代码调用的
   

 public void printHome() {
        System.out.println(home);
    }
    
        用public修饰,这和
   

     public String getHome() {
        return home;
    }
        
        没区别。
PHP中文网

成员变量是私有的,只能够在类的内部被使用。成员方法是公有的,可以被外部调用。类的基本特性。

巴扎黑

多态性并不能体现在字段上。

       0: aload_0
       1: invokespecial #10                 // Method java/lang/Object."<init>":
()V
       4: aload_0
       5: ldc           #12                 // String This is HOME
       7: putfield      #14                 // Field home:Ljava/lang/String;
      10: return

  public void printHome();
    Code:
       0: getstatic     #21                 // Field java/lang/System.out:Ljava/
io/PrintStream;
       3: aload_0
       4: getfield      #14                 // Field home:Ljava/lang/String;  //这里getfield #14就是上面putfield #14 ,内容是死的。
       7: invokevirtual #27                 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
      10: return
高洛峰

就近原则。printHome()方法是父类的方法,printHome()里成员变量的使用优先访问父类的成员变量。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号