簡體   English   中英

在這種情況下,繼承和多態性如何工作?

[英]How does inheritance and polymorphism work in this situation?

這是頭等艙

package test;

public class Project {

public void doSomething (String stuff) {

    writeStuff();
    whichProject(stuff);

}

public void writeStuff(){

    System.out.println("This is stuff");

}


public void whichProject(String stuff){

    System.out.println("This is a random project " + stuff);

}

}

這是派生類

package test;

public class Project1 extends Project{

public void whichProject(String stuff){

    System.out.println("Coding project number one: " + stuff);

}

public static void main(String[] args) {

    Project project = new Project1();

    project.doSomething("stuff");

}

}

運行Project1時,輸出結果為:

This is stuff
Coding project number one: stuff

為什么它在Project1中調用whichProject()而不在Project中調用whichProject() 畢竟, doSomething()不是Project中的方法嗎? 還是當基類中的某個方法在基類中的另一個方法內部時,那么即使我們在另一個方法內部,變量所引用的對象仍然確定將調用哪個方法調用?

現在,如果我們將whichProject()的修飾符更改為private ,則該類現在是

package test;

public class Project {

public void doSomething (String stuff) {

    writeStuff();
    whichProject(stuff);

}

public void writeStuff(){

    System.out.println("This is stuff");

}


private void whichProject(String stuff){

    System.out.println("This is a random project " + stuff);

}

}

輸出變為:

This is stuff
This is a random project stuff

因此,即使變量引用了Project1的對象,現在也將調用Project中的whichProject()方法,而不是一個Project1。 在這種情況下,我完全不了解發生了什么。 (這兩種情況的說明whichProject()public改性劑和whichProject()private調整值),將不勝感激。

在Java中,所有方法都是虛擬的。

虛擬方法是可以在派生類中重寫的方法,只要子類中的版本具有相同的簽名(返回類型和參數)即可。

因此,在Project和Project1的原始版本中,如果您有Project1,則即使從Project方法中的代碼也將調用Project1的public void whichProject(String stuff)版本。

但是,如Java語言規范8.4.8.3節所述 ,私有方法不能被覆蓋:

請注意,就這些術語的技術意義而言,私有方法不能被隱藏或覆蓋。 這意味着子類可以在其超類之一中聲明與私有方法具有相同簽名的方法,並且不要求此類方法的返回類型或throws子句與私有方法中的私有方法有任何關系。超類。

因此,當Project的doSomthing代碼調用whichProject ,它將調用Project的私有版本,而不是Project1的公共版本。

繼承遵循自下而上的方法。

因此,使用的writeProject()來自超類類,而whichProject(stuff)來自基類。

您可以參考此示例繼承和多態

希望能幫助到你。

對於方法的繼承,請使用以下模型:

  1. 收集當前類中的所有方法。
  2. 從超類中添加方法,這些方法是可見的(即,不是private ),並且到目前為止您還沒有看到。
  3. 將此列表添加到繼承列表中最頂層的類

調用方法時,Java知道實例的類型。 想象一下, this作為一個不可見的方法參數傳遞給每個方法。 通過查看定義方法的類無法解析方法。

相反,Java使用this ,調用getClass() ,然后如上所述獲取方法列表。 因此,即使在執行Project的代碼時,它仍然使用Project1列表中的方法。

當您將方法private時,這會改變。 私有方法不能被覆蓋,它們根本不會出現在上面的列表中。 相反,Java插入代碼以直接調用它,而無需查看列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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