[英]Java overriding instance and static method execution
在下面的程序中,我重寫了一個靜態方法和一個實例方法,當我使用超類調用實例方法時,它正在執行子類方法,但是在使用靜態方法的情況下,它將在執行超類靜態方法。 為什么是這樣?
class Superclass
{
public void print()
{
System.out.println("superclass print");
}
public static void staticPrint()
{
System.out.println("Superclass static print");
}
}
public class Subclass extends Superclass
{
public static void staticPrint()
{
System.out.print("subclass staticPrint");
}
public void print()
{
System.out.println("subclass print");
}
public static void main(String... args)
{
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
superclass.print();
}
}
輸出:
Superclass static print
subclass print
對於變量,靜態方法不能被覆蓋 ,只能被隱藏 。 在這里查看更多詳細信息:
如果子類定義的靜態方法具有與超類中的靜態方法相同的簽名,則子類中的方法會將其隱藏在超類中。
隱藏靜態方法和覆蓋實例方法之間的區別具有重要意義:
被調用的重寫實例方法的版本是子類中的版本。 被調用的隱藏靜態方法的版本取決於是從超類還是從子類調用。
靜態方法沒有方法重寫。 superclass.staticPrint()
等效於Superclass.staticPrint()
。
當調用靜態方法時,由superclass
變量引用的實例的類型完全無關緊要。 它甚至可以包含null
並且Superclass
類的靜態方法staticPrint()
仍將執行。
首先,靜態方法不能被覆蓋。 當引用靜態方法或變量時,它將始終使用聲明的類的默認值
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
靜態方法不需要實例化。 唯一重要的是,超類被聲明為類型Superclass。
而實例方法將始終引用其“實例”實現,因為該實現取決於對象的狀態。
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
superclass.print();
因為超類被實例化為子類。 由於實例方法需要執行狀態,因此它將調用子類實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.