说我有一个I
方法接口doIt();
现在我有一个C
实现I
并因此提供实现的类doIt();
对于 Class 中的以下代码Hello
public class Hello{
I i = new I();
i.doIt();
}
1.) 现在从哪里实现 doIt()?
2.) 如果有另一个类也HelloWorld
实现I
了该doIt()
函数的不同实现怎么办。那么它会采取哪种实施方式呢?
尝试编译这些东西。您只能实例化 aClass
实现 theInterface
而不是Interface
直接的。
Interface
就像一个合同,当Class
它同意时implements
;并在协议的范围内Interface
,Class
提供了它的实施。
您不能实例化接口。您只能实例化一个具体的类。的实现doIt()
是在被实例化的具体类中定义的。如果该类不提供实现,它将从超类继承。
作为旁注,在您的代码示例中,您的类中的代码不包含在方法或静态块中。这是不合法的。您必须将代码包含在方法或静态块中。
接口不能被实例化。您发布的代码不应编译。你可以做的是这样的:I c = new C();
. 这也将确保doIt()
我调用的适当实现。
有关. _ _Interfaces
这永远行不通
public class Hello{
I i = new I(); // I is an interface, can't be instantiated
i.doIt();
}
我想你想要...
public class A implements I {
public void doIt() {
System.out.println("A did it");
}
}
public class B implements I {
public void doIt() {
System.out.println("B did it");
}
}
public class Main {
public static void main(String args[]) {
I i = new A();
i.doIt();
i = new B();
i.doIt();
}
}
这将输出
A did it
B did it
实例化接口的唯一方法是添加特定于您的实现的匿名内部类型。尽管有时它看起来像一个糟糕的设计,但它很有用。干杯。
II i = new II() {
@Override
public void doit() {
// TODO Auto-generated method stub
}
};
没有实现,您的代码将无法编译。尝试创建一个简单的工作示例,您就会明白。顺便说一句,无论如何语法都是错误的:如果我是一个接口,则需要打开花括号来创建一个实现该接口的匿名类:
I i = new I() { public void doIt() {} };
在您的代码I i = new I();
中是不正确的,I
并且interface
无法实例化接口,如果您必须这样做,那么这应该是
I i = new I(){
public returntype doIt(){
...
}
};
现在上面的实现在这里被称为匿名内部类