我已经看过很多次,但是我有点困惑这是否会被称为匿名类?
public class Test {
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
System.out.println("##");
}
}.start();
}
}
我感到困惑的原因是因为匿名类没有名称,但是这显然我们已经在Java API中有一个“Thread”类,所以这意味着它有一个名称,如果它有一个名称那么它怎么能是一个匿名类,如果它不是一个匿名类,那么它是什么。
我知道这有点愚蠢,但我无法推理自己的确定性 - 因为我看到双方都有有效的论据。
另外,在上面我可以清楚地覆盖run
类的Thread
方法,现在如果我创建自己的类,让我们说MyClass
,在其中定义一些方法,然后尝试做同样的事情然后为什么我不能覆盖MyClass
的方法,他们我可以覆盖run
类的Thread
方法。
public class MyClass {
private void myMethod1() {
}
private void myMethod2() {
}
}
public class Test {
public static void main(String[] args) {
new MyClass(){
// why I cannot override "myMethod1" and "myMethod1" of `MyClass`, they way I was able to override `run` method of `Thread` class
};
}
}
答案 0 :(得分:5)
MyClass
:当然,您无法扩展私有方法。这与匿名类无关,是基本的Java继承规则。公开它们,你可以内联扩展它们。为了澄清,如果你有一个具有名称的嵌套类,你可以声明一个类型的变量:
public class Test {
private static class MyThread extends Thread {
@Override
public void run() {
System.out.println("Foo");
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
}
}
但如果您有匿名课程,则无法执行此操作:
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
System.out.println("##");
}
}.start();
// how can you declare a variable of the above type *with* its behavior?
}
支持位:您应该从不扩展Thread,而是实现Runnable,甚至更好,使用执行程序来帮助您进行线程化。
重新:
好的,谢谢你的回复,根据我的理解纠正我 - 使用匿名类我可以在运行时创建一个全新的类(基本上是一个接口的实现),我也可以扩展一个现有的类,它仍然会被称为"匿名课"?
是的,您执行创建一个全新的类,但不一定不是您实现的接口。实际上,上面的示例与接口没有直接关系,而是与扩展现有的具体类有关。您可以并经常创建实现接口的匿名类,Runnable是一个常见示例,但上面的示例并非基本实现接口"。
答案 1 :(得分:2)
所以你基本上创建了类<div class="container">
<img class="icon" src="http://placehold.it/350x350" />
<div class="sum-container left">
<img src="http://placehold.it/350x150" />
</div>
</div>
的匿名类,但是因为Thread
类Thread
(这是一个具有一个抽象方法的功能接口) - &gt;然后,您必须使用来自implements Runnable
@override run()
方法