是否可以为接口创建对象?如果是,是如何完成的? 根据我的观点,以下代码表明我们可以:
Runnable r = new Runnable() {
// some implementation
}
这不是创建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
这证明我们正在创建子类的实例。
您不能直接实例化接口,但可以实例化实现该接口的类:
public class RunClass implements Runnable {
// Class implementation
}
Runnable r = new RunClass();
这与您内联所做的基本相同。 new Runnable() 之后的括号将包含您的内联实现。
您可以创建一个匿名内部类:
Runnable r = new Runnable() {
@Override
public void run() {
}
};
因此,您创建一个新的
class
来实现给定的 interface
。
是否可以为接口创建对象?
不。您显示的代码从“匿名类”创建一个对象,该类实现了该接口。在幕后,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 特定的行为。)
一个界面
public Interface SomeInterface{
}
您可以为接口声明一个对象。
SomeInterface anObject;
您无法使用此接口直接实例化此对象。 但是,假设您有一个实现此接口的类。
public class SomeClass implements SomeInterface {}
那么你可以这样做,
anObject = new someClass();
(这当然是概念性的(如伪代码),实际代码可能会根据您的类和访问修饰符等而有所不同。)
一旦我发现,我会立即更新我们为什么要这样做/重点是什么。
注意:上面的答案中已经提到了其中一些内容,只是想让OP也知道整个事情。
接口的类的对象。 就像如果您想创建
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();
}
}