这个实现是否会被称为匿名类?

时间:2017-04-28 21:37:07

标签: 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();
    }
}

我感到困惑的原因是因为匿名类没有名称,但是这显然我们已经在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
        };
    }
}

2 个答案:

答案 0 :(得分:5)

  1. 是的,您的第一个类是匿名的,因为它是内联的并且从Thread扩展。它与Thread类不同。
  2. 关于MyClass:当然,您无法扩展私有方法。这与匿名类无关,是基本的Java继承规则。公开它们,你可以内联扩展它们。
  3. 为了澄清,如果你有一个具有名称的嵌套类,你可以声明一个类型的变量:

    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)

public class Thread extends Object实现Runnable

所以你基本上创建了类<div class="container"> <img class="icon" src="http://placehold.it/350x350" /> <div class="sum-container left"> <img src="http://placehold.it/350x150" /> </div> </div>的匿名类,但是因为ThreadThread(这是一个具有一个抽象方法的功能接口) - &gt;然后,您必须使用来自implements Runnable

@override run()方法