源代码:
public class test {
public static void main(String args[])
{
A a = new B();
System.out.println("a的地址="+a);
System.out.println("在a中--------a="+a.a);
System.out.print("调用a.get()方法后---------");
a.get();
B b = new B();
System.out.println("b的地址="+b);
System.out.println("在b中--------a="+b.a);
System.out.println("-------------将a强制类型转换成b并将a的引用赋给b---------------");
b=(B)a;
System.out.println("a的地址="+a);
System.out.println("b的地址="+b);
System.out.println("在a中--------a="+a.a);
System.out.println("在b中--------a="+b.a);
System.out.print("调用a.get()方法后---------");
a.get();
System.out.print("调用b.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
构造B
a的地址=stringOperate.B@65b1fd9c
在a中--------a=1
调用a.get()方法后---------B中a=2
构造A
构造B
b的地址=stringOperate.B@88140ed
在b中--------a=2
-------------将a强制类型转换成b并将a的引用赋给b---------------
a的地址=stringOperate.B@65b1fd9c
b的地址=stringOperate.B@65b1fd9c
在a中--------a=1
在b中--------a=2
调用a.get()方法后---------B中a=2
调用b.get()方法后---------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
希望大神能从内存原理角度分析下原因,谢谢