Java 这个实现会被称为匿名类吗?

Java 这个实现会被称为匿名类吗?,java,inner-classes,anonymous-class,anonymous-inner-class,Java,Inner Classes,Anonymous Class,Anonymous Inner Class,我已经看过很多次了,但我有点困惑,这是否会被称为匿名类 public class Test { public static void main(String[] args) { new Thread(){ @Override public void run() { System.out.println("##"); } }.start(); }

我已经看过很多次了,但我有点困惑,这是否会被称为匿名类

public class Test {
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                System.out.println("##");
            }
        }.start();
    }
}
我感到困惑的原因是匿名类没有名称,但很明显,我们在JavaAPI中已经有了一个“线程”类,所以这意味着它有一个名称,如果它有名称,那么它怎么可能是匿名类,如果它不是匿名类,那么它是什么

我知道这有点傻,但我无法以确定性的方式说服自己,因为我看到了双方的有效论点

另外,在上面我可以清楚地覆盖
Thread
类的
run
方法,现在如果我创建自己的类,比如说
MyClass
,在其中定义一些方法,然后尝试做与上面相同的事情,那么为什么我不能覆盖
MyClass
的方法,它们使我能够重写
线程
类的
运行
方法

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
        };
    }
}
  • 是的,您的第一个类是匿名的,因为它是内联的,并且是从线程扩展的。它与线程类不同
  • 关于
    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?
    }
    

    旁白:您应该几乎不扩展线程,而是实现Runnable,或者更好地使用executors来帮助您执行线程


    关于:


    好的,谢谢你的回复,请纠正我的理解-使用匿名类,我可以在运行时创建一个全新的类(基本上是接口的实现),也可以扩展一个现有的类,它仍然被称为“匿名类”

    是的,您确实创建了一个全新的类,但不一定实现接口。事实上,上面的示例与接口没有直接关系,而是与扩展现有的具体类有关。您可以并且经常创建实现接口的匿名类,Runnable是一个常见的示例,但您上面的示例并不是“基本上实现接口”。

    公共类线程扩展对象实现Runnable
    所以你基本上是在创建类
    Thread
    的匿名类,但是因为
    Thread
    实现了Runnable
    (这是一个有一个抽象方法的函数接口)->你必须
    @override run()
    方法,它来自
    Runnable接口

    是的,它是匿名的。它是一个扩展线程的类,因此它没有名称。您的第二个问题(并且您的问题不应包含多个真实问题)不清楚。你谈论我的班级,但你没有表现出来!您试图覆盖哪些方法?它甚至有一个
    public void start()
    方法吗?请澄清一下,这就是我真正搞砸的地方,我无法推理,如果已经有一个类,而这只是类的一个扩展,那么它是如何“匿名类”的呢?还有,关于重写方法的第二个问题呢?它不是Thread类。它是一个从Thread扩展而来的类。除了内联类,您无法创建此类的变量。MyClass没有start方法,因此您的代码没有意义。好的,谢谢您的回答,请更正我的理解-使用匿名类,我可以在运行时创建一个全新的类(基本上是接口的实现),此外,我还可以扩展一个现有的类,该类仍然称为“匿名类”?@pjj:请参见上面的编辑。您的问题表明,您可能希望学习本主题和其他一些主题,包括任何像样的Java教科书中都有哪些接口。请注意,当我第一次学习Java时,我买了一大堆书,其中许多是二手书,我并不后悔这样做。我想我已经澄清了我的困惑,只是我不擅长解释,但这里有另一个尝试——“使用匿名类,我不仅可以在运行时实现接口,还可以在运行时扩展类”。我刚刚读了你的编辑,是的,我在这里展示的不是“实现接口”,而是更一般的观点。@pjj:请看一看,谢谢你花时间回复,伙计,但很快我将接受“满是鳗鱼的气垫船”的回答。@pjj不麻烦,我希望我能帮上一点忙:)