2 woxiangbo woxiangbo 于 2014.12.17 11:52 提问

一个java继承中碰到的菜鸟问题

public class Parent {
public String a;
public String b;

public Parent getA(){
    System.out.println("PPPPPPPPP");
    return this;
}
public void Test(){
    System.out.println(getA().a);
    System.out.println(getA().b);
}

}


public class Sub extends Parent{
public String a = "sa";
public String b = "sb";

public void aa(){
    super.Test();
}
@Override
public Sub getA(){
    System.out.println("SSSSSSSSSSSSSS");
    return this;
}

public static void main(String[] args) {
    Sub s = new Sub();
    s.aa();
}

}

打印结果 :
SSSSSSSSSSSSSS
null
SSSSSSSSSSSSSS
null
为啥打印的是两个 null 呢?
getA 调用的是子类,那么我想getA().a也应该调用的是子类的属性才对啊?

5个回答

wangyangzhizhou
wangyangzhizhou   2014.12.24 09:39

方法重载,属性不重载

Hjupan
Hjupan   2014.12.17 12:46

Sub已经继承了Parent的Test方法。即使你用super.Test(),其实调用的还是Sub继承的Test()方法。

a0004092
a0004092   2014.12.17 13:18

一个关键点:子类集成父类,在初始化子类的时候首先初始化父类的属性;Sub s = new Sub();首先调用父类的构造方法,没有?使用默认构造方法,初始化父类的属性a=null,b=null; s.aa();调用子类aa()方法,通过super.Test();调用父类Test()方法,父类System.out.println(getA().a);又调用子类getA()方法输出第一个"SSSSSSSSSSSSSS";返回父类getA().a=null;输出null;同理第二个;希望自己调试一下。

lowanty
lowanty   2014.12.17 13:50

原因很简单:
继承只会复写方法,但是不会复写属性;新的Sub对象中有4个属性。2个a,2个b。而在对象里面直接引用的属性会首先选择本对象的属性,然后找父类。。。。。。此处在Parent中的getA().a使用的是Parent对象中的a属性,而不是Sub对象中的a属性

cheifyfly
cheifyfly   2014.12.18 20:42

多态没学好,一看就是。父类 成员变量和 成员方法调用问题,没搞清楚呢还

Csdn user default icon
上传中...
上传图片
插入图片