Animal D = new Animal("Leo") {
@Override public void makeNoise() {
System.out.println("Roar!");
}
};
D.makeNoise();
所以,当我问这个和平的蓝色世界是什么时,我被告知这是一个匿名的课程。然后,我查找相关材料,并了解它们是没有名称的类,只使用一次。如果是这样的话,什么是D?为什么匿名类在这里有一个名字'D'?
其次,匿名类必须扩展一些其他类(不管是宇宙对象本身)吗?
在我的原始代码中,Animal实际上是一个抽象类。这个匿名课与Animal有什么关系?它是否扩展了Animal抽象类?
答案 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