2

当我创建一个抽象类的对象时,我必须像接口一样这样做。

AbstractClass abstractClass = new AbstractClass() {

          @Override
          public void abstractMethod() {
          }
        };

这是否意味着对象AbstractClass是一个匿名的内部类对象?

4

6 回答 6

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.

于 2013-07-22T12:26:04.093 回答
1

对象不是类对象(在此上下文中)。它派生自一个类。在 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

于 2013-07-22T12:29:43.637 回答
0

吸引类的一个基本属性是不可能有这种类型的直接实例。只有实现类的完整接口的类才能被实例化。为了创建一个对象,你首先需要一个非抽象类,通过扩展抽象类。

于 2013-07-22T12:30:27.030 回答
0

抽象类没有任何实例(它的类型的对象)。为了清楚起见,我建议 Mavia 查看以下链接:http: //docs.oracle.com/javase/tutorial/java/IandI/abstract.html

于 2013-07-22T12:31:34.313 回答
0

实际上,您在这里创建了两个:一个匿名内部类,它扩展 AbstractClass了这个匿名类的一个实例,即对象。您没有也不能创建AbstractClass.

您还声明了一个名为abstractClassType的变量AbstractClass。在此变量中,您存储新定义的子类的新创建实例AbstractClass

编辑:您当然不能重用匿名内部类,因为它是匿名的,唯一可以创建或创建它的实例的地方就是here

可能是一个循环或函数,在这种情况下,您将能够创建此匿名内部类的许多实例。但它仍然只是创建实例的这段代码。

于 2013-07-22T12:31:54.207 回答
0

您不能创建抽象类的对象。它们是不可实例化的。当您这样做时,您正在做的是创建一种动态子类对象,并(同时)实例化它。或多或少,是的,您可以像创建界面一样创建它。有关更多信息,请参阅此答案

于 2013-07-22T12:40:30.193 回答