Java 接口与具体类
下面我有一个Person接口、一个实现类和一个驱动程序类,它用一个名字初始化Person并再次输出它。使用的好处是什么Java 接口与具体类,java,Java,下面我有一个Person接口、一个实现类和一个驱动程序类,它用一个名字初始化Person并再次输出它。使用的好处是什么 Person person = new PersonImpl(); 而不是 PersonImpl person = new PersonImpl(); 接口应该隐藏实现吗? 这是使用接口的正确方法吗 public class Driver { public static void main(String [] args) { 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=new PersonImpl()
的优点是在接口和具体实现之间保持了松散耦合PersonImpl person=new PersonImpl()
紧密耦合。而且Person=new Person()
甚至不会编译
假设您有一个巨大的应用程序,并且许多代码依赖于PersonImpl对象。现在假设我想更改PersonImpl并创建一个新类PersonImpl2。现在我必须手动扫描整个项目,并在任何地方进行更改。这甚至可能会破坏代码。这被称为紧耦合,是一件坏事。相反,如果代码的其余部分依赖于Person对象,那么即使我创建了一个新的PersonImpl2类,事情也会很顺利,因为PersonImpl2实现了Person。这是使用接口的方法 原因是您可以稍后编写另一个实现,而无需更改使用
Person
的代码
所以现在您可以使用PersonImpl
,但稍后您可能需要其他类型的PersonImpl
您可以创建实现相同接口的新类,并且可以将新类与任何其他需要人员的代码一起使用
列表
界面就是一个很好的例子
List
有多种实现,如ArrayList
、LinkedList
等。每种实现都有其优缺点。通过编写使用列表
的代码,您可以让每个开发人员决定哪种类型的列表
最适合他们,并且能够在不做任何更改的情况下处理其中的任何一种。我能想到的一个优点是,您可能有两种截然不同的人,但您希望等到运行时(基于用户输入、配置文件等)来决定使用哪一个。您可以执行以下操作:
Person person = null;
if ...
person = new PersonImpl();
else
person = new PersonImpl2();
使用接口而不是具体类将允许您在以后更改实现
这是关于JDBC的,所有这些都基于接口,因此驱动程序可以在以后实现它
例如,当您使用结果集时,您并不真正关心底层实现的方式或内容(Oracle驱动程序类似于OracleResultSet,MySQL驱动程序类似于MySQLResultSet),但您知道可以使用哪些方法
列表或映射也是如此,而不是ArrayList或HashMap,这取决于您希望如何使用Person
就目前的情况而言,将其作为一个接口并没有带来任何实际的好处
然而,假设有外星人也可以被视为“人”,因为他们的行为(比如说“谈话()、行走()、思考()、感觉())都是在人身上定义的。现在你可能想把“人”与“人”和“外星人”分开,这样来自两个截然不同层次的个体——比如“哺乳动物”层次中的“人”和“蛛形纲”层次结构中的“外星人”——两者都可以实现Person接口。谢谢,但我想我还没有完全理解它,也许我没有看到更大的图景。为什么不使用-PersonImpl Person=new PersonImpl();Person.setName(“测试名”);System.out.println(“名称是”+Person.getName());当然,如果您希望只有一种类型的人,那么您根本不需要接口;您可以直接实现person
类。对于同一子系统或模块中的代码尤其如此。通常建议为从其他包可见的类定义一个接口。我有点担心用于此。为什么我要创建另一种类型的人。好吧,我想我在输入时学习。这样,例如getName,我可以在返回字符串名称之前修改字符串名称或类似的内容?确切地说,您可能希望有两种类型的人
,儿童
和成人
其中儿童
只要重新输入即可N他们的名字,成人
返回前面有标题的名字(Person先生)。我在我的答案中添加了一个更好的例子,说明为什么这很有用。