日期:2014-05-20  浏览次数:20670 次

初学java,问一个问题, 求大神指教
    class A {  
       public int i = 10;    
   }      
   class B extends A{  
       public int i = 20; 
   }    
   public class Test{ 
       public static void main(String args[]){  
         B b = new B();   
         A a = b; 
         System.out.println(b.i);  
         System.out.println(a.i);   
      }
   } 
   问此题的输出结果 B b = new B();  b.i 的输出结果我知道 是20  
而A a  = b;的结果为什么是10,这应该是多态,a实质上是b啊 为什么输出结果却是 10
------解决方案--------------------
所谓的静态绑定就是说:变量声明的类型就是实际的类型,因此,a.i获取到的是A里面的i,b.i获取到的是B里面的i。

public class Test {
static class A {
public int i = 10;
public int getI(){
return this.i;
}
}
static class B extends A {
public int i = 20;
public int getI(){
return this.i;
}
}
public static void main(String args[]) {
B b = new B();
A a = b;
System.out.println(b.i);//20
System.out.println(a.i);//10
System.out.println(b.getI());//20
System.out.println(a.getI());//20 方法才会有多态
}
}




------解决方案--------------------
多态表现并实现于方法层面(运行期绑定),而变量则是静态(编译期绑定),父类子类各自维护自己的变量。
但static和final(所有private默认是final的)修饰的方法也是静态绑定的.

------解决方案--------------------
子类里申明的变量和父类里同名,这种做法是去隐藏父类继承来的属性,而在使用时,使用自身定义的这个。如果要调用父类的就用super关键字