0

今日の comp sci レクチャーで継承について説明し、他のクラスからのメソッドへのアクセスについて話しました。私のクラスメートの 1 人が、サブサブクラスが最上位の親クラスのメソッドにアクセスする方法を尋ねました。私の教授も同様に興味があり、次のようなことを提案しました。

super.super.toString();

機能する可能性がありますが、機能しません。好奇心旺盛で、自分でこれを理解しようとしたところ、次のようになりました。

public class A {
    public static void main(String[] args){
        B b = new B();
        C c = new C();

        System.out.println(b.toString());
        System.out.println(c.toString());
    }

    public String toString(){
        return "Class A";
    }
}

class B extends A {
    public String toString(){
        return "Class B";
    }
}

class C extends B {
    public String toString(){
        return A.class.toString();
    }
}

これはうまくいきましたが、さまざまなことをテストしているときに、これに出くわしました:(これはすべてクラスCで行われます)

super.toString();

次と同じことをしているようです:

B.class.toString();

私の質問は、2つに違いがあるのですか、それともまったく同じですか? また、この上の私のコードでは、サブサブクラスからメソッドを呼び出す適切な方法ですか?

4

4 に答える 4

3

いいえ、クラスのメソッドB.class.toString()を呼び出します。それは、 を呼び出すことと少しでも同じではありません。toString()Classsuper.toString()

fromAの実装をバイパスして呼び出す方法はありません。基本的に、それはカプセル化を壊します。toString()CA

于 2013-03-01T19:59:58.477 に答える
3

いいえ、それらは同じものではありません。super.toString()クラスから呼び出していると仮定するとC、これはtoString()onを呼び出しB、「クラス B」を返します。

を呼び出すA.class.toString()B.class.toString()、スーパークラス メソッドをまったく呼び出していない場合は、toStringonを呼び出していClassます。

于 2013-03-01T20:00:11.067 に答える
3
class Parent{
   public void foo(){

   }
}


class Child extends Parent{

   @Override
   public void foo(){
       super.foo(); //will call the parent class foo method
   }
}

class ChildOfChild extends Child{

    public void bar(){
        super.foo(); //this actually is the method of the Parent that is actually called at the end as Child calls super.foo();
    }
}

super.toString();B.class.toString()全く違います。後で、クラスliteraltoString()のメソッドを呼び出しています。

例に示すように、サブサブクラスが階層で定義されたメソッドを呼び出す場合、どのメソッドが呼び出されるかは実装に依存します。直接の親がそのメソッドをオーバーライドsuper.method()して呼び出さない場合、それ (親の親のメソッド) を呼び出すことはできません。それが継承の仕組みです。

直接の親がメソッドをオーバーライドせず、サブサブクラスからメソッドを呼び出すと、直接の親の親のメソッドが呼び出されます。

于 2013-03-01T20:00:41.777 に答える
1

toString() 内の状態にアクセスしようとすると、自分がしていると思っていることをしていないことがすぐにわかります。

SomeClass.class は特別な構造です。 正確な定義については、http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2を参照してください。

Java は実際には、オブジェクトとオブジェクト指向パターンを適切に使用するように強制するように設計されているため、super.super を使用しないでください。親クラスの実装をスキップすることは許可されていないため、許可されていません。これは実際には、他のそれほど厳密でない言語と比較して Java に関する不満の 1 つですが、クラス階層と自分が何をしているのかを本当に考慮する必要があります。

于 2013-03-01T20:08:53.980 に答える