簡體   English   中英

Java覆蓋實例和靜態方法執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM