表面類型:對象聲明時的類型;java
實際類型:對象產生時的類型;ide
Base[表面類型]base=new Sub[實際類型]();函數
那麼在繼承關係中,方法時如何執行的呢?例子以下:code
public class StaticTest { public static void main(String[] args) { // TODO Auto-generated method stub Base base=new Sub(); base.doSomeThing1(); base.doSomeThing(); } } class Base{ public static void doSomeThing() { System.out.println("Base method---doSomeThing"); } public void doSomeThing1() { System.out.println("Base method---doSomeThing1"); } } class Sub extends Base{ public static void doSomeThing() { System.out.print("Sub method---doSomeThing"); } @Override public void doSomeThing1() { System.out.print("Sub method---doSomeThing1"); } } ------------------ Sub method---doSomeThing1 Base method---doSomeThing
咱們發現靜態方法居然執行的不是子類中的方法,這是因爲:對象
非靜態方法是按照實際類型執行的;繼承
靜態方法是按照表面類型來執行的;class
可是,經過子類構建與父類徹底相同的靜態函數,這中行爲叫作「隱藏」,其目的就是拋棄父類的靜態方法,重顯子類方法。方法