可能重复:
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类必须自己完成所有方法,接口的含义是什么?我想我们不需要它。
我不太了解它。我读了很多句子:“界面可以反映面向对象语言的核心思想”,“界面可以帮助使程序更容易”等等。但我无法理解其含义。
那么,有没有人可以向我展示一些让我们理解界面的例子?或者你可以告诉我一些有用的链接或清楚描述界面的书籍。我真的希望弄明白。谢谢!
答案 0 :(得分:9)
假设您有一个Car
类和Vegetable
类,它在现实生活中是无关的,并且有一个称为wash()
的常见行为。因为我们也可以洗车洗菜。但洗车和洗蔬菜是完全不同的过程/行为。
对于例如:Car
应使用动力泵Vegetables
在厨房水槽下清洗。所以洗涤方式不同。因此,您将清洗过程作为方法wash()
在界面中说Washable
,并在Car
和Vegetable
类中实施。
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();
}
因此,接口是一种连接具有共同行为的无关类的方法。但是行为将以不同方式实现或将来可以更改。
有一天,您决定改变洗车的方式。假设您已经购买了一台"洗车机"。因此,实现在wash()
类中的方法Car
内发生了变化。
公共类汽车实施可洗{{/ p>
public void wash() {
// wash the car with my new car washing machine !!
}
}
但作为一个人,你仍然会调用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;
}
}
}