问题描述
- 一个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也应该调用的是子类的属性才对啊?
解决方案
方法重载,属性不重载
解决方案二:
Sub已经继承了Parent的Test方法。即使你用super.Test(),其实调用的还是Sub继承的Test()方法。
解决方案三:
一个关键点:子类集成父类,在初始化子类的时候首先初始化父类的属性;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;同理第二个;希望自己调试一下。
解决方案四:
原因很简单:
继承只会复写方法,但是不会复写属性;新的Sub对象中有4个属性。2个a,2个b。而在对象里面直接引用的属性会首先选择本对象的属性,然后找父类。。。。。。此处在Parent中的getA().a使用的是Parent对象中的a属性,而不是Sub对象中的a属性
解决方案五:
多态没学好,一看就是。父类 成员变量和 成员方法调用问题,没搞清楚呢还
时间: 2025-01-02 20:07:04