抽象类的对象是匿名内部类吗?

时间:2013-07-22 12:21:51

标签: java

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

AbstractClass abstractClass = new AbstractClass() {

          @Override
          public void abstractMethod() {
          }
        };

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

6 个答案:

答案 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是在作为匿名类创建的子类中实现的。 aAnonymous类型的引用变量,即匿名类的超类。所以语句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