0

重複の可能性:
インタビュー: 抽象クラスをインスタンス化できますか?

次のように、すべてのメソッドが定義された抽象クラスがあります (つまり、抽象メソッドが含まれていません)。

public abstract class MyAbstractClass {
  String s;
  public void setString(String s) {
    this.s = s;
  }
  public String getString() {
    return this.s;
  }
}

JUnit テスト クラスもあります。

public class TestClass {

  MyAbstractClass c;
  @Before
  public void setUp() {
    // What is happening here? And why does this work with an abstract class?
    // Instantiation? Extending the abstract class? Overwriting?
    c = new MyAbstractClass() { };
    // This will not work: (Why?)
    // c = new MyAbstractClass();
  }

  @Test
  public void test_AllMethodsAvailable() {
    // Why can I access the abstract class' methods?
    // Shouldn't they be overwritten? Or did I extend the class?
    c.setString("Test");
    assertEquals("Test", c.getString());
  }
}

c最初のケースでは割り当てが機能するのに 2 番目のケースでは機能しない理由、またはそこで実際に何が起こっているのか (結果として、抽象クラスのメソッドへのアクセスがテストで機能する理由) がよくわかりません。

誰かが説明してくれませんか (そして、なぜこれが機能するのかを説明する Javadoc、記事、または本を教えてください)。

そこで抽象クラスを「インスタンス化」できるのはなぜですか? (それは実際に私がしていることですか?)

内部クラスと関係がありますか?

4

4 に答える 4

2

そのコードで匿名の内部クラスを作成しています。この方法で作成したクラスは暗黙的に拡張されMyAbstractClassます。

abstractクラスにはabstractメソッドがないため、実装を提供する必要がないため、これは機能します。

内部クラスについて知らない場合は、公式ドキュメントを確認できます。これは非常に優れていると思います。

于 2013-01-28T12:32:08.910 に答える
1

内部クラスと関係がありますか?

 c = new MyAbstractClass() { };

絶対に、上記は匿名の内部クラス宣言です。ここでは実際には抽象クラスをインスタンス化していませんが(できません)、実際には匿名の内部クラスを作成しています( a sub-type of MyAbstractClass)

于 2013-01-28T12:33:21.837 に答える
0

MyAbstractClassを匿名の非抽象クラスでサブクラス化しているため、cへの割り当ては機能します。cは非抽象クラスのインスタンスです。

抽象クラスには抽象メソッドがないため、匿名クラスは何も実装する必要はありません。

于 2013-01-28T12:34:42.680 に答える
0

を書くとき、実際には を拡張し、抽象的ではないc = new MyAbstractClass() { };無名クラスを作成します。すでにすべてのメソッドが定義されているため、インスタンス化は有効ですMyAbstractClassMyAbstractClass

于 2013-01-28T12:33:29.513 に答える