这很好用。
package abstracttest;
public abstract class AbstractClass implements NewInter {
public abstract void doStuff();
public void doStuff2() {
System.out.println("in doStuff2");
}
/*
* public static void main(String a[]) { AbstractClass ab = new
* AbstractClass() {
*
* @Override public void doStuff() { // TODO Auto-generated method stub
* System.out.println(" doStuff "); }
*
* @Override public void doInter() { // TODO Auto-generated method stub
*
* } };
*
* ab.doStuff2(); ab.doStuff();
*
* NewInter ni = new NewInter() {
*
* @Override public void doInter() { // TODO Auto-generated method stub
* System.out.println("do Inter"); }
*
* }; ni.doInter();
*
* AbstractClass ab1 = new AbstractClass(); }
*/
}
interface NewInter {
String con = "Hell";
void doInter();
}
class Impl extends AbstractClass {
@Override
public void doInter() {
// TODO Auto-generated method stub
}
@Override
public void doStuff() {
// TODO Auto-generated method stub
}
public static void main(String[] s) {
AbstractClass ab = new AbstractClass() {
@Override
public void doInter() { // TODO Auto-generated method stub
System.out.println("impl doInter");
}
@Override
public void doStuff() { // TODO Auto-generated method stub
System.out.println("impl doStuff");
}
};
ab.doInter();
ab.doStuff();
NewInter ni1 = new NewInter() {
@Override
public void doInter() {
// TODO Auto-generated method stub
}
};
ni1.doInter();
}
}
我能够从抽象类“abstract class
”和interface
中实例化main()
和class Impl
。
这怎么可能?
我期待一个例外,但调用工作正常
有人可以解释一下这种现象吗?我很困惑。
Java抽象类也无法实例化,但如果存在main(),则可以调用它。
我在blog中读到了这个内容。这是什么意思?
还有其他方法可以调用抽象类的构造函数吗?如果有,请告诉我。
答案 0 :(得分:14)
不,你没有实例化它们。您只创建了实现接口或扩展抽象类的匿名类。这些匿名类类型的对象实际上是实例化的。
答案 1 :(得分:8)
如果我这样做:
new AbstractClass() {
public void methodToImplement() {
}
}
它正在从抽象类创建一个匿名类派生。它被称为(匿名),因为类定义没有它自己的可访问名称,您无法再次访问该定义。定义/实例化一起发生,例如。
AbstractClass ac = new AbstractClass() {
...
}
(它是AbstractClass
的子类)
请注意,您可以对接口和抽象类执行此操作,但您必须适当地实现所需的方法。
以上内容通常用于以简洁的形式实现简单的接口/抽象类,通常作为回调中的内部类。有关详细信息,请参阅this SO question;有关详细讨论,请参阅Nested Class tutorial。