





























问1:子类继承父类所有的成员变量和方法(那么,子类方法被继承且可以重写,而成员变量如果是被继承的话,上面的例子,子类的int x=4也是什么意思???没有成员变量也被重写这一说法吧!!!或许这样理解不知道对不对,本来是已经继承了,只不过这里子类又重新定义了一个值给X,但并不是重写)
问2:Base b = new Subclass();这个b已经指向子类对象了,只不过是父类类型的的,但它的实例确实是子类的,为什么b.x是父类里的1呢,虽然这里是b,但它不是指向子类的实例吗???为什么不是4呢
经查GOOGLE,BAIDU得知,这些变量是在编译的时候决定的,
但,即使是编译的时候就决定了,但它们应该是每个对象自己里的变量啊.回到那句话,b不是指向子类的对象吗?
答:属性只在自己的里面有用,方法可以被重载的.
(1)
1. 子类中的int x = 4;属于“屏蔽(hiding)”,不是重写。
2. 只有方法才可能构成多态。属性永远是静态绑定,不会构成多态。
无论何时,int x = 1永远都会绑定到Base类型的对象,而int x = 4永远都会绑定到Subclass类型的对象,这是编译时就决定了的。
Base b = new Subclass();告诉编译器:b是一个Base类型的对象。虽然它实际上到底是什么类型要到运行时才确定,但这时编译器已经完成了绑定了,所以,绑定给b的x永远是1,而不可能是4。
(2)
多态性只发生于方法,而不发生于域.并且,对于方法,只有那些非static与非final方法才具有多态性.
b.x + " " + b.y +" "+ b.z 都是域,没有多态行为,所以程序的执行结果自然是Base中对应的值。
(3)
在网上看到一句这样的话,估计很好理解.父类的引用指向子类时,当用到方法时,调用的是子类的对象.当用到属性时,用到的是父类对象.
如果把主函数变为:
public class Test{
public static void main(String[] args){
Base b = new Subclass();
System.out.println(b.x + " " + b.y +" "+ b.z);
System.out.println(b.method()); //新加上的, 打印出的是 4
}
}