java對象中的表面類型與實際類型

表面類型:對象聲明時的類型;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

可是,經過子類構建與父類徹底相同的靜態函數,這中行爲叫作「隱藏」,其目的就是拋棄父類的靜態方法,重顯子類方法。方法

相關文章
相關標籤/搜索