本帖最后由 余清兰 于 2012-7-31 08:37 编辑
楼主,您问的是a和b都是同一个类型对象,为什么调用的静态方法不一样?
那你的代码误写错了,下面代码的红字地方应该是a.static_method();
public static void main (String [] args){
A a = new B();
B b = new B();
a.method();
A.static_method(); //这个代码改为a.static_method();
b.method();
b.static_method();
}
分析如下:A a = new B();这个是父类的引用指向了自己的子类对象,是多态的体现。虽然跟b指向的是同一个类型对象,但是b是本类引用指向本类对象。
在多态中,静态成员函数的特点是无论编译和运行,都参考左边。这也称为静态绑定。
也就是说类一加载,方法就跟类绑定在一起了,跟着类走。所以就算新建对象用a.static_method();来调用静态方法,
走的还是引用型变量所属的类,这里也就是走的父类静态方法,所以无论编译和运行时期都参考左边。
B b = new B();而这个是本类引用指向本类对象。调用的就是本类的静态方法,静态方法是跟着类走的。
记住如下结论: 在多态中(父类引用指向子类对象的时候)非静态成员函数的特点: 在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有, 编译失败。 在运行时期:参阅对象所属的类中是否有调用的方法。 总结:成员函数在多态调用时,编译看左边,运行看右边。 在多态中,成员变量的特点: 无论编译和运行,都参考左边(引用型变量所属的类)。 在多态中,静态成员函数的特点: 无论编译和运行,都参考左边。
|