我正在学习Java,我在书中看到了以下关于界面的描述:
当变量被声明为接口类型时,它就是简单的 意味着该对象应该已经实现了该接口。
这是什么意思?如果我定义界面:
public interface Myinterface{
void method_one();
int method_two();
}
然后,我将变量声明为接口类型,例如:
Myinterface foo = new Myinterface();
我完全对这本书的描述感到困惑......
答案 0 :(得分:17)
您无法实例化界面,即您无法执行
MyInterface foo = new MyInterface(); // Compile-time error.
您可以做的是实例化实现接口的类。也就是说,给定一个班级MyClass
public class MyClass implements MyInterface {
// ...
@Override
void method_one() {
// ...
}
@Override
int method_two() {
// ...
}
}
你可以实例化它并在你的变量中添加对它的引用,如下所示:
MyInterface foo = new MyClass();
如果您有其他课程实施MyInterface
class MyClass2 implements MyInterface {
// ...
}
您还可以在变量下替换对此类实例的引用:
MyInterface foo = new MyClass2();
这就是界面的力量所在:它们定义类型,而不是特定的实现,让您参考给定类型的任何实现。
使类实现接口并使用它们来引用这些类的实例是一种非常好的编程习惯。这种做法有助于提供大量的灵活性和重用。
因此,只要可以想到可以将不同的实现传递给您正在实现的方法,就应该使用接口类型参数和变量。例如,如果您正在使用HashSet<T>
实例,则应使用类型为Set<T>
的变量来引用它(类HashSet<T>
实现接口Set<T>
)。< / p>
答案 1 :(得分:4)
您无法实例化界面。但您可以使用接口名称键入变量:
Myinterface foo = new MyObject();
假设MyObject
实施MyInterface
。
例如,从外部源获取对象时可能很有用 在这种情况下,您不知道(并且不关心)对象的真实类型。
您只需要知道并确保它实现了某个接口,因此您可以在对象上调用接口方法。
假设您有以下变量:
Myinterface foo;
两个班级(Foo
和Bar
),均实施MyInterface
然后,您就可以为foo
变量分配Foo
和Bar
的实例。
当然,这同样适用于方法论证。
答案 2 :(得分:1)
您没有实例化接口。您可以创建实现接口的类,实例化这些类,但引用接口(而不是实现类)。
这使您的代码可以保持与实现无关,类似于使用List
引用,但ArrayList
实现。
当与依赖注入相结合时,它也使测试和可扩展性变得更加容易。