当我创建一个Abstract类的对象时,我必须像接口一样这样做。
AbstractClass abstractClass = new AbstractClass() {
@Override
public void abstractMethod() {
}
};
这是否意味着AbstractClass
的对象是一个匿名的内部类对象?
答案 0 :(得分:2)
AbstractClass abstractClass = new AbstractClass() {
@Override
public void abstractMethod() {
}
};
这段代码意味着您正在创建一个扩展AbstractClass
的匿名类。您也可以对接口使用相同的表示法。
SomeInterface someImplementingClass = new SomeInterface(){/*some code here*/};
这意味着您正在创建一个实现SomeInterface
的类。
请注意,在创建匿名类时存在一定的限制。由于匿名类已经扩展了父类型,因此无法扩展另一个类,因为在java中只能在类上扩展。
此代码将有助于理解匿名类中重写方法的概念
class Anonymous {
public void someMethod(){
System.out.println("This is from Anonymous");
}
}
class TestAnonymous{
// this is the reference of superclass
Anonymous a = new Anonymous(){ // anonymous class definition starts here
public void someMethod(){
System.out.println("This is in the subclass of Anonymous");
}
public void anotherMethod(){
System.out.println("This is in the another method from subclass that is not in suprerclass");
}
}; // and class ends here
public static void main(String [] args){
TestAnonymous ta = new TestAnonymous();
ta.a.someMethod();
// ta.a.anotherMethod(); commented because this does not compile
// for the obvious reason that we are using the superclass reference and it
// cannot access the method in the subclass that is not in superclass
}
}
此输出
This is in the subclass of Anonymous
请记住,anotherMethod
是在作为匿名类创建的子类中实现的。 a
是Anonymous
类型的引用变量,即匿名类的超类。所以语句ta.a.anotherMethod();
给出了编译器错误,因为anotherMethod()
中没有Anonymous
。
答案 1 :(得分:1)
对象不是类对象(在此上下文中)。它来自一个类。在Java中,类和对象之间存在差异,与例如基于原型的语言(例如JavaScript),其中不存在这种差异。
在您的示例中,您将创建一个匿名类,创建该匿名类的对象并将其分配给变量;一步到位。
匿名类总是内部类:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5 http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.3
答案 2 :(得分:0)
吸引类的一个基本属性是可能没有这种类型的直接实例。只有实现类的完整接口的类才能被实例化。 为了创建一个对象,首先需要一个非抽象类,扩展抽象类。
答案 3 :(得分:0)
抽象类没有任何实例(它的类型对象)。我建议Mavia查看以下链接以获得清晰度: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
答案 4 :(得分:0)
实际上你在这里创建了两个:匿名内部类,扩展 AbstractClass
以及这个anonyomous类的实例,对象即可。您没有也无法创建AbstractClass
的实例。
此外,您还声明了一个名为abstractClass
的变量,其类型为AbstractClass
。在此变量中,您可以存储新创建的 新定义的子类 <{1}}的实例。
编辑:您当然可以不重复使用匿名内部类,因为它是匿名的,并且唯一可以创建它的实例或者 创建的地方是正确的这里即可。
这里可能是一个循环或函数,在这种情况下,您将能够创建此匿名内部类的许多实例。但它仍然只是创建实例的这段代码。
答案 5 :(得分:0)
您无法创建抽象类的对象。它们是不可实例化的。当你这样做时你正在做的是创建一种动态子类对象,并实例化那个(同时)。或多或少,是的,您可以像创建界面一样创建它。有关详细信息,请参阅this answer。