在匿名内部类中使用时,接口如何创建对象

时间:2018-08-07 06:19:23

标签: java constructor

明确指出接口没有构造函数。但是,当使用匿名内部类时,我们将创建一个接口对象并对其进行重写。如果接口中没有构造函数,那怎么可能。 例如,

interface A{
   void print();
}

class B{
   public static void main(String args[]){
       A a=new A(){
          void print(){
              System.out.println("Message");
          }
       };
   }
}

如果接口没有构造函数,那么A a = new A()怎么可能?

2 个答案:

答案 0 :(得分:2)

代码

interface A {
    void print();
}

class B {
    public static void main(String[] args) {
        A a = new A() {
            public void print() {
                System.out.println("Message");
            }
        };
    }
}

的简写
interface A {
    void print();
}

class B {
    public static void main(String[] args) {
        class B$1 extends java.lang.Object implements A {
            B$1() {
                super();
            }
            public void print() {
                System.out.println("Message");
            }
        }
        A a = new B$1();
    }
}

只有一个例外:如果显式声明了类B$1,则可以使用class C extends B$1从其扩展。但是,即使不是B$1(JLS§8.1.1.2),也无法从匿名类final扩展(JLS§8.1.4)。

也就是说,匿名类仍然是类。与所有类一样(java.lang.Object本身除外),即使这些类也直接或间接扩展了java.lang.Object。如果使用接口指定了匿名类,则它将扩展java.lang.Object并实现该接口。如果使用类指定了匿名类,则它将扩展该类。如果构造函数有参数,则将参数转发给super()

如果愿意,您甚至可以(尽管绝对不建议使用)稍后在A a2 = new B$1();中插入main()。但实际上,不要那样做,我只是提到它是为了说明幕后情况。

您可以通过将源代码放在单独的目录中(例如,放入AB.java,进行编译,然后

)来自己观察这一点。
  • 查看生成的类文件。
  • 使用javap -c B$1查看javac如何生成匿名类。

答案 1 :(得分:0)

每个类都有一个默认构造函数,如果您没有定义其他构造函数,则该默认构造函数为无参数构造函数。除非您定义其他构造函数,否则匿名类实现接口将自动生成该接口。