簡體   English   中英

Java編譯器在看到關鍵字extends時會做什么?

[英]What does the Java compiler do when it sees the keyword extends?

請考慮以下代碼。

A.java,主要包裝:

package pkgs.main;

public class A {
    protected int x;
}

B.java,測試包:

package pkgs.test;
import pkgs.main.A;

public class B extends A {
}

當運行javac編譯器時,它是否像這樣做:

A.java,主要包裝:

package pkgs.main;

public class A {
    protected int x;
}

B.java,測試包:

package pkgs.test;
import pkgs.main.A;

public class B extends A {  
    // Some "flag/code" that says:
    // Must be aware that the following new and seperate copy of x 
    // has originated from class A, which is inside a package called main.
    protected int x;
}

我之所以要問的是,我試圖了解子類必須知道其繼承成員的所有“屬性/屬性”才能運行。 如果這是真的,那么這種編程繼承會與“現實世界”中的繼承略有不同嗎? 例如,我從父母那里繼承了各種屬性,但我完全不知道所有這些信息。 (如果我的父母要去世,我可以繼續操作。)然而,我想知道Java的繼承在這個意義上是不是獨立的,如果子類必須始終知道它從哪里得到它的繼承成員,為了正確操作。

問題是,在閱讀編程書籍中的繼承時,我感到困惑。 它們提供了涉及動物,貓和狗等現實世界對象的示例,但基於上面的段落,我想知道Java繼承與Java書籍中涉及這些類型的繼承示例之間是否存在微妙的“機制差異”現實世界的對象。

我與Java有關的問題是我不明白為什么我被允許執行以下操作。 下面的代碼是“主類”中的一些簡單的“調用代碼”,涉及上面已經定義的兩個類(A和B)。

Main.java,主要包:

package pkgs.main;
import pkgs.test.B;

// Just some method inside the "main class"
void method() {
    B b = new B();
    b.x ++;  //   <--- why is this allowed?
}

這個“調用代碼”在一個名為main的包中,而類B在一個名為test的不同包中定義。 這個調用代碼沒有擴展B類,那么為什么Java允許訪問B的受保護成員x?

的解釋是,因為受保護的成員x原本A級,這在同一個包調用代碼內聲明的? 如果是真的,那么這大致符合我之前的想法,我在這里談到了B類:

public class B extends A {  
    // Some "flag/code" that says:
    // Must be aware that the following new and seperate copy of x 
    // has originated from class A, which is inside a package called main.
    protected int x;
}

Java編譯器在看到關鍵字extends時會做什么?

在你的情況下沒有。

這個調用代碼沒有擴展B類,那么為什么Java允許訪問B的受保護成員x?

這是關於可訪問性的。 根據Java語言規范(參見JLS7: http ://docs.oracle.com/javase/specs/jls/se7/jls7.pdf)

6.6.1確定可訪問性

...

否則,如果成員或構造函數被聲明為protected,則只有在滿足以下條件之一時才允許訪問:

  • 從包含聲明受保護成員或構造函數的類的包中發生對成員或構造函數的訪問。

  • 如第6.6.2節所述,訪問是正確的。

...

您可以從同一個包中訪問受保護的字段“x”。 但是如果你在類'B'中聲明一個新字段'x'(它隱藏'A.x'),那么你就不能從'main'包中訪問'x'(格式為b.x++; )。

// Some "flag/code" that says:
// Must be aware that the following new and seperate copy of x 
// has originated from class A, which is inside a package called main.
protected int x;

沒有。沒有'新的和單獨的x'。 它是從A類繼承的'x'。它是一樣的。 這可以解釋你所有的困惑。

如果一個子類必須知道從哪里得到它的繼承成員

當然。

是解釋因為受保護的成員最初是在A類中聲明的嗎?

是。

暫無
暫無

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

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