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?

解决方案 »

  1.   

    引用B有x=2,x=3两个属性...当引用B的类型为Base的时候...B.x只能是2...你在Subclass里加上两个方法getThisX()和getSuperX(),然后S=(Subclass)B,再用S调用这两个方法就能看出来了...
      

  2.   

    属性是静态绑定,不构成多态。over
      

  3.   

    静态绑定.....一般不这么称呼...2楼应该是相对方法的动态加载来说的...属性的调用在编译的阶段就明确了...而一般方法的绑定在运行时由JVM来决定...后者就是动态加载...
      

  4.   

    引用B有x=2,x=3两个属性... 
    ----------------------
    能同时有这样的两个属性?
    在同一时间只能有一个吧?
      

  5.   

    静态绑定(Static Binding),绝对正宗的官方语汇,印象中C语言年代就有了。
      

  6.   

    回7楼:汗,学无止境啊......受教了...回6楼:的确是两个,把B强转为Subclass就能看出来了,this.x和super.x能调出这两个数来
      

  7.   

    回8楼
        对于Subclass类而言继承了父类的属性,再加上自己也有自己的属性,所以就有两个
        文中是父类对象指向子类对象,这个对象还能不能有两个属性呢?这父类子类的搞得我还有点晕。。
      

  8.   

    回10楼:
    动手44就能看出来了,其实引用B最初指向的类对象是Subclass类的,这点无论B如何转型都不会变化,而Subclass类是有子类.x和父类.x两个属性的.当引用B为Base类的时候只能通过B访问到父类的x属性而不能访问子类的x属性;
    当引用B转型为Subclass类的时候可以通过B访问两个属性(this.x和super.x);整个转型中变化的只是引用B的类型而已,堆内存中这个Subclass类对象本身没有发生任何变化.
      

  9.   

    不是的 父类的对象不拥有子类的那个属性(由父类生成的对象 而不是从子类上溯造型来的对象) 
    但是反过来子类却可以拥有父类的属性 只不过是通常情况下引用的都是自己的(也可以视做父类的属性暂时被子类的替换掉 不可见了 但还存在 要通过super才能调用 这点有些像全局静态变量和同名局部变量的关系) 
    而且当子类的对象被转化为成父类对象时 他同样还拥有子类的属性 只是这时候那些属性都“不可见”(暂时遮住)了 但当你又把他转回子类对象时 那就又能“看见”子类的属性了 就好像让一个可以教小学和初中的老师去教小学一样 那他只能做小学的那些工作 但当他如果去初中了 那他初中和小学的知识都能教 大概是这个意思