你能告诉我怎么样?
答案 0 :(得分:5)
这是一个棘手的问题。
不,你无法实例化接口或抽象类。
但是,您可以实例化一个匿名类,该类在不定义类对象的情况下实现/扩展接口或抽象类。但它只是定义一个完全命名的类的捷径。
所以我从技术上说你的回答是正确的。
答案 1 :(得分:3)
我不知道什么是“接口和抽象类的实例化”。 我认为这是一种不准确,不正确的表达方式, 我们只能猜测它的意思。
您无法在Java中创建接口或抽象类的实例。
但是您可以创建实现接口或抽象类的匿名类。 这些不是接口或抽象类的实例。 它们将是匿名类的实例。
这是一个来自Iterator接口的示例迭代器,它为您提供了“不真实”的无限:
new Iterator<String>() {
@Override
public boolean hasNext() {
return true;
}
@Override
public String next() {
return "not really";
}
};
或者包含5“不是真的”的时髦AbstractList
:
List<String> list = new AbstractList<String>() {
@Override
public int size() {
return 5;
}
@Override
public String get(int index) {
return "yes";
}
};
答案 2 :(得分:0)
假设您有一个抽象类:MyAbstractClass
,带有抽象的void方法myAbstractMethod
。然后你可以通过这段代码创建这个类的“实例”:
MyAbstractClass myAbstractClassInstance = new MyAbstractClass() {
public void myAbstractMethod() {
// add abstract method implementation here
}
};
在这种情况下, myAbstractClassInstance
会扩展您的MyAbstractClass
。当您实例化此类时,您必须实现所有抽象方法,如上面的代码所示。
同样适用于接口,假设你的接口MyInterface
里面有一个void方法myInterfaceMethod
,那么你可以通过这个代码创建一个“实例”(这个实例的实现): / p>
MyInterface myInterfaceImpl = new MyInterface() {
public void myInterfaceMethod() {
// add method implementation here
}
}
在这种情况下, myInterfaceImpl
是MyInterface
的实现。使用interface创建对象时,必须实现上面显示的接口方法。
答案 3 :(得分:0)
您无法使用new
运算符创建抽象类或接口的实例。例如,
new AbstractSet(); // That's wrong.
但是,您可以使用它们来声明引用变量。例如,您可以这样做:
AbstractSet set;
您可以实例化匿名以及声明的实现类或子类。
例如,Set
扩展了AbstractSet
,因此您可以实例化Set
。
答案 4 :(得分:0)
界面:
interface Interface1 {
public void m1();
}
当你没错的时候
new Interface1() {
public void m1() {
}
}
它实际上并没有创建Interface的实例。它创建了一个没有任何名称/引用的子类型的实例。因此,我们无法创建接口或抽象类的实例
答案 5 :(得分:0)
是的,我们可以通过在实例化过程中动态定义抽象方法或接口方法来创建。这就像一个命名的匿名类。
//interface
Runnable r = new Runnable(){
public void run() {
System.out.println("Here we go");
}
};
//Abstract class
abstract class MyAbstract {
abstract void run();
}
MyAbstract ab = new MyAbstract(){
@Override
void run() {
System.out.println("Here we go");
}};