【问题标题】:Would this implementation be called as anonymous class?这个实现会被称为匿名类吗?
【发布时间】:2017-09-27 02:31:51
【问题描述】:

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

public class Test {
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                System.out.println("##");
            }
        }.start();
    }
}

我感到困惑的原因是因为匿名类没有名称,但这显然我们已经在 J​​ava API 中有一个“线程”类,所以这意味着它有一个名称,如果它有一个名称那么它怎么能是一个匿名类,如果它不是一个匿名类,那么它是什么。

我知道这有点傻,但我无法确定性地推理自己,因为我看到双方都有有效的论据。

另外,在上面我可以清楚地覆盖Thread 类的run 方法,现在如果我创建自己的类,比如说MyClass,在其中定义一些方法,然后尝试做与上面相同的事情为什么我不能覆盖 MyClass 的方法,它们是我能够覆盖 Thread 类的 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
        };
    }
}

【问题讨论】:

  • 是的,它是匿名的。它是一个扩展线程的类,所以它没有名字。
  • 您的第二个问题(并且您的问题不应包含一个以上的真实问题)不清楚。你谈论 MyClass——但你没有表现出来!您要覆盖哪些方法?它甚至有public void start() 方法吗?请澄清。
  • @HovercraftFullOfEels 这就是我真的搞砸了并且无法推理的地方,如果已经有一个类并且这只是类的扩展,那么它是如何“匿名类”的?另外,关于覆盖方法的第二个问题呢?
  • 它是 NOT Thread 类。它是从 Thread 扩展而来的类。除了内联变量之外,您不能创建此类的变量。
  • MyClass 没有启动方法,因此您的代码没有意义。

标签: java inner-classes anonymous-class anonymous-inner-class


【解决方案1】:
  1. 是的,您的第一个类是匿名的,因为它是内联的并且从 Thread 扩展而来。它与您的 Thread 类不同。
  2. 关于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 是一个常见的例子,但你上面的例子不是“接口的基本实现”。

【讨论】:

  • 好的,谢谢你的回复,纠正我的理解——使用匿名类我可以在运行时创建一个全新的类(基本上是接口的实现),我也可以扩展一个现有的类还会被称为“匿名类”吗?
  • @pjj:见上面的编辑。您的问题表明您可能想研究这个主题和其他一些主题,包括任何像样的 Java 教科书中的接口。请注意,当我第一次学习 Java 时,我买了一堆书,其中很多是第二手的,我不后悔这样做。
  • 我想我已经解决了我的困惑,只是我的解释很糟糕,但这是另一个尝试 - “使用匿名类我不仅可以在运行时实现接口,还可以在运行时”。
  • 我刚刚阅读了您的编辑,是的,我在这里展示的不是“实现接口”,但我的观点更笼统。
  • @pjj:请看anonymous classes
【解决方案2】:

公共类线程扩展对象实现可运行

所以你基本上是在创建 Class Thread 的匿名类,但是因为 Thread Class implements Runnable (这是具有一个抽象方法的功能接口)-> 然后你必须使用来自 @ 的 @override run() 方法987654325@

【讨论】:

  • 感谢您抽出宝贵时间回复好友,但很快我将接受“Hovercraft Full Of Eels”的回答。
  • @pjj 没关系,我希望我能帮上一点忙 :)
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多