2012-10-20 93 views
10

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

我是新来学习Java,现在我感到困惑的接口。我已经搜索并阅读了许多材料,但仍不清楚。

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

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

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

+0

它可能有助于探索你更多关于java中的接口:http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – Jimmy

+0

唯一的目的是接口是实现*公共定义的协议行为*,意味着继承接口的类必须包含由该接口定义的所有方法是一个规则,或者更具体地说它是该类的协议定义。 (无论如何,你在界面中定义的每件事都必须公开)。 – Lion

回答

7

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

对于例如:Car应该用你的厨房水槽下面的动力泵Vegetables进行清洗。所以洗涤的方式是不同的。因此,您将洗涤过程作为wash()的方法在界面中进行,并在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. 所以接口是连接具有共同behavior.But的行为将受到不同的实现,也可以在将来改变不相关的类的方法。

  2. 有一天你决定改变你洗车的方式。假设你已经购买了“洗车机”。因此,实现在Car类中的方法wash()内发生更改。

    公共类汽车实行水洗{

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

    }

但作为一个人,你还是叫wash()方法。执行wash()方法的方式发生了变化(使用新洗车机清洗汽车),但这种实施变更并未影响您的Person课程。

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

+0

太棒了!它生动而清晰!谢谢! – lkkeepmoving

+0

是的,非常清楚,容易理解。但为什么?我没有看到任何好处。你知道你正在洗车,因为你将它实例化为一辆新车()。你可以有一个名为Washable的父类,make wash()抽象,并且Car和Vegetables继承自Washable,实现它们的wash()版本。我错过了什么? –

+1

@ScottBiggs想象一下,您有一个带有方法washAll()的SuperWashMachine类。它收到一个可清洗的数组。你只需要通过数组并调用wash()方法,因为“契约”表示任何实现Washable的类都知道如何去做。就是这样,这种方法甚至不需要知道任何汽车,蔬菜或任何特定的类,它只是处理可清洗的东西。为什么不使用继承?那么,也许这是语义。理想情况下,汽车和蔬菜应该有更多的共同点,除了可以清洗以建立与普通父亲的“是”关系。 –

1

基本上,interface是一种完成多重继承而不需要实现的方法。 (这并不是说Java人员“榨取”了 - 多重继承是非常混乱且效率低下的。)

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

+0

不完整,但在这里最好的答案。 –

1

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

+0

@Ravn坏词xD对不起。固定。 –

1

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

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

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

UPD

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

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; 
    } 
} 
} 
+0

在Q01类中,“列表 shapes = new ArrayList();”的类型必须是“列表”?为什么? – lkkeepmoving

+0

因为,我们不知道它究竟是什么类型。它可能是圆形或方形? – chrome

+0

明白了,谢谢! – lkkeepmoving