可能重复:
面试:我们可以实例化抽象类吗?
我有一个定义了所有方法的抽象类(即其中没有包含任何抽象方法),如下所示:
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());
}
}
和内部类有关系吗?
您正在使用该代码创建一个匿名内部类。您这样创建的类隐式扩展了MyAbstractClass
。
由于您的abstract
类没有abstract
方法,所以您不必提供实现,因此这是可行的。
如果您不知道内部类,可以查看官方文档,我认为这是相当不错的。
我知道类和抽象类的主要区别是,抽象类不能被实例化, 但是我可以为抽象类创建对象 我用新的关键字创建了抽象的对象 我有一些问题在 Inet 上没有正确的答案, new关键字是否用于实例类? 2)实例只不过是对象吗? 3)mEarth被称为物体(地球的实例)吗? 现在我可以调用任何方法(作为回调或作为值返回)mearth . sand();mearth . land();使用地球物体
我正在学习OOP的概念。在阅读继承的过程中,我了解到在初始化子类之前必须先初始化超类,即所有超类的构造函数必须在子类构造函数之前运行。此外,我们还可以直接创建超级类的实例。对于例如。 现在,我遇到了抽象类。看来我们不能实例化一个抽象类。要使用抽象类,您必须从另一个类继承它,并为其中的抽象方法提供实现。 我的问题是,在实例化具体子类的同时,抽象超类的构造函数会在具体子类的构造函数之前被调用。如果是这
问题内容: 我有以下代码: 实际上,它可以像人们期望的那样进行编译和工作。但是,如果将返回类型设为相同,则不会编译,因为预期的“名称冲突:method(Pair)和method(Pair)具有相同的擦除” 鉴于返回类型不是方法签名的一部分,这种重载怎么可能? 问题答案: 考虑以下4种方法 根据当前的Java语言规范, m1和m2无法共存,m3和m4也不能共存。因为它们具有相同的参数类型。 M1和M
问题内容: 我明白: 由于抽象类本身并不是什么,例如车辆,我们想要创建一个具体实现的对象,例如Car,Bike等。 对象链期间将调用抽象类的构造函数。 我们永远不能直接创建抽象类的对象,即使它包含构造函数并且所有方法都已实现。 但是从编译器的角度来看,Java为什么要强制执行这些规则? 问题答案: 这不是技术限制,而是(如您所指出的)逻辑上的限制。Java(和许多其他语言)执行各种规则不是因为它们
我知道抽象类不能被实例化,但在这段代码中被混淆了。这个代码到底是什么意思?
问题内容: 我知道,除了使用匿名类方法外,我们无法在Java中实例化接口或抽象类,但其背后的 原因 是什么? 问题答案: 您无法实例化接口或抽象类,因为它会违背面向对象的模型。 接口代表合同-接口实现者将能够做所有这些事情,履行合同的承诺。 抽象类是类似的想法,因为它们表示未履行的合同,是能够做事的承诺,除了与接口不同的是,它们定义了一些功能或字段,但需要在使用前进行填写。 简而言之,在一个好的面