对JAVA接口感到困惑

对JAVA接口感到困惑,java,interface,Java,Interface,可能重复: 我是新来学习JAVA的,现在我对接口感到困惑。我已经搜索和阅读了很多资料,但仍然不清楚 当我试图找到一些关于接口的信息时,我看到很多人谈论接口和抽象类之间的关系。但我甚至不知道他们为什么要对比这两个。因为我认为抽象类是用来告诉其他人你不能创建这个抽象类的对象,如果你想,你必须修改这个抽象类。这是关于继承的,对吗 但我不知道界面的含义。有一个接口a,如果a类B要实现接口a,它必须使用保留字类B实现a,然后完成接口所需的所有方法。但我的问题是,如果类B必须自己完成所有的方法,那么接口

可能重复:

我是新来学习JAVA的,现在我对接口感到困惑。我已经搜索和阅读了很多资料,但仍然不清楚

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

但我不知道界面的含义。有一个
接口a
,如果a
类B
要实现接口a,它必须使用保留字
类B实现a
,然后完成接口所需的所有方法。但我的问题是,如果类B必须自己完成所有的方法,那么接口的含义是什么?我想我们不需要它。 我不太明白。我读了很多句子,比如:“界面能反映面向对象语言的核心思想”,“界面能使程序更简单”等等。但我不能真正理解其中的含义


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

基本上,
接口
是一种实现多重继承的方法,而实际上不必这样做。(这并不是说Java的人“疲惫不堪”——多重继承非常混乱,实现起来也非常低效。)


这意味着您可以有两个完全独立的类A和B,除了
对象
,没有共同的祖先,如果它们实现相同的
接口
,您可以用一个替换另一个(只要您只引用接口中的方法).

考虑类和用户之间的契约等接口。当一个类实现一个接口时,它表示它承诺提供该接口定义的所有方法。

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

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

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

UPD


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

了解接口和类的简单代码

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;
    }
}
}
import java.util.List;
导入java.util.ArrayList;
公开课Q01{
列表形状=新建ArrayList();
公共无效添加(){
添加(新正方形(3.0));
添加(新圆圈(2.0));
}
公开作废印刷品(){
对于(int i=0;i”+shape.getArea());
}
}
公共静态void main(字符串[]args){
Q01 Q01=新的Q01();
q01.add();
q01.print();
}
公共界面形状{
双getArea();
}
公共类广场{
私人双边优势;
公共广场(双刃){
这个边=边;
}
公共区域(){
返回边*边;
}
}
公共课圈实现形态{
私人双半径;
公共圈(双半径){
这个半径=半径;
}
公共区域(){
返回3.14*半径*半径;
}
}
}

假设你有一辆
汽车
类和
蔬菜
类,它们在现实生活中是不相关的,并且有一种叫做
wash()
的常见行为。因为我们可以洗车,也可以洗蔬菜。但洗车和洗蔬菜是完全不同的过程/行为

例如:
汽车
应该用电动泵清洗,蔬菜放在厨房水槽下面。所以洗涤的方式是不同的。因此,您将清洗过程设置为界面中的一种方法
wash()
,即
washible
,并在
Car
vegeture
类中实现它们

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()
    中的实现发生了变化

    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 void wash() {
    
       // wash the car with my new car washing machine !!
    
     }
    
    }

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

    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
    
     }
    
    
    }
    

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

    这可能有助于您进一步了解java中的接口:接口的唯一目的是实现公开定义的协议行为mea