在Java中实例化抽象类:为什么这样做?

时间:2013-01-28 12:31:31

标签: java abstract extend inner-classes

  

可能重复:
  Interview : Can we instantiate abstract class?

我有一个抽象类,其所有方法都已定义(即,其中不包含抽象方法),如下所示:

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的赋值在第一种情况下有效但在第二种情况下不起作用,或者在那里实际发生了什么(因此,为什么访问抽象类'方法在考试)。

有人可以解释一下(并可能指向一个Javadoc,文章或书籍,解释为什么这有效)?

为什么我可以在那里“实例化”一个抽象类? (这实际上是我在做什么吗?)

与内部类有关吗?

4 个答案:

答案 0 :(得分:2)

您正在使用该代码创建 匿名内部类 。您以这种方式创建的类隐式扩展MyAbstractClass

由于您的abstract类没有abstract方法,因此您无需提供实施,因此可以使用。

如果您不了解内部课程,可以查看official documentation,我觉得这很好。

答案 1 :(得分:1)

  

与内部类有关吗?

 c = new MyAbstractClass() { };

当然,上面是匿名内部类声明,你实际上并没有在这里实例化一个抽象类(你不能),但实际上你正在创建一个匿名内部类a sub-type of MyAbstractClass

答案 2 :(得分:0)

当你编写c = new MyAbstractClass() { };时,你实际上创建了一个扩展MyAbstractClass的匿名类,它不是抽象的。由于MyAbstractClass已经定义了所有方法,因此实例化是有效的。

答案 3 :(得分:0)

您对c的赋值是有效的,因为您使用匿名非抽象类继承MyAbstractClass,c是非抽象类的实例。

由于您的抽象类中没有任何抽象方法,因此您的匿名类不必实现任何操作。