我有一个抽象类,其所有方法都已定义(即,其中不包含抽象方法),如下所示:
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,文章或书籍,解释为什么这有效)?
为什么我可以在那里“实例化”一个抽象类? (这实际上是我在做什么吗?)
与内部类有关吗?
答案 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是非抽象类的实例。
由于您的抽象类中没有任何抽象方法,因此您的匿名类不必实现任何操作。