当我创建一个抽象类的对象时,我必须像接口一样这样做。
AbstractClass abstractClass = new AbstractClass() {
@Override
public void abstractMethod() {
}
};
这是否意味着对象AbstractClass
是一个匿名的内部类对象?
当我创建一个抽象类的对象时,我必须像接口一样这样做。
AbstractClass abstractClass = new AbstractClass() {
@Override
public void abstractMethod() {
}
};
这是否意味着对象AbstractClass
是一个匿名的内部类对象?
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
.
对象不是类对象(在此上下文中)。它派生自一个类。在 Java 中,类和对象之间存在差异,与不存在这种差异的基于原型的语言(例如 JavaScript)相比。
在您的示例中,您创建了一个匿名类,创建该匿名类的一个对象并将其分配给一个变量;一步到位。
匿名类总是内部类: http: //docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5 http://docs.oracle.com/javase/规格/jls/se7/html/jls-8.html#jls-8.1.3
吸引类的一个基本属性是不可能有这种类型的直接实例。只有实现类的完整接口的类才能被实例化。为了创建一个对象,你首先需要一个非抽象类,通过扩展抽象类。
抽象类没有任何实例(它的类型的对象)。为了清楚起见,我建议 Mavia 查看以下链接:http: //docs.oracle.com/javase/tutorial/java/IandI/abstract.html
实际上,您在这里创建了两个:一个匿名内部类,它扩展 AbstractClass
了这个匿名类的一个实例,即对象。您没有也不能创建AbstractClass
.
您还声明了一个名为abstractClass
Type的变量AbstractClass
。在此变量中,您存储新定义的子类的新创建实例。AbstractClass
编辑:您当然不能重用匿名内部类,因为它是匿名的,唯一可以创建或创建它的实例的地方就是here。
这可能是一个循环或函数,在这种情况下,您将能够创建此匿名内部类的许多实例。但它仍然只是创建实例的这段代码。
您不能创建抽象类的对象。它们是不可实例化的。当您这样做时,您正在做的是创建一种动态子类对象,并(同时)实例化它。或多或少,是的,您可以像创建界面一样创建它。有关更多信息,请参阅此答案。