我们可以借助Java中的匿名类创建接口和抽象类的实例化吗?

时间:2015-08-29 15:54:52

标签: java instantiation

我去看了一个采访。采访者问我是否可以实例化一个接口和抽象类?据我所知,我说“不”。但他说“是的,我们可以借助匿名课程”。

你能告诉我怎么样?

6 个答案:

答案 0 :(得分:5)

这是一个棘手的问题。

不,你无法实例化接口或抽象类。

但是,您可以实例化一个匿名类,该类在不定义类对象的情况下实现/扩展接口或抽象类。但它只是定义一个完全命名的类的捷径。

所以我从技术上说你的回答是正确的。

答案 1 :(得分:3)

我不知道什么是“接口和抽象类的实例化”。 我认为这是一种不准确,不正确的表达方式, 我们只能猜测它的意思。

您无法在Java中创建接口或抽象类的实例。

但是您可以创建实现接口或抽象类的匿名类。 这些不是接口或抽象类的实例。 它们将是匿名类的实例。

这是一个来自Iterator接口的示例迭代器,它为您提供了“不真实”的无限:

new Iterator<String>() {
    @Override
    public boolean hasNext() {
        return true;
    }

    @Override
    public String next() {
        return "not really";
    }
};

或者包含5“不是真的”的时髦AbstractList

    List<String> list = new AbstractList<String>() {
        @Override
        public int size() {
            return 5;
        }

        @Override
        public String get(int index) {
            return "yes";
        }
    };

答案 2 :(得分:0)

假设您有一个抽象类:MyAbstractClass,带有抽象的void方法myAbstractMethod。然后你可以通过这段代码创建这个类的“实例”:

MyAbstractClass myAbstractClassInstance = new MyAbstractClass() {

    public void myAbstractMethod() {
        // add abstract method implementation here

    }

};
在这种情况下,

myAbstractClassInstance会扩展您的MyAbstractClass。当您实例化此类时,您必须实现所有抽象方法,如上面的代码所示。

同样适用于接口,假设你的接口MyInterface里面有一个void方法myInterfaceMethod,那么你可以通过这个代码创建一个“实例”(这个实例的实现): / p>

MyInterface myInterfaceImpl = new MyInterface() {

    public void myInterfaceMethod() {
       // add method implementation here

    }

}
在这种情况下,

myInterfaceImplMyInterface的实现。使用interface创建对象时,必须实现上面显示的接口方法。

答案 3 :(得分:0)

您无法使用new运算符创建抽象类或接口的实例。例如,

new AbstractSet(); // That's wrong.

但是,您可以使用它们来声明引用变量。例如,您可以这样做:

AbstractSet set;

您可以实例化匿名以及声明的实现类或子类。

例如,Set扩展了AbstractSet,因此您可以实例化Set

答案 4 :(得分:0)

界面:

interface Interface1 {

public void m1();

}

当你没错的时候

new Interface1() { 

  public void m1() {

   }

}

它实际上并没有创建Interface的实例。它创建了一个没有任何名称/引用的子类型的实例。因此,我们无法创建接口或抽象类的实例

答案 5 :(得分:0)

是的,我们可以通过在实例化过程中动态定义抽象方法或接口方法来创建。这就像一个命名的匿名类。

//interface
Runnable r = new Runnable(){
    public void run() {
        System.out.println("Here we go");
    }
};

//Abstract class    
abstract class MyAbstract {
    abstract void run();
}

MyAbstract ab = new MyAbstract(){

    @Override
    void run() {
        System.out.println("Here we go");
    }};