为什么我们可以创建一个接口实例变量尽管接口无法实例化?

时间:2015-01-11 07:14:24

标签: java

我有以下接口声明

public interface MyInterface {

    void do_it_now();
} 

我能做到

public class MainClass{

    public static void main(String[] args) {
        MyInterface mainClass = new MyInterface() {

            @Override
            public void do_it_now() {


            }
        };

    }

}

现在关于上述代码的问题是定义接口无法实例化 我们被允许在java中有一个实例变量Type of Interface。 new MyInterface()行的含义是什么。

我想知道最新情况。

我的问题也越来越post。但答案对我来说并不十分令人满意。

如果您发现我的问题愚蠢,请不要提供负面反馈或阻止我的帐户发表评论我会删除它。

3 个答案:

答案 0 :(得分:1)

能够拥有接口类型的变量允许您为该变量分配实现该接口的任何类的实例。然后,您可以使用该变量来执行该实例的接口方法,而无需关心所使用的特定实现。它使您的代码更加通用,因为您可以切换到接口的不同实现,而无需更改使用接口类型变量的代码。

答案 1 :(得分:1)

你正在制作一个" Anonymous Class"在第二个代码块中。这意味着它创建了一个实现您编写的接口或类的类。它基本上是制作实现接口的子类(MyInterface)

的简写

答案 2 :(得分:0)

  

我想知道最新情况。

考虑下面的代码,假设您的问题中定义了接口MyInterface

定义了两个内部类;第一个类是匿名的(没有名字),第二个类名为MyClass。这两个类implements MyInterface。

中的每一个
// declare variable of type MyInterface
MyInterface myVariable;

// assign the variable to an instance of anonymous class that implements MyInterface
myVariable = new MyInterface() { 
    @Override
    public void do_it_now() {
    }
};

// define a named class that implements MyInterface
class MyClass implements MyInterface { 
    @Override
    public void do_it_now() {
    }
}

// assign the variable to an instance of named class that implements MyInterface
myVariable = new MyClass();

发生了什么,java编译器将new MyInterface() {...};编译成一个名为$1.class的单独类文件,就像它将MyClass编译成一个单独的类文件,其名称为MyClass$1.class