静态方法、成员变量不能重写,只可以隐藏;实例方法可以重写
重写与隐藏的本质区别:重写是动态绑定,根据运行时引用所指向对象的实际类型来决定调用相关类的成员。而隐藏是静态绑定的,根据编译时引用的静态类型来决定调用相关类的成员。换句话说,如果子类重写了父类的方法,当父类的引用指向子类对象时,通过父类的引用调用的是子类的方法。如果子类隐藏了父类的方法(成员变量),通过父类的引用调用的仍然是父类的方法(成员变量),如下:
class SuperXieYuYan{ String s="SuperXieYuYan"; public void mInstance(){ System.out.println("mInstance() in SuperXieYuYan"); } public static void mStatic(){ System.out.println("mStatic() in SuperXieYuYan"); } } public class XieYuYan extends SuperXieYuYan{ String s="XieYuYan"; public void mInstance(){ System.out.println("mInstance() in XieYuYan"); } public static void mStatic(){ System.out.println("mStatic() in XieYuYan"); } public static void main(String args[]){ SuperXieYuYan sxyy=new SuperXieYuYan(); XieYuYan xyy=new XieYuYan(); System.out.println("父类的表现:"); System.out.println(sxyy.s); sxyy.mInstance(); sxyy.mStatic(); System.out.println("子类的表现:"); System.out.println(xyy.s); xyy.mInstance(); xyy.mStatic(); //将子类引用赋给父类 sxyy=xyy; System.out.println("父类引用指定子类实例后的表现:"); System.out.println(sxyy.s); sxyy.mInstance(); sxyy.mStatic(); } }
输出为:
父类的表现:
SuperXieYuYan
mInstance() in SuperXieYuYan
mStatic() in SuperXieYuYan
子类的表现:
XieYuYan
mInstance() in XieYuYan
mStatic() in XieYuYan
父类引用指定子类实例后的表现:
SuperXieYuYan
mInstance() in XieYuYan
mStatic() in SuperXieYuYan
在将子类实例赋给父类实例后,父类实例调用的还是原来的成员变量和静态方法