关于java接口的混淆

confused about JAVA interface

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
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必须自己完成所有方法,那么接口的含义是什么?我想我们不需要它。我不太明白。我读了很多句子,比如:"接口能反映面向对象语言的核心思想","接口能使程序更容易"等等。但我不能真正理解它的含义。

那么,有没有人能给我举几个例子让我理解界面?或者你可以告诉我一些有用的链接或者那些描述界面的书。我真的希望能弄明白。谢谢您!


假设你有一个与现实生活无关的Car类和Vegetable类,有一个共同的行为叫做wash()。因为我们可以洗车,也可以洗蔬菜。但是洗车和洗蔬菜是完全不同的过程/行为。

例如:用电动泵清洗CarVegetables放在厨房水槽下面。所以洗涤的方式是不同的。因此,您将清洗过程作为接口中的方法wash(),比如Washable,并在CarVegetable类中实现它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

 }


}

作为一个人,你不仅要洗蔬菜,还要洗汽车。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Person  {


Washable washableObject = new Car();

washableObject.wash();

washableObject = new Vegetable();

washableObject.wash();




}
  • 因此,接口是一种连接具有共同行为的无关类的方法,但是这种行为将以不同的方式实现,或者在将来可以更改。

  • 有一天,你决定改变洗车的方式。假设你买了一台"洗车机"。因此,在Car类中,方法wash()的内部实现发生了变化。

    公车工具可洗{

    1
    2
    3
    4
    5
      public void wash() {

       // wash the car with my new car washing machine !!

     }

    }

  • 但作为一个人,你仍然称之为wash()方法。wash()方法的实施方式发生了变化(使用新的洗车机洗车),此实施变化不会影响您的Person类。

    希望你明白我们现在为什么使用interfaces


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    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;
        }
    }
    }


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

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

    例如,有人可以创建一个名为Animal的接口。其方法可能是:Talk()Walk()Eat()。可以编写一个实现AnimalDog类,在调用Talk()方法时打印"woof"。因此,另一个类将知道如何处理实现动物接口的所有类。

    UPD

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


    在接口中思考,比如类和用户之间的契约。当一个类实现一个接口时,它告诉我们它承诺提供由该接口定义的所有方法。


    基本上,interface是一种实现多重继承的方法,而实际上不必这样做。(这并不是说Java的人被"消灭"了——多重继承是非常混乱和低效的。"

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