1

質問の言い方が正しいかどうかは正確にはわかりませんが、これらのコード行と混同しています。

public class First {
    public String name() {
        return "First";
    }
}

public class Second extends First {
    public void whoRules() {
        System.out.print(super.name() + " rules");
        System.out.println(" but " + name() + " is even better");
    }
    public String name() {
        return "Second";
    }
}

public class Third extends Second {
    public String name() {
        return "Third";
    }
}

Second varSecond = new Second();
Third varThird = new Third();
varSecond.whoRules();
varThird.whoRules();

上記を実行すると、出力されます

First rules but second is even better

First rules but third is even better

なぜそうではないでしょうか:

First rules but second is even better

Second rules but third is even better

サブクラスを別のクラスのスーパークラスにすることはできますか? または、1つ(スーパークラス)しか存在できませんか?(上記のコード例を使用)Firstが のスーパークラスであることは理解していますSecondSecond、 のスーパークラスThirdですか? それともFirstスーパークラスThirdですか?

互いに拡張する 10 個のクラスがある場合 (2 番目が最初に拡張し、3 番目が 2 番目に拡張するなど)、これらすべてのクラスのスーパークラスはFirst?)

4

4 に答える 4

3

そうではない理由: ... 「ルールは 2 番目ですが、ルール 3 の方が優れています」

super.name()クラス Second は、インスタンスのスーパークラスではなく、Second のスーパークラスを参照するためです。

Java 言語仕様から:フォーム super.Identifier は、現在のオブジェクトの Identifier という名前のフィールドを参照しますが、現在のオブジェクトは現在のクラスのスーパークラスのインスタンスとして表示されます。

サブクラスを別のクラスのスーパークラスにすることはできますか?

はい。

または、1つ(スーパークラス)しか存在できませんか?

各クラスは最大で 1 つの直接スーパークラスを持つことができ、そのスーパークラスなどを持つことができます。

(上記のコード例を使用) First は Second のスーパークラスですが、Second は Third のスーパークラスですか? それとも、First は Third のスーパークラスですか?

First と Second はどちらも Third のスーパークラスです。

Second はThirdの直接のスーパークラスです。

于 2013-05-02T03:44:56.093 に答える
-1

これは単純な継承です。First は Second のスーパー クラスで、Second は Third のスーパー クラスです。基本的に、クラス Third のオブジェクトを作成すると、クラス First と Second の両方である親クラスからすべての (非プライベート) プロパティを継承します。

First -> Second -> Third 

Super キーワード- 与えられた例では、サブクラス second のスーパー クラス First のメソッド name() をオーバーライドしています (サブクラスでスーパー クラス メソッドを実装しています)。キーワード super.name() を使用すると、name() を呼び出すことができますスーパークラスのメソッド。

そして、覚えておいてほしい最も重要なことは、

Java コンパイラは、オブジェクト型ではなく Reference 型に基づいてメソッドを呼び出します

あなたが言う時

varSecond.whoRules();

この場合、オブジェクト参照はクラス Second に属します

System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Second

しかし、あなたが言うとき

varThird.whoRules();

この場合、オブジェクト参照はクラス Third に属します

System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Third

name() メソッドがクラス Third で定義されているためです。クラス Third で name() メソッドを定義していない場合は、スーパー クラス メソッドが呼び出されます。

他の質問に答えると、継承の深さに厳密な制限はありませんが、通常、適切な設計では階層内に10個のスーパークラスは表示されません。

于 2013-05-02T04:31:32.513 に答える