这个实现会被称为匿名 class 吗?
Would this implementation be called as anonymous class?
我已经看过很多次了,但我有点困惑这是否会被称为匿名 class?
public class Test {
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
System.out.println("##");
}
}.start();
}
}
我感到困惑的原因是因为匿名 classes 没有名字,但这显然我们已经在 Java [=29] 中有一个 "Thread" class =],所以这意味着它有一个名字,如果它有名字那么它怎么可能是匿名的class,如果它不是匿名的class那么它是什么。
我知道这有点傻,但我无法确定自己的理由,因为我看到双方都有有效的论据。
此外,在上面我可以清楚地覆盖 Thread
class 的 run
方法,现在如果我创建自己的 class 让我们说 MyClass
,在其中定义一些方法,然后尝试做与上面相同的事情然后为什么我不能覆盖 MyClass
的方法,他们这样我能够覆盖 Thread
[=30 的 run
方法=].
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
};
}
}
- 是的,您的第一个 class 是匿名的,因为它是内联的并且从 Thread 扩展而来。它与您的线程不同 class.
- 关于
MyClass
:当然你不能扩展私有方法。这与匿名 classes 无关,是基本的 Java 继承规则。使它们 public 并且您可以内联扩展它们。
澄清一下,如果你有一个嵌套的 class 有一个名字,你可以声明一个它类型的变量:
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();
}
}
但是如果你有一个匿名的class,你不能这样做:
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,或者更好的是,使用执行器来帮助你进行线程处理。
回复:
Ok, thanks for your reply, correct me on my understanding - using anonymous class I can create a brand new class (basically implementation of an interface) at runtime, also I can extend an existing class and that would still be called as "anonymous class"?
是的,您确实创建了一个全新的class,但是您不一定要实现接口。事实上,您上面的示例与接口没有直接关系,而是与扩展现存的具体 class 有关。您 可以 并且经常创建实现接口的匿名 classes,Runnable 是一个常见的例子,但您上面的例子不是 "basically implementation of an interface".
public class 线程扩展对象实现 Runnable
所以你基本上是在创建 Class Thread
的匿名 class 但是因为 Thread
Class implements Runnable
(这是功能接口有一个抽象方法)-> 然后你必须使用来自 Runnable Interface
的 @override run()
方法
我已经看过很多次了,但我有点困惑这是否会被称为匿名 class?
public class Test {
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
System.out.println("##");
}
}.start();
}
}
我感到困惑的原因是因为匿名 classes 没有名字,但这显然我们已经在 Java [=29] 中有一个 "Thread" class =],所以这意味着它有一个名字,如果它有名字那么它怎么可能是匿名的class,如果它不是匿名的class那么它是什么。
我知道这有点傻,但我无法确定自己的理由,因为我看到双方都有有效的论据。
此外,在上面我可以清楚地覆盖 Thread
class 的 run
方法,现在如果我创建自己的 class 让我们说 MyClass
,在其中定义一些方法,然后尝试做与上面相同的事情然后为什么我不能覆盖 MyClass
的方法,他们这样我能够覆盖 Thread
[=30 的 run
方法=].
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
};
}
}
- 是的,您的第一个 class 是匿名的,因为它是内联的并且从 Thread 扩展而来。它与您的线程不同 class.
- 关于
MyClass
:当然你不能扩展私有方法。这与匿名 classes 无关,是基本的 Java 继承规则。使它们 public 并且您可以内联扩展它们。
澄清一下,如果你有一个嵌套的 class 有一个名字,你可以声明一个它类型的变量:
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();
}
}
但是如果你有一个匿名的class,你不能这样做:
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,或者更好的是,使用执行器来帮助你进行线程处理。
回复:
Ok, thanks for your reply, correct me on my understanding - using anonymous class I can create a brand new class (basically implementation of an interface) at runtime, also I can extend an existing class and that would still be called as "anonymous class"?
是的,您确实创建了一个全新的class,但是您不一定要实现接口。事实上,您上面的示例与接口没有直接关系,而是与扩展现存的具体 class 有关。您 可以 并且经常创建实现接口的匿名 classes,Runnable 是一个常见的例子,但您上面的例子不是 "basically implementation of an interface".
public class 线程扩展对象实现 Runnable
所以你基本上是在创建 Class Thread
的匿名 class 但是因为 Thread
Class implements Runnable
(这是功能接口有一个抽象方法)-> 然后你必须使用来自 Runnable Interface
@override run()
方法