对JAVA界面感到困惑[重复]

Posted

技术标签:

【中文标题】对JAVA界面感到困惑[重复]【英文标题】:confused about JAVA interface [duplicate] 【发布时间】:2012-10-11 04:22:15 【问题描述】:

可能重复: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中的接口:***.com/questions/383947/… 接口的唯一目的是实现公开定义的协议行为,这意味着继承接口的类必须包含该接口定义的所有方法是一个规则或更具体地说,它是该类的协议定义。 (无论如何,您在接口中定义的所有内容都必须是公开的)。 【参考方案1】:

假设你有一个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();





    所以接口是一种连接不相关类的方法,具有共同的行为。但行为会以不同的方式实现或将来可以改变。

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

    公共类汽车实现可清洗

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

但是作为一个 Person ,你仍然调用 wash() 方法。 wash() 方法的实现方式发生了变化(用你的新洗车机洗车),这个实现变化不会影响你的Person 类。

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

【讨论】:

太棒了!它生动而清晰!谢谢! 是的,非常清晰易懂。但为什么?我没有看到任何好处。您知道您正在洗车,因为您将它实例化为 new Car()。您可以只拥有一个名为 Washable 的父类,将wash() 抽象化,并让 Car 和 Vegetables 都继承自 Washable,实现它们的 Wash() 版本。我错过了什么? @ScottBiggs 想象一下,你有一个 SuperWashMachine 类,它的方法是washAll()。它接收一个可清洗的数组。您只需要遍历数组并调用wash() 方法,因为“合同”说任何实现Washable 的类都知道如何去做。就是这样,这个方法甚至不需要知道任何汽车、蔬菜或任何特定的类,它只处理可清洗的东西。为什么不使用继承?好吧,也许这是语义上的。理想情况下,除了可清洗之外,汽车和蔬菜应该有更多共同点,以便与共同的父类建立“是”关系。 同样的任务我们也可以用抽象类来处理,那为什么你这里不用抽象类而不是接口呢?【参考方案2】:

基本上,interface 是一种无需实际操作即可完成多重继承的方法。 (这并不是说 Java 人“被淘汰了”——多重继承非常混乱且实现起来效率低下。)

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

【讨论】:

不完整,但最好的答案在这里。【参考方案3】:

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

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;
    


【讨论】:

Q01类中,“Listshapes=new ArrayList();”的类型必须是“列表”?为什么? 因为我们不知道它到底是什么类型的。它可能是圆形或方形?【参考方案4】:

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

【讨论】:

@Ravn 坏词 xD 抱歉。固定。 我们也可以用抽象类获得相同的行为,那为什么不在这里使用呢?【参考方案5】:

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

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

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

UPD

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

【讨论】:

以上是关于对JAVA界面感到困惑[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对WindowBuilder感到困惑[重复]

对 C# 循环中的多线程感到困惑 [重复]

我对多态性和类对象感到困惑[重复]

对 C# 6.0 中的字符串插值感到困惑 [重复]

对 n^2 与 2^n 的大 O 感到困惑 [重复]

使用双重逻辑非(!!)运算符感到困惑[重复]