0

私は Java を初めて使用し、継承の基礎となる基本概念を理解しています。スーパークラスによる参照について質問があります。スーパークラスから継承された、またはインターフェイスを使用して実装されたクラスのメソッドは、スーパークラス参照 (インターフェイスまたはクラス) を介して参照できます。拡張と実装の両方がクラスに関与している場合、どのように機能しますか?

class A {
  void test() {
    System.out.println("One");
  }
}

interface J {
  void first();
}

// This class object can referenced using A like A a = new B()
class B extends A {
  // code    
}

// This class object can referenced using J like J j = new B()
class B implements J {
  // code
}

// my question is what happens in case of below which referencing for runtime polymorphism?
class B extends A implements J {
  // code 
}

コンパイルに失敗するもの:

Main.java:16: エラー: クラスが重複しています: B
クラス B は J を実装します {
^
Main.java:21: エラー: 重複クラス: B
クラス B を拡張し、A を実装して J {
^
2 エラー
4

2 に答える 2

0

スーパー クラス メソッドとインターフェイス メソッドを参照する場合、特に使用superしてそれらを呼び出す場合に、いくつかの違いが生じる可能性があります。次のインターフェイス/クラスを検討してください。

public interface MyIFace {
    void ifaceMethod1();
}


public class MyParentClass {
    void parentClassMethod1();
}

public class MyClass extends MyParentClass implements MyIFace {

    public void someChildMethod() {
        ifaceMethods(); // call the interface method
        parentClassMethod1(); // call the parent method just like you would another method. If you override it in here, this will call the overridden method
        super.parentClassMethod1(); // you can use for a parent class method. this will call the parent's version even if you override it in here
    }

    @Override
    public void ifaceMethod1() {
      // implementation
    }

}

public class AnExternalClass {
    MyParentClass c = new MyClass();
    c.parentClassMethod1(); // if MyClass overrides parentClassMethod1, this will call the MyClass version of the method since it uses the runtime type, not the static compile time type
}

一般に、メソッドを呼び出さずにメソッドをsuper呼び出すと、クラスのランタイム バージョンによって実装されたメソッドが呼び出されます (メソッドがクラスまたはインターフェイスからのものであるかどうかに関係なく)。

于 2013-08-24T16:10:07.763 に答える
0

extends と Implements の両方がクラスに関係している場合、どのように機能しますか?

それがあなたの質問であると仮定します。

extendsキーワードは、スーパークラスを拡張するためのものです。

実装は、インターフェイスを実装するためのものです


インターフェースとスーパークラスの違いは、インターフェースでは全体の特定の実装を指定できないことです(その「インターフェース」のみ-インターフェースはインスタンス化できず、実装されます)。したがって、これは、必要なメソッドのみを指定できることを意味します組み込むことはできますが、同じ意味でプロジェクトに実装することはできません。

于 2013-08-24T16:09:23.263 に答える