接口与具体类

下面我有一个Person接口,一个实现类和一个驱动程序类,它使用一个名称初始化Person并再次输出它。 使用的优点是什么?

Person person = new PersonImpl(); 

代替

 PersonImpl person = new PersonImpl(); 

该接口应该隐藏实现? 这是使用接口的正确方法吗?

 public class Driver { public static void main(String [] args) { Person person = new PersonImpl(); person.setName("test name"); System.out.println("Name is "+person.getName()); } } public interface Person { public void setName(String name); public String getName(); } public class PersonImpl implements Person{ private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } } 

这是使用接口的方法。

原因是你可以在不改变使用Person代码的情况下编写另一个实现。

所以现在你可以使用PersonImpl但是稍后你可能需要一个OtherTypeOfPersonImpl

您可以创建实现相同接口的新类,并且可以将新类与任何其他需要Person代码一起使用。

一个很好的例子是List接口。

List有多种实现,例如ArrayListLinkedList等。这些实现中的每一种都有优点和缺点。 通过编写使用List代码,您可以让每个开发人员确定哪种类型的List最适合他们,并且能够在不做任何更改的情况下处理任何类型的List

你做的是正确的。 使用Person person = new PersonImpl()的优点是在接口和具体实现之间保持松耦合。 PersonImpl person = new PersonImpl()紧密耦合。 和Person person = new Person()甚至不会编译。

想象一下你有一个庞大的应用程序,很多代码依赖于PersonImpl对象。 现在假设我要更改PersonImpl并创建一个新类PersonImpl2。 现在我必须手动扫描整个项目并在各处进行更改。 这甚至可能会破坏代码。 这被称为紧耦合,是一件坏事。 相反,如果代码的其余部分依赖于Person对象,那么即使我创建一个新的PersonImpl2类,事情也会正常工作,因为PersonImpl2实现了Person。

我能想到的一个优点是你可能有两种非常不同类型的人,但你想等到运行时(基于用户输入,配置文件等)来决定使用哪一种。 你可以这样做:

 Person person = null; if ... person = new PersonImpl(); else person = new PersonImpl2(); 

这取决于你想如何使用Person。

就目前而言,拥有界面并不会带来任何实际好处。

但是,假设有外星人也可以被视为“人”,因为他们的行为(比如“讲话(),行走(),思考(),感觉())是在人物中定义的。现在你可能想分开来自“人类”和“外星人”的“人”使得来自两个非常不同的等级的个体 – 在“哺乳动物”层次结构中称为“人类”,在“节肢动物”层次结构中称为“外星人” – 可以实现人员界面。

使用接口而不是具体类可以让您稍后更改实现。

这是关于JDBC的,所有这些都基于接口,因此驱动程序可以在以后实现它。

例如,当您使用ResulSet时,您并不关心底层实现的方式或内容(Oracle驱动程序将类似于OracleResultSet,MySQL驱动程序可能类似于MySQLResultSet),但您知道有哪些方法可供您使用使用。

与List或Map相同,而不是ArrayList或HashMap