为了账号安全,请及时绑定邮箱和手机立即绑定

子类里继承的方法为什么会去使用父类的prvate属性?

子类里继承的方法为什么会去使用父类的prvate属性?

萧十郎 2019-03-12 17:15:52
请直接看我精简后的代码:public class HomeTest {    private String home = "This is HOME";    public void printHome() {        System.out.println(home);    }}public class SmallHomeTest extends HomeTest {        private String home = "This is SMALL HOME";    }public class Entry {    public static void main(String[] args) {        SmallHomeTest small = new SmallHomeTest();        small.printHome();    }}这里的运行结果是This is HOME,而不是"This is SMALL HOME",也就是说,子类HomeTest调用的继承来的方法printHome()里使用的属性,是父类里的private Home,这点我很奇怪,父类里的private不应该是对子类屏蔽的吗?求解释,谢谢!
查看完整描述

5 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

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

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

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


查看完整回答
反对 回复 2019-04-24
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

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;

    }

        

        没区别。


查看完整回答
反对 回复 2019-04-24
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

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


查看完整回答
反对 回复 2019-04-24
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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


       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


查看完整回答
反对 回复 2019-04-24
?
BIG阳

TA贡献1859条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-04-24
  • 5 回答
  • 0 关注
  • 631 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信