public class test {
public static void main(String args[]) {
A a = new A();
System.out.println("------------------");
B b = new B();
System.out.println("------------------");
A c = new B();
System.out.println("------------------");
System.out.println("a.a=:"+a.a+" b.a=:"+b.a+" c.a=:"+c.a);
System.out.println("------------------");
a.get();
b.get();
c.get();
System.out.println("------------------");
b = (B) c;
c.get();
b.get();
}
class A {
int a = 1;
A() {
System.out.println("构造A");
}
public void get() {
System.out.println("A中a=" + this.a);
}
}
class B extends A {
int a = 2;
B() {
System.out.println("构造B");
}
public void get() {
System.out.println("B中a=" + this.a);
}
}
执行结果:
构造A
------------------
构造A
构造B
------------------
构造A
构造B
------------------
a.a=:1 b.a=:2 c.a=:1
------------------
A中a=1
B中a=2
B中a=2
------------------
B中a=2
B中a=2
那么问题来了
一、A a = new B();是a的引用指向了b的空间,为什么会打印出a.a=1而在调用get方法后打印出的是b的结果
二、将a强制类型转换成b并将a的引用赋给b后,a,b指向同一块地址空间为什么打印出的a.a=1 而b.a=2
一、A a = new B();a的引用指向B的空间,a.a=1但是调用a.get()=2;当new B()时,调用继承自父类的构造方法 并创建了一个变量a=1,然后调用了自己的构造方法并重新创建了空间创建了自己的变量a=2,由debug模式可以看到实例a当中拥有两个a变量,A a取变量a的值时先从自己的变量当中找到1,调用get()方法时优先调用子类重写过的方法,执行子类的方法取到了子类当中自己的变量a=2;
二、将a转型赋给b后,虽然指向同一地址,但是a,b类型不同.两个对象各自取到自己类型的变量,调用方法时a执行被重写的方法,b执行自己的方法取值为2;
三、由此,A a = new B();a的引用指向B的空间时,调用a对象被子类重写的方法时,会执行B当中的方法.