-3

说我有一个I方法接口doIt();

现在我有一个C实现I并因此提供实现的类doIt();

对于 Class 中的以下代码Hello

public class Hello{
    I i = new I();
    i.doIt();
}

1.) 现在从哪里实现 doIt()?

2.) 如果有另一个类也HelloWorld实现I了该doIt()函数的不同实现怎么办。那么它会采取哪种实施方式呢?

4

7 回答 7

4

尝试编译这些东西。您只能实例化 aClass实现 theInterface而不是Interface直接的。

Interface就像一个合同,当Class它同意时implements;并在协议的范围内InterfaceClass提供了它的实施。

于 2012-08-02T05:39:34.307 回答
2

您不能实例化接口。您只能实例化一个具体的类。的实现doIt()是在被实例化的具体类中定义的。如果该类不提供实现,它将从超类继承。

作为旁注,在您的代码示例中,您的类中的代码不包含在方法或静态块中。这是不合法的。您必须将代码包含在方法或静态块中。

于 2012-08-02T05:37:08.973 回答
2

接口不能被实例化。您发布的代码不应编译。你可以做的是这样的:I c = new C();. 这也将确保doIt()我调用的适当实现。

有关. _ _Interfaces

于 2012-08-02T05:38:44.837 回答
2

这永远行不通

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
于 2012-08-02T05:40:53.807 回答
1

实例化接口的唯一方法是添加特定于您的实现的匿名内部类型。尽管有时它看起来像一个糟糕的设计,但它很有用。干杯。

    II i = new II() {

        @Override
        public void doit() {
            // TODO Auto-generated method stub

        }
    };
于 2012-08-02T05:46:33.293 回答
0

没有实现,您的代码将无法编译。尝试创建一个简单的工作示例,您就会明白。顺便说一句,无论如何语法都是错误的:如果我是一个接口,则需要打开花括号来创建一个实现该接口的匿名类:

I i = new I() { public void doIt() {} };
于 2012-08-02T05:39:44.447 回答
0

在您的代码I i = new I();中是不正确的,I并且interface无法实例化接口,如果您必须这样做,那么这应该是

I i = new I(){
   public returntype doIt(){
    ...
   }
};

现在上面的实现在这里被称为匿名内部类

于 2012-08-02T05:40:24.103 回答