9

サブクラスはプライベートフィールドを継承しますか?

この質問は同じ問題に対処しますが、それが以下の(一見)矛盾する状況をどのように満たすのかよくわかりません。

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

「サブクラスはその親クラスのプライベートメンバーを継承しません」と言います。

これは、プライベートインスタンス変数もプライベートメソッドも継承しないことを意味しますか?

ただし、親からパブリックアクセサーメソッドを継承する場合、これはどのように機能しますか?存在を知らないインスタンス変数を返しますか?

また、私のコンピュータサイエンスの本(BaronのAP Computer Science A)には、「(サブクラス)は(スーパークラス)からすべてのプライベートインスタンス変数とパブリックアクセサメソッドを継承する」という質問に対する正解があります。

これは、オラクルのチュートリアルを縮小したものではありませんか?

ご協力いただきありがとうございます

4

6 に答える 6

10

アクセサーは正常に動作します。アクセサはスーパークラスの「コンテキスト」で実行されるため、アクセサはサブクラスから隠されているメンバーを見ることができることに注意してください。

教科書はあなたの視点次第です。サブクラスは、サブクラスのインスタンス内に実際に存在するという意味でプライベートメンバーを継承しますが(メモリを消費するなど)、サブクラスはそれらに直接アクセスできません。

于 2012-05-08T00:38:47.397 に答える
5

タマネギのように考えてください。階層のすべてのレベルは、タマネギ内のレイヤーです。たとえば、クラスCがクラスAを拡張するクラスBを拡張する場合、クラスCのオブジェクトは次のようになります。

クラスCのオブジェクト

       -------------------------------------------------------------
       |                                                           | 
       |                   C and it's members                      |
       |                                                           |
       |    ------------------------------------------------       |
       |    |                                              |       |
       |    |              B and it's members              |       |
       |    |    ------------------------------------      |       |                                              
       |    |    |         A and it's members       |      |       |
       |    |    |                                  |      |       |
       |    |    ------------------------------------      |       |                                   
       |    ------------------------------------------------       |
       |                                                           |
       -------------------------------------------------------------            

したがって、クラスCのオブジェクトにはBとAのメンバーがあります。ただし、BとAのプライベートメンバーにはアクセスできません。

ただし、BおよびAのパブリックおよび保護されたメンバーにアクセスできます。

したがって、BまたはAのパブリックアクセサ関数を使用すると、クラスCのこのオブジェクトは、オブジェクトのクラスBまたはクラスA「部分」のプライベートインスタンス変数にアクセスできます。

于 2012-08-15T08:54:45.687 に答える
2

ここで「継承しない」とは、アクセスできないことを意味します。それはまだ存在しますが、対話できる方法ではありません(スーパークラスの非プライベートメソッドを呼び出す場合を除く)。

あなたがリンクした質問で受け入れられた答えはそれを説明しています。その説明の中で明確でない特定の部分はありますか?

于 2012-05-08T00:38:37.867 に答える
1

確かに、クラスにプライベートアイテムがある場合にクラスBから継承するクラスのオブジェクトを作成する場合、Javaのアクセス規則に従って、それらにアクセスすることはできませんが、これらの要素はnull参照としてもプライベートメモリに存在しますnullオブジェクトの場合。AA

Java言語仕様では、次のように読むことができます。

クラスは、その直接スーパークラスと直接スーパーインターフェイスから、クラス内のコードにアクセス可能であり、クラス内の宣言によって隠されていないスーパークラスとスーパーインターフェイスのすべての非プライベートフィールドを継承します。

スーパークラスのprivateフィールドは、サブクラスにアクセスできる場合があります。たとえば、両方のクラスが同じクラスのメンバーである場合です。それでも、privateフィールドがサブクラスに継承されることはありません。

于 2012-05-08T00:43:42.140 に答える
1

サブクラスが同じパッケージにある場合はプライベートメンバーも継承し、そうでない場合はパブリックメンバーと保護されたメンバーのみを継承します。

于 2016-08-08T14:12:32.070 に答える
0

プライベートメンバーも継承されます。これをテストするには、スーパークラスで次の操作を実行できます。

//...
private String myText = "I'm in the superclass";

private void setMyText(String myTextValue)
{
    this.myText = myTextValue;
}

public void setMyTextPublic(String myTextValue)
{
    setMyText(myTextValue);
}

public String getMyText()
{
    return myText;
}
//...

継承されたクラスにメソッドを作成します。

//...
public void setMyTextInTheSuperClass(String myTextValue)
{
    System.out.println(getMyText());
    setMyTextPublic(myTextValue);
    System.out.println(getMyText());
}

public void setConstantValueToMyText()
{
    setMyTextInTheSuperClass("I am in the child class");
}
//...

そして、どこかでsetConstantValueToMyTextを呼び出します。

于 2012-05-08T00:48:13.613 に答える