Java 实例化接口

Java 实例化接口,java,object,interface,initialization,instantiation,Java,Object,Interface,Initialization,Instantiation,扩展中的问题,我们在用实现的类初始化接口的同时实例化接口 我的问题是,首先为什么我们要用接口实例化它?为什么我不能直接用实现的类实例化它? 例如: Doc mydoc = new SimpleDoc(); 其中Doc是接口,SimpleDoc正在实现它。 有什么问题吗 SimpleDoc mydoc=新SimpleDoc(); 这将失败在哪里?如果在客户端代码中使用接口而不是实现类,则可以在不更改客户端代码的情况下更改实现。这就是我们所称的虚拟方法调用或后期绑定 让我们看一个例子 public

扩展中的问题,我们在用实现的类初始化接口的同时实例化接口

我的问题是,首先为什么我们要用接口实例化它?为什么我不能直接用实现的类实例化它? 例如:

Doc mydoc = new SimpleDoc();
其中Doc是接口,SimpleDoc正在实现它。 有什么问题吗 SimpleDoc mydoc=新SimpleDoc();
这将失败在哪里?

如果在客户端代码中使用接口而不是实现类,则可以在不更改客户端代码的情况下更改实现。

这就是我们所称的虚拟方法调用后期绑定

让我们看一个例子

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
现在,鹿类被认为是多态的,因为它具有多重遗传。对于上述示例,以下是正确的:

A Deer IS-A Animal

A Deer IS-A Vegetarian

A Deer IS-A Deer

A Deer IS-A Object
当我们将引用变量facts应用于Deer对象引用时,以下声明是合法的:

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d
所有引用变量
d、a、v、o
都引用堆中相同的
Deer
对象。

如果写入:

SimpleDoc mydoc = new SimpleDoc();
Doc mydoc = new SimpleDoc();
List list = new ArrayList();
所有进一步的代码可能取决于实现类
SimpleDoc
公开的细节。但如果你写:

SimpleDoc mydoc = new SimpleDoc();
Doc mydoc = new SimpleDoc();
List list = new ArrayList();
进一步的代码my仅取决于
Doc
公开的方面,如果您决定将来编写以下代码,这些方面甚至可以使代码正常工作:

Doc mydoc = new ComplexDoc();
区别的一个很好的例子是
List
,它至少有两种实现:

ArrayList
LinkedList
如果你写:

SimpleDoc mydoc = new SimpleDoc();
Doc mydoc = new SimpleDoc();
List list = new ArrayList();
您可以在以后将其替换为:

List list = new LinkedList();

在不破坏依赖变量
list
的代码的情况下(假设您没有使用强制转换或反射来访问
list
的特定于实现的功能)。

在系统中依赖抽象类型(接口或抽象类)通常是一种良好的做法

在你的例子中,你确实可以写:

SimpleDoc mydoc = new SimpleDoc()
但是问题是,使用
mydoc
的代码将取决于具体类型
SimpleDoc
。这本身并不一定是个问题,但是,假设您创建了一个新的
Doc
实现,比如
ComplexDoc

您需要将您的声明更改为:

ComplexDoc mydoc = new ComplexDoc();
现在,您传递给
mydoc
的所有places方法也必须更改

然而,如果您首先使用了
Doc
,您将有一个单独的更改:

Doc mydoc = ComplexDoc();

这在使用Collections API时尤其有用,在该API中,切换另一个实现是很常见的,或者在测试用例中使用模拟时也是如此。

您的问题已经由链接到的问题回答了。顺便说一句:如果你真的尝试过,你会注意到它不会失败。我不知道这个问题的原因。我同意这个例子不会失败。但我想问的是,有没有可能的地方?如果不是,那为什么我们需要这样做呢?就说练习吧。请容忍我的想法。假设我创建了接口类对象,值来自一个方法,该方法可以返回任何对象类。在这种情况下,它会很有用吗?重要的是,通过依赖一个接口,您可以在最小的麻烦下切换实现,尽管像OO中的所有东西一样,这必须合理地使用,并且在适当的时候——决定取决于实践是的。对的谢谢,我不确定我有没有注意到你。