Can an abstract class be instantiated?
1 2 3 4 5 6 7 8 9 10 11 12
| abstract class A {
public void disp () {
System. out. print("Abstract");
}
}
public class B {
public static void main (String args []) {
A object = new A (){ };
object. disp();
}
} |
我知道抽象类不能被实例化,但是在这段代码中很困惑。实际上,这段代码是什么意思?
- 这个明显重复的问题获得了13票的赞成票,这让我很难过。
这里的微妙之处在""中。它意味着您显式地为抽象类A的缺失部分(缺失部分是抽象方法)提供匿名实现,允许您实例化它。
但是在A中没有抽象方法,因此匿名实现是空的。
使用至少一个抽象方法显示行为的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public abstract class A {
public abstract void bar ();
public void disp () { System. out. print("Abstract"); }
}
public class B {
public static void main (String args []) {
A object = new A () {
@Override public void bar () { System. out. print("bar"); }
};
object. disp(); //prints"Abstract"
object. bar(); //prints"bar"
}
} |
- 我不能决定这是否是一个"酷"的东西,Java没有C’;对于Java来说,它不是原来的代表和事件。
- 是否有理由将类A声明为抽象的,即使其中没有任何抽象方法(如op问题的示例中所示)?为什么不从类A的声明中移除"abstract"限定符呢?
- @Brandin-也许你想要一个带有一些不应该实例化的非抽象方法的基类?比如说,由Triangle和Square等继承的Shape类,有一个共享方法getLocation()但是你永远不希望有人提出Shape的实例。它的存在只是为了继承。
- @对于我来说,没有抽象方法的抽象类也是没有意义的。拥有这样一个阶级(如达沃提出的Shape)与OOP哲学相矛盾。
- @布兰登-嘿,我不是说这很聪明。只是提出一个可能的原因。
- 我发现你是一个C++程序员?这是C++中的情况,因为没有纯抽象函数的抽象类,这实际上是使类抽象的唯一方法。像Java或C语言这样的语言有EDCOX1×6的关键字来显式地声明一个类是抽象的,不管它是否有需要在子类中重写的东西。
- "DarrelHoffman nope,我是一个Java程序员:-"并且我很遗憾Java(或C.*)允许没有抽象方法的抽象类。
这称为匿名内部类。您不是在实例化抽象类,而是在实例化扩展抽象类的具体匿名内部类。当然,为了允许这样做,匿名内部类必须为抽象超类的所有抽象成员提供实现…在本例中是这样做的,因为抽象超类没有抽象成员。