Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口与具体类_Java - Fatal编程技术网

Java 接口与具体类

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并再次输出它。使用的好处是什么

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先生)。我在我的答案中添加了一个更好的例子,说明为什么这很有用。