一,介绍
我们知道当子类继承父类时,会覆盖父类中和子类同名的方法和属性,前提这些方法和属性不是私有的,下面让我们看一段代码如下
class A{
public int num = 1 ;
public String name="A";
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void method(){
System.out.print("A");
}
}
class B extends A{
public int num = 2 ;
public String name="B";
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void method(){
System.out.print("B");
}
}
public class Test {
public static void main(String[] args) {
A a = new B();
B b = new B();
A a2 = new A();
System.out.println(a.name);
System.out.println(a.getName());
a.method();
System.out.println("====================================");
System.out.println(b.name);
System.out.println(b.getName());
b.method();
System.out.println("============================================");
System.out.println(a2.name);
System.out.println(a2.getName());
a2.method();
}
}
这段代码中,B类继承了A类,B类覆盖了A类的属性和方法,但是从打印结果来看,方法被覆盖了,但是属性没有被覆盖,下面是打印结果
为什么会这样能?我们知道的结论如下
子类转型为父类的规则:
-
只能调用父类的属性
-
只能调用父类未被复写的方法
-
只能调用被子类复写的方法
换言之,只有复写的方法才能被调用,被复写的属性不同,这说明,方法和属性在内存中的结构是不同的,正常结构如下
但是如果是父类引用指向子类,就不太一样了,如下
显然他会找被子类复写了的方法,如果该方法子类没有,根据继承结构,看 父类有没有,有就调用父类方法,但是属性,就会直接根据继承结构,找父类
中的属性,而不会使用子类的属性,即子类的属性不能复写父类的属性,至于为何如此,那么只能说他就是这么设计的,我也不知道。如果有错的话,请纠正