我正在学习Java,我在一本书中看到了关于接口的以下描述:
当一个变量被声明为接口类型时,它仅仅意味着该对象已经实现了该接口。
这是什么意思?如果我定义了接口:
public interface Myinterface{
void method_one();
int method_two();
}然后,我将变量声明为接口类型,例如:
Myinterface foo = new Myinterface();我完全被这本书的描述弄糊涂了。
发布于 2011-12-06 20:20:00
不能实例化接口,即不能实例化
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>)。
发布于 2011-12-06 20:20:40
无法实例化接口。但是,您可以使用接口名键入变量:
Myinterface foo = new MyObject();假设MyObject实现了MyInterface。
例如,当从外部源获取对象时,它可能很有用。
在这种情况下,您不知道(也不关心)对象的真实类型。
您只需要知道并确保它实现了一些接口,这样就可以调用对象上的接口方法。
假设您有以下变量:
Myinterface foo;以及两个类(Foo和Bar),它们都实现了MyInterface。
然后,您将能够为foo变量分配Foo和Bar的实例。
当然,方法参数也是如此。
发布于 2011-12-06 20:19:54
您不实例化接口。创建实现接口的类,实例化这些类,但是引用接口(相对于实现类)。
这允许您的代码保持实现中立,类似于使用List引用,但使用ArrayList实现。
当与依赖注入相结合时,它也使测试和扩展性变得更加容易。
https://stackoverflow.com/questions/8406250
复制相似问题