CodeGym /Java 博客 /随机的 /Java 中的接口
John Squirrels
第 41 级
San Francisco

Java 中的接口

已在 随机的 群组中发布
如您所知,Java 中的一切都由对象组成,对象具有状态(字段)和行为(由方法定义)。类的行为可以将其绑定到其他类。行为可以有不同的特征,有时将其移到类之外会更方便,尤其是在与外界交互时。就像电视的遥控器在“盒子”本身之外一样。遥控器是用户与电视功能交互的接口。例如,您可以想象一个实现抽象飞机或直升机的类。这两类物体(例如大多数鸟类)都可以飞行,而且它们的飞行方式都不同。也许值得将此功能转移到一个单独的实体中,并且所有潜在的“传单”都将从该实体继承?如果您已经熟悉抽象类,则可以创建一个抽象类 Flyable 并从中“继承”Copter 和 Plane 类。但是,如果有多个这样的属性怎么办?例如,飞机和直升机可以飞行,也可以在地面上行驶。即使我们创建了 Ride 类,我们也不能再将 Copter 和 Plane 分配给它。毕竟,每个Java类只有一个父类。Java 中的接口 - 1使用Java语言中的接口部分解决了这个问题。Java 中的接口定义了一些没有特定实现的功能,然后由使用这些接口的类来实现。并且一个类可以实现多个接口。事实上,通过在 Java 中实现一个接口,我们声明我们的类可以做某事,我们报告它的行为。我们已经在类中进行了行为的具体实现。所以。飞机和直升机的起飞方式不同:飞机需要跑道,而直升机通常垂直起飞。这些细节最好在课堂上实施。

Java 中的接口

在Java语言中定义接口需要使用interface关键字。例如:
interface Voice {

    void talk();
}
上面的接口称为Voice。Java 中的接口可以定义常量和方法,它们可能有也可能没有实现。通常,接口方法没有实现,就像本例中一样。接口中没有实现的方法就像抽象类的抽象方法。接口方法通常没有访问修饰符。然而,默认情况下访问实际上是公共的,因为接口的目的是定义类实现的功能。因此,所有功能都应该开放以供实施。要实现接口,请在声明类时使用Implements关键字。此外,如果接口包含没有实现的方法,则该方法必须在实现类中实现。
public class Duck implements Voice {


@Override
public void voice() {
   System.out.println("Quack");
}


    }

接口代码示例

让我们举一个更完整的例子。每一种(好吧,几乎每一种)动物都有发出声音的能力。让我们为此案例创建一个 Java 接口Voice 。它有一个talk()方法,但没有实现。
public interface Voice {
   void talk();
}
现在,所有支持Voice接口的类都必须具有talk()方法的实现。让我们创建两个类 - CatDog并指示它们实现Voice接口。在这种情况下,如果你不在其中实现一个类,程序将无法运行。实现方法非常简单。当调用Cat类对象的talk()方法时,屏幕上将显示相当于喵叫的文本,对于Dog类,则为吠叫。我们还将向类添加 getter、setter 和构造函数。
public class Cat implements Voice {
   String name;
   String breed;
   int year;

   public Cat(String name, String breed, int year) {
       this.name = name;
       this.breed = breed;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getBreed() {
       return breed;
   }

   public void setBreed(String breed) {
       this.breed = breed;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("meow...");
   }
}
public class Dog implements Voice {
   String name;
   String color;
   int year;

   public Dog(String name, String color, int year) {
       this.name = name;
       this.color = color;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("WOF WOF");
   }
}
事实上,我们的类和方法实现非常相似。让我们创建另一个具有语音支持的类Parrot。只有talk()方法的工作方式有所不同:用户将在控制台中输入一个字符串,parrot 将使用 talk ()方法“重复”它。
import java.util.Scanner;

public class Parrot implements Voice {
   String name;
   String color;
   int year;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       Scanner scanner = new Scanner(System.in);
       System.out.println("WHat should I repeat after you?...");
       String s =  scanner.nextLine();
       System.out.println(s);
   }
}
现在我们创建一个测试类,看看如果依次 调用CatDogParrot类对象的talk()方法,程序会产生什么结果。
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Parrot parrot = new Parrot();
       parrot.talk();
   }
}
输出如下。绿色文本是用户在控制台中打印的一个文本。
喵...WOF WOF 我应该在你后面重复什么?...我是非常健谈和聪明的鸟 我是非常健谈和聪明的鸟

默认方法

在 JDK 8 版本之前,在用 Java 实现接口时,我们必须在类中实现其所有方法。同时,Java接口本身可以只包含方法定义,而没有具体的实现。JDK 8 添加了新功能——默认方法。现在,Java 接口不仅可以有方法定义,还可以有默认实现。如果类实现接口但未实现方法,则使用它们。例如,我们将Voice接口中的talk()方法更改为默认方法。我们还将编写一个新的支持语音的Duck类,该类没有talk方法的实现。
public interface Voice {
   default void talk() {
       System.out.println("I can talk...");
   }
}
public class Duck implements Voice {

   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

   public void fly(){
       System.out.println("I am flying!!!");
   }

}
现在让我们稍微改变一下我们的测试类。
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Duck duck = new Duck();
       duck.talk();
   }
}
输出在这里:
喵……WOF WOF 我会说话……
看?在DogCat类的对象中,调用重写的方法talk() ,但在Duck类的对象中,调用接口中的默认方法。因此,default方法只是一个没有修饰符的方法,并用default关键字标记。我们不必在实现接口的类中实现默认方法,但我们可以重写它。

静态方法

由于 JDK 8 静态方法在 Java 接口中可用 - 它们类似于类方法:
interface Voice {

    void talk();

    static void check(){

        System.out.println("checked...");
    }
}
要引用接口的静态方法,就像类的情况一样,写下接口的名称和方法:
public static void main(String[] args) {

    Voice.check();
}

接口的多种实现

如果我们需要在Java类中应用多个接口,那么它们都在implements后面用逗号列出:
public class Duck implements Swimmable, Flyable, Voice {

    public void moveForward() {
        System.out.println(" Quack, I am moving forward...");
    }

    public void TurnRight(){
        System.out.println("I am turning right...");
    }
    public void TurnLeft(){
        System.out.println("I am turning left...");

    }

    public void Stop() {
        System.out.println("Quack. I am relaxing on the surface of the water...");
    }

    public void fly(){
        System.out.println("I am flying!!!");
    }

}
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION