Java继承问题

上代码

父类:

public class Father {
   private String name="father";

   public String getName(){
      return this.name;
   }
}

子类:

public class Son extends Father{
    private String name="son";


/*    public String getName(){
        return name;
    }*/

    public static void main(String[] args) {
        Son test=new Son();
        System.out.println(test.getName());
    }
}

我本以为结果输出是:

son

但实际结果是

father

打断点调试截图如下:

clipboard.png

变得更加疑惑,这里显示的this明明是子类Son,但是调用getName方法时获取的却是父类的name属性呢?

在继承多态中:
1、对于方法的覆盖,new的谁就调谁,这就是多态。
2、对于成员变量的覆盖,this在哪个类就指向哪个类的成员变量,没有多态。

关于我的理解是否正确,如果正确,那么为什么Java要这样设计,而不是与方法一样有着相似的多态呢?

请教大家,谢谢!

阅读 1.9k
3 个回答

私有字段并不会被覆盖。

继承的概念没有完全弄懂。
Son继承Father,在这里继承到的是里面的getName()方法,而被修饰为private的私有属性和方法是不会被继承的,而在Son类中你并没有重写getName()方法,所以在你实例化Son类时:Son test=new Son();,会先进父类的构造器,初始化父类中的属性,之后调用的getName()方法是父类中的方法,而父类中的name属性被初始化为了"Father",所以输出的是"Father"。Son类中的private String name="son";是一段废代码,并没有任何实际用处,不会被调用的,你可以将鼠标移至该属性上,会提示你这个属性没有被用到。

对于代码:子类没有getName方法,当然是去父类中调用父类的方法,输出也就是father了。
对于多态:多态的实现方式是子类的对象指向父类的引用,在你的代码中,对象是new Son(),是子类,引用test也是子类,所以并没有存在多态。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题