我可以为接口创建一个对象吗?

问题描述 投票:0回答:8

是否可以为接口创建对象?如果是,是如何完成的? 根据我的观点,以下代码表明我们可以:

Runnable r = new Runnable() {
    // some implementation
}
java class oop instance
8个回答
20
投票

这不是创建Interface的实例,而是创建一个实现接口的类。所以当你写:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
};

您实际上是在创建一个实现 Runnable 接口的类。 你需要遵守这里的所有规则,在这里,我们重写

Runnable
的 run 方法。抽象类也有类似的事情。我们可以用一个例子来测试:

public abstract class AbstractClass {
    public void someMethod() {
        System.out.println("abstract class");
    }
}

和另一个类,即

TestClass

public class TestClass {
    public static void main(String[] args) {
        AbstractClass abstractClass = new AbstractClass() {
            public void someMethod() {
                System.out.println("concrete class method");
            }
        };
        abstractClass.someMethod();
    }
}

这将创建我们要重写的子类的实例

someMethod()
; 该程序打印:

concrete class method

这证明我们正在创建子类的实例。


13
投票

您不能直接实例化接口,但可以实例化实现该接口的类:

public class RunClass implements Runnable {
    // Class implementation
}

Runnable r = new RunClass();

这与您内联所做的基本相同。 new Runnable() 之后的括号将包含您的内联实现。


9
投票

您可以创建一个匿名内部类:

Runnable r = new Runnable() {
    @Override
    public void run() {
    }
};

因此,您创建一个新的

class
来实现给定的
interface


8
投票

是否可以为接口创建对象?

不。您显示的代码从“匿名类”创建一个对象,该类实现了该接口。在幕后,JVM 实际上创建一个实现该接口的类,然后创建该类的实例。

生成的“匿名”类

实际上有一个名称,基于此代码出现的类的名称,例如YourClass$1或类似名称。例如:


public class AnonymousName { public static final void main(String[] args) { Runnable r = new Runnable() { public void run() { } }; System.out.println(r.getClass().getName()); } }

...输出

匿名$1

(至少在 Oracle 的 JVM 上;我不知道命名约定是否在 JLS 中,或者是否是 JVM 特定的行为。)


3
投票

一个界面

public Interface SomeInterface{ }

您可以为接口声明一个对象。 

SomeInterface anObject;

您无法使用此接口直接实例化此对象。
但是,假设您有一个实现此接口的类。 

public class SomeClass implements SomeInterface {}

那么你可以这样做,

anObject = new someClass();

(这当然是概念性的(如伪代码),实际代码可能会根据您的类和访问修饰符等而有所不同。)

一旦我发现,我会立即更新我们为什么要这样做/重点是什么。

注意:上面的答案中已经提到了其中一些内容,只是想让OP也知道整个事情。


0
投票


0
投票
匿名内部类

它正在创建一个新的、匿名的、Runnable 类的实现者的实例。

因为匿名类定义是一个表达式,所以它必须是语句的一部分。


0
投票
extends

接口的类的对象。 就像如果您想创建

Interface Laptop

的对象并声明方法

void writeCode()
并在类
class Development
中实现此方法,您可以使用匿名内部类概念的概念。
现在您可以创建匿名内部类对象引用或类型的对象 

Interface Laptop

public interface Laptop {
    public abstract void writeCode();
}

public class Developer implements Laptop{
    public void writeCode() {
        System.out.println("In developer Class");
    }
}
public class Main {
    public static void main(String[] args) {
        Laptop lap = new Laptop() {
            @Override
            public void writeCode() {
                System.out.println("In new Method");
            }
        };

        lap.writeCode();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.