class Test
{
public static void main(String [] args)
{
Base b = new Subclass();
System.out.println(b.x);
System.out.println(b.method());
}
}class Base
{
int x = 2;
int method()
{
return x;
}
}class Subclass extends Base
{
int x = 3;
int method()
{
return x;
}
}
为什么 B.X 是2 呢? 为什么不是3?
----------------------
能同时有这样的两个属性?
在同一时间只能有一个吧?
对于Subclass类而言继承了父类的属性,再加上自己也有自己的属性,所以就有两个
文中是父类对象指向子类对象,这个对象还能不能有两个属性呢?这父类子类的搞得我还有点晕。。
动手44就能看出来了,其实引用B最初指向的类对象是Subclass类的,这点无论B如何转型都不会变化,而Subclass类是有子类.x和父类.x两个属性的.当引用B为Base类的时候只能通过B访问到父类的x属性而不能访问子类的x属性;
当引用B转型为Subclass类的时候可以通过B访问两个属性(this.x和super.x);整个转型中变化的只是引用B的类型而已,堆内存中这个Subclass类对象本身没有发生任何变化.
但是反过来子类却可以拥有父类的属性 只不过是通常情况下引用的都是自己的(也可以视做父类的属性暂时被子类的替换掉 不可见了 但还存在 要通过super才能调用 这点有些像全局静态变量和同名局部变量的关系)
而且当子类的对象被转化为成父类对象时 他同样还拥有子类的属性 只是这时候那些属性都“不可见”(暂时遮住)了 但当你又把他转回子类对象时 那就又能“看见”子类的属性了 就好像让一个可以教小学和初中的老师去教小学一样 那他只能做小学的那些工作 但当他如果去初中了 那他初中和小学的知识都能教 大概是这个意思