对JAVA界面感到困惑

时间:2012-10-20 22:06:28

标签: java interface

  

可能重复:
  What does it mean to “program to an interface”?
  Interface vs Abstract Class (general OO)

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

当我试图找到有关接口的一些信息时,我看到很多人谈到了接口和抽象类之间的关系。但我甚至不知道为什么他们会对比这两者。因为我认为抽象类用于告诉其他人你无法创建这个抽象类的对象,如果需要,你必须修改抽象类。这是关于继承的事情,对吗?

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

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

5 个答案:

答案 0 :(得分:9)

假设您有一个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内发生了变化。

    公共类汽车实施可洗{{/ p>

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

    }

  3. 但作为一个人,你仍然会调用wash()方法。实施wash()方法的方式发生了变化(使用新洗车机洗车),此实施更改不会影响您的Person课程。

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

答案 1 :(得分:1)

基本上,interface是一种完成多重继承而无需实际执行的方法。 (这并不是说Java人员“懦弱” - 多重继承非常混乱,实现效率低下。)

这意味着您可以拥有两个完全独立的A和B类,除了Object之外没有共同的祖先,如果它们实现相同的interface,您可以用一个代替{{1}}其他(只要您在界面中仅引用方法)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

假设您了解类继承,我认为接口就像一个骨架类,其中描述了类的结构,但实际上没有编写/实现。

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

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

<强> UPD

一个很好的现实世界的例子是JDBC数据库语句接口。这列出了数据库制造商必须实现的许多必需属性,例如Talk()。 Oracle将以不同于Postgresql的方式实现它。这允许将数据库换成另一个数据库,但用户代码保持不变。

答案 4 :(得分: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;
    }
}
}