Java中的匿名类?

时间:2015-03-02 02:13:48

标签: java

Animal D = new Animal("Leo") {
                  @Override public void makeNoise() {
                        System.out.println("Roar!");
                  }
        };   
D.makeNoise();

所以,当我问这个和平的蓝色世界是什么时,我被告知这是一个匿名的课程。然后,我查找相关材料,并了解它们是没有名称的类,只使用一次。如果是这样的话,什么是D?为什么匿名类在这里有一个名字'D'?

其次,匿名类必须扩展一些其他类(不管是宇宙对象本身)吗?

在我的原始代码中,Animal实际上是一个抽象类。这个匿名课与Animal有什么关系?它是否扩展了Animal抽象类?

5 个答案:

答案 0 :(得分:2)

D是一个变量,表示符合(读取:"可分配给")动物的值/对象。

分配的实际对象是匿名类型的新实例,实际上是Animal的子类型

答案 1 :(得分:1)

  

如果是这样,D是什么?为什么匿名类有一个名字   ' d'这里吗?

这不是班级名称,而是匿名班级的变量/参考名称。

  

其次,匿名类必须扩展其他类   class(宇宙对象本身)?

是的,在Java中,所有类都从Object延伸。它还可以实现一个接口(当然除了扩展Object)。要实现的典型接口是Runnable

    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            // Does amazing stuff
        }
    };
  

这个匿名课与Animal有什么关系?它是否延伸?   动物抽象类?

是的,它会延伸Animal,这实际上意味着 Animal(检查polymorphism)。

答案 2 :(得分:0)

D是Animal的一个实例。它也是您的匿名类的一个实例。它也是Object的一个实例。这就是继承的工作原理。它也不应该资本化。使用d,您将符合风格指南。

这是您的继承链。您无法将其强制转换为匿名类,但这并不会阻止匿名类覆盖makeNoise()方法。

Object
   ^
   |
Animal
   ^
   |
This Anonymous Class

答案 3 :(得分:0)

该类实际上是一个扩展Animal的子类。括号内部是类的实现,表示makeNoise被覆盖。

对于第二个问题,是的,当你想要继承一个类并修改一些实现时,大多数情况下会发生匿名类,但你不想详细声明一个新类,因为它非常简短,或者只是方便

答案 4 :(得分:0)

是的,匿名类必须实现接口或扩展现有类。实际上,D不是动物本身;它属于Animal的子类型。

public class Main {
    public static void main(String[] args) {
        Object a = new Object() {
            @Override
            public String toString() {
                return "";
            }
        };
        System.out.println(a.getClass().toString());
        System.out.println(new Object().getClass().toString());
    }
}

此代码给出:

  

类Main $ 1

     

class java.lang.Object