10

可能重复:
“编程到接口”是什么意思?
接口 vs 抽象类(通用 OO)

我是学习 JAVA 的新手,现在我对界面感到困惑。我搜索并阅读了很多资料,但仍然不清楚。

当我尝试查找一些关于接口的信息时,我看到很多人都在谈论接口和抽象类之间的关系。但我什至不知道他们为什么要对比这两者。因为我认为抽象类是用来告诉其他人你不能创建这个抽象类的对象,如果你想,你必须修改抽象类。这是关于继承的事情,对吧?

但我不知道接口的含义。有a interface a,如果aclass B要实现接口a,则必须使用保留字class B implements a,然后完成接口需要的所有方法。但是我的问题是,如果B类必须自己完成所有方法,那么接口的含义是什么?我认为我们不需要它。我不太明白。我读了很多句子,例如:“接口可以反映面向对象语言的核心思想”,“接口可以帮助使程序更容易”等。但我无法真正理解其中的含义。

那么,有没有人可以给我看一些例子来让我理解界面?或者你可以告诉我一些有用的链接或清楚地描述界面的书籍。我真的希望弄清楚。谢谢你!

4

5 回答 5

10

假设你有一个Car类和Vegetable现实生活中不相关的类,并且有一个常见的行为叫做wash(). 因为我们可以洗车,也可以洗菜。但是洗车和洗菜是完全不同的过程/行为。

例如:应该在厨房水槽下Car用动力泵清洗。Vegetables所以洗涤方式不同。因此,您将洗涤过程作为wash()接口中的方法说,并Washable在类中实现它们。CarVegetable

interface Washable {

 public void wash();

} 

public class Car implements Washable {

 public void wash() {

   // wash the car with a power pump

 }


}

public class Vegetable implements Washable {

public void wash() {

   // wash the vegetable under a kitchen sink

 }


}

作为一个人,你会想洗车和洗菜。

public class Person  {


Washable washableObject = new Car();

washableObject.wash();

washableObject = new Vegetable();

washableObject.wash();




}
  1. 所以接口是一种连接具有共同行为的不相关类的方法。但是行为将被不同地实现或将来可以改变。

  2. 有一天,您决定改变洗车方式。假设您购买了一台“洗车机”。所以实现wash()Car类中的方法内部发生了变化。

    公共类汽车实现可清洗{

      public void wash() {
    
       // wash the car with my new car washing machine !!
    
     }
    

    }

但是作为 Person ,您仍然调用该wash()方法。方法的wash()实现方式发生了变化(用你的新洗车机洗车),这个实现变化并没有影响你的Person课程。

希望您清楚我们interfaces现在使用的原因。

于 2012-10-21T05:39:04.117 回答
1

基本上,interface这是一种无需实际执行即可完成多重继承的方法。(这并不是说 Java 人“被淘汰了”——多重继承非常混乱且实现起来效率低下。)

这意味着您可以拥有两个完全独立的类 A 和 B,除了 之外没有共同的祖先Object,并且如果它们实现相同的interface,您可以用一个替换另一个(只要您仅引用接口中的方法) .

于 2012-10-20T22:12:44.557 回答
1

考虑接口,例如类和用户之间的合同。当一个类实现一个接口时,它告诉它承诺提供接口定义的所有方法。

于 2012-10-20T22:12:58.400 回答
1

假设您了解类继承,我认为接口类似于骨架类,其中描述了类的结构,但实际上并未编写/实现。

然后,另一个类可以与任何实现了特定接口的类一起工作,即使它尚未实现。

例如,有人可能会创建一个名为Animal. 它的方法可能Talk()是:Walk()Eat()。您可以编写一个Dog实现在调用AnimalTalk()方法时打印“woof”的类。因此,另一个类将知道如何使用所有实现 Animal 接口的类。

UPD

一个很好的真实示例是 JDBC 数据库语句接口。这列出了数据库制造商必须实现的许多必需属性,例如execute(String sql). Oracle 将以不同于 Postgresql 的方式实现这一点。这允许将数据库交换为另一个数据库,但用户代码保持不变。

于 2012-10-20T22:26:15.893 回答
1

一个简单的代码来理解接口和类。

import java.util.List;
import java.util.ArrayList;
public class Q01 {
List<Shape> shapes= new ArrayList();

public void add() {
    shapes.add(new Square(3.0));
    shapes.add(new Circle(2.0));
}
public void print() {
    for (int i = 0; i < shapes.size(); i++) {
        Shape shape = shapes.get(i);
        System.out.println(shape.getClass().getSimpleName() + " --->" + shape.getArea());
    }
}

public static void main(String[] args) {
    Q01 q01= new Q01();
    q01.add();
    q01.print();
}

public interface Shape {
    double getArea();
}

public class Square implements Shape{
    private double edge;

    public Square(double edge) {
        this.edge = edge;
    }
    public double getArea() {
        return edge*edge;
    }
}
public class Circle implements Shape{
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return 3.14 * radius * radius;
    }
}
}
于 2012-10-20T22:27:51.200 回答