初学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关键字