这个实现会被称为匿名 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
        };
    }
}
  1. 是的,您的第一个 class 是匿名的,因为它是内联的并且从 Thread 扩展而来。它与您的线程不同 class.
  2. 关于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() 方法