本问题已经有最佳答案,请猛点这里访问。
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必须自己完成所有方法,那么接口的含义是什么?我想我们不需要它。我不太明白。我读了很多句子,比如:"接口能反映面向对象语言的核心思想","接口能使程序更容易"等等。但我不能真正理解它的含义。
那么,有没有人能给我举几个例子让我理解界面?或者你可以告诉我一些有用的链接或者那些描述界面的书。我真的希望能弄明白。谢谢您!
它可以帮助您更多地了解Java中的接口:StaskOpjult.com /问题/ 383947 / & Helip;
接口的唯一目的是实现公共定义的协议行为,这意味着继承接口的类必须包含由该接口定义的所有方法是一个规则,或者更具体地说,它是该类的协议定义。(无论如何,您在接口中定义的所有内容都必须是公共的)。
假设你有一个与现实生活无关的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();
}
因此,接口是一种连接具有共同行为的无关类的方法,但是这种行为将以不同的方式实现,或者在将来可以更改。
有一天,你决定改变洗车的方式。假设你买了一台"洗车机"。因此,在Car类中,方法wash()的内部实现发生了变化。
公车工具可洗{
public void wash() {
// wash the car with my new car washing machine !!
}
}
但作为一个人,你仍然称之为wash()方法。wash()方法的实施方式发生了变化(使用新的洗车机洗车),此实施变化不会影响您的Person类。
希望你明白我们现在为什么使用interfaces。
伟大的!它生动清晰!谢谢您!
是的,非常清楚易懂。但是为什么呢?我看不出有什么好处。你知道你在洗车,因为你把它实例化为一辆新车。您可以只拥有一个名为washable的父类,make wash()abstract,并让car和vegetables继承自washable,实现它们的wash()版本。我错过了什么?
@Scottbiggs设想您有一个具有方法washall()的类SuperwashMachine。它接收一系列可清洗的。您只需要遍历数组并调用wash()方法,因为"contract"表示任何实现washable的类都知道如何实现它。就是这样,这个方法甚至不需要知道任何汽车、蔬菜或任何特定的类,它只处理可洗的东西。为什么不使用继承呢?嗯,也许是语义上的。理想情况下,一辆车和一个蔬菜应该有更多的共同点,除了可以洗之外,还可以和一个共同的父亲阶级建立一种"是的"关系。
理解接口和类的简单代码。
import java.util.List;
import java.util.ArrayList;
public class Q01 {
List 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;
}
}
}
在Q01类中,"listshapes=new arraylist();"的类型必须是"list"?为什么?
因为,我们不知道它的确切类型。它可以是圆的,也可以是正方形的?
明白了,谢谢!
假设您了解类继承,我认为接口类似于一个骨架类,其中描述了类的结构,但实际上并没有编写/实现。
然后,另一个类可以与实现特定接口的任何类一起工作,即使该接口尚未实现。
例如,有人可以创建一个名为Animal的接口。其方法可能是:Talk()、Walk()、Eat()。可以编写一个实现Animal的Dog类,在调用Talk()方法时打印"woof"。因此,另一个类将知道如何处理实现动物接口的所有类。
UPD
一个很好的现实例子是JDBC数据库语句接口。这列出了数据库制造商必须实现的一些必需属性,例如execute(String sql)。Oracle将以不同于PostgreSQL的方式实现这一点。这允许将数据库换成另一个数据库,但用户代码保持不变。
在接口中思考,比如类和用户之间的契约。当一个类实现一个接口时,它告诉我们它承诺提供由该接口定义的所有方法。
@拉文坏话xd对不起。固定的。
基本上,interface是一种实现多重继承的方法,而实际上不必这样做。(这并不是说Java的人被"消灭"了——多重继承是非常混乱和低效的。"
这意味着你可以有两个完全独立的类A和B,除了Object之外没有共同的祖先,如果它们实现相同的interface,你可以用一个代替另一个(只要你只引用接口中的方法)。
不完整,但最好的答案在这里。