【问题标题】:This appears to create an object from an interface; how does it work?这似乎是从接口创建一个对象;它是如何工作的?
【发布时间】:2010-10-16 04:39:03
【问题描述】:
interface Int {
    public void show();
}

public class Test {     
    public static void main(String[] args) {
        Int t1 = new Int() {
            public void show() {
                System.out.println("message");
            }
        };

        t1.show();
    }
}

【问题讨论】:

    标签: java interface object


    【解决方案1】:

    您正在定义一个实现接口Int 的匿名类,并立即创建一个thatAnonymousClassYouJustMade 类型的对象。

    【讨论】:

    • 这对于事件处理程序(例如使用 ActionListener 接口的处理程序)非常有用。
    • 我不太确定,这当然是要受到惩罚的罪过。对我来说,这更多是一个观点问题。从代码作者的角度来看,他声明了一个字段,并且该字段有一个类型,在其名称之前给出。这是干净的恕我直言的解释。当de declare default method in interface 实际做某事时更加生动,我们将匿名类的主体完全留空,因此新对象的唯一功能来自接口的默认方法。我知道实际上创建了匿名类,但只是想知道上面给出的方法是否至少不能考虑
    【解决方案2】:

    这个符号是

    的简写
    Int t1 = new MyIntClass();
    
    // Plus this class declaration added to class Test
    private static class MyIntClass implements Int
        public void show() {
            System.out.println("message");
        }
    }
    

    所以最后你创建了一个具体类的实例,你内联定义了它的行为。

    您也可以使用抽象类来做到这一点,方法是为所有抽象方法提供内联实现。

    【讨论】:

      【解决方案3】:

      匿名内部类的这种特殊语法实际上是创建一个名为Test$1 的类。您可以在 Test 类旁边的类文件夹中找到该类文件,如果您打印了 t1.getClass().getName(),您也可以看到。

      【讨论】:

        【解决方案4】:

        我认为您的对象与界面无关。如果你注释掉整个界面,你仍然会得到相同的输出。它只是创建了匿名类。我认为,除非您使用“实现”类,否则您无法实现该接口。但是我不知道在您的情况下如何不会发生命名冲突。

        【讨论】:

        • 匿名类肯定实现了接口,t1 instanceof Int会是真的。
        猜你喜欢
        • 2011-10-04
        • 2021-12-26
        • 2020-08-23
        • 2010-10-11
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多