Java 接口

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

Java中的接口

Java中的接口 ,像一个类一样,一个接口可以有方法和变量,但是在接口中声明的方法默认是抽象的(只有方法签名,没有主体)。

  • 接口指定一个类必须做什么,而不是如何。这是class的蓝图。
  • 一个接口关于像Player这样的功能可能是一个接口,任何实现Player的类都必须能够(或必须实现)move()。因此它指定了该类必须实现的一组方法。
  • 如果一个类实现了一个接口,并且没有为该接口中指定的所有函数提供方法体,那么该类必须声明为抽象的类。
  • Java库的例子是比较器接口。如果一个类实现了这个接口,那么它可以用来对一个集合进行排序。

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

Java接口与类相似点:

  • 一个接口可以有多个方法。
  • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
  • 接口的字节码文件保存在 .class 结尾的文件中。
  • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

Java接口与类的区别:

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

Java接口特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

Java抽象类和接口的区别

  • 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  • 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  • 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  • 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

Java接口的实现

Java接口的声明

接口的声明语法格式如下:

句法 :

interface <interface_name> {
    
    //声明常量字段
    //声明抽象的方法 
    // 默认。
}

要声明一个接口,请使用interface关键字。它被用来提供全面的抽象。这意味着接口中的所有方法都是用空体声明的,并且是公共的,所有的字段默认是公共的,静态的和最终的。实现接口的类必须实现接口中声明的所有方法。实现接口使用实现关键字。

接口有以下特性:

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
  • 接口中的方法都是公有的。

我们为什么要使用接口?

  • 它被用来实现全面的抽象。
  • 由于java在类中不支持多重继承,但通过使用接口它可以实现多重继承。
  • 它也被用来实现松耦合。
  • 接口用于实现抽象。因此,当我们有抽象类时,会出现为什么要使用接口的问题?

    原因是,抽象类可能包含非最终变量,而接口中的变量是最终的,公共的和静态的。

    // A simple interface
    interface Player
    {
    final int id = 10;
    int move();
    }
    

要实现一个接口,我们使用关键字:implements.

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

实现一个接口的语法,可以使用这个公式:

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

Java接口的实现实例

// Java program to demonstrate working of 
// interface.
import java.io.*;
 
// A simple interface
interface in1
{
    // public, static and final
    final int a = 10;
 
    // public and abstract 
    void display();
}
 
// A class that implements interface.
class testClass implements in1
{
    // Implementing the capabilities of
    // interface.
    public void display()
    {
        System.out.println("Geek");
    }
 
    // Driver Code
    public static void main (String[] args)
    {
        testClass t = new testClass();
        t.display();
        System.out.println(a);
    }
}

输出:

Geek
10

例子:
我们来看看自行车,汽车,自行车等车辆的例子,它们具有共同的功能。所以我们制作一个界面,并把所有这些常用功能。并让Bicylce,Bike,car ...等在他们的class中实现所有这些功能。

import java.io.*;
 
interface Vehicle {
     
    // all are the abstract methods.
    void changeGear(int a);
    void speedUp(int a);
    void applyBrakes(int a);
}
 
class Bicycle implements Vehicle{
     
    int speed;
    int gear;
     
     // to change gear
    @Override
    public void changeGear(int newGear){
         
        gear = newGear;
    }
     
    // to increase speed
    @Override
    public void speedUp(int increment){
         
        speed = speed + increment;
    }
     
    // to decrease speed
    @Override
    public void applyBrakes(int decrement){
         
        speed = speed - decrement;
    }
     
    public void printStates() {
         System.out.println("speed: " + speed
              + " gear: " + gear);
    }
}
 
class Bike implements Vehicle {
     
    int speed;
    int gear;
     
    // to change gear
    @Override
    public void changeGear(int newGear){
         
        gear = newGear;
    }
     
    // to increase speed
    @Override
    public void speedUp(int increment){
         
        speed = speed + increment;
    }
     
    // to decrease speed
    @Override
    public void applyBrakes(int decrement){
         
        speed = speed - decrement;
    }
     
    public void printStates() {
         System.out.println("speed: " + speed
             + " gear: " + gear);
    }
     
}
class GFG {
     
    public static void main (String[] args) {
     
        // creating an inatance of Bicycle 
        // doing some operations 
        Bicycle bicycle = new Bicycle();
        bicycle.changeGear(2);
        bicycle.speedUp(3);
        bicycle.applyBrakes(1);
         
        System.out.println("Bicycle present state :");
        bicycle.printStates();
         
        // creating instance of bike.
        Bike bike = new Bike();
        bike.changeGear(1);
        bike.speedUp(4);
        bike.applyBrakes(3);
         
        System.out.println("Bike present state :");
        bike.printStates();
    }
}



输出;

Bicycle present state :
speed: 2 gear: 2
Bike present state :
speed: 1 gear: 1

重写接口中声明的方法时,需要注意以下规则:

  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
  • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

在实现接口的时候,也要注意一些规则:

  • 一个类可以同时实现多个接口。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似。

Java接口的继承

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

下面的Sports接口被Hockey和Football接口继承:

// 文件名: Sports.java
public interface Sports
{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}

// 文件名: Football.java
public interface Football extends Sports
{
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}

// 文件名: Hockey.java
public interface Hockey extends Sports
{
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}

Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法。

相似的,实现Football接口的类需要实现五个方法,其中两个来自于Sports接口。

Java接口的多继承

在Java中,类的多继承是不合法,但接口允许多继承。

在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

public interface Hockey extends Sports, Event

以上的程序片段是合法定义的子接口,与类不同的是,接口允许多继承,而 Sports及 Event 可能定义或是继承相同的方法

Java标记接口

最常用的继承接口是没有包含任何方法的接口。

标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

例如:java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:

package java.util;
public interface EventListener
{}

没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:

  • 建立一个公共的父接口:正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
  • 向一个类添加数据类型:这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

JDK 8中的新增功能添加到接口中

  1. 在JDK 8之前,接口无法定义实现。我们现在可以添加接口方法的默认实现。这个默认实现有特殊用处,并不影响接口背后的意图。假设我们需要在现有的接口中添加一个新的函数。很明显,旧的代码不会工作,因为类没有实现这些新功能。所以借助默认实现,我们将为新添加的函数提供一个默认主体。然后旧的代码仍然可以工作。
    // An example to show that interfaces can
    // have methods from JDK 1.8 onwards
    interface in1
    {
        final int a = 10;
        default void display()
        {
            System.out.println("hello");
        }
    }
     
    // A class that implements interface.
    class testClass implements in1
    {
        // Driver Code
        public static void main (String[] args)
        {
            testClass t = new testClass();
            t.display();
        }
    }

    输出:

    hello
  2. 在JDK 8中添加的另一个功能是我们现在可以在不需要对象的情况下独立调用接口中的静态方法。注意:这些方法不会被继承。
    // An example to show that interfaces can
    // have methods from JDK 1.8 onwards
    interface in1
    {
        final int a = 10;
        static void display()
        {
            System.out.println("hello");
        }
    }
     
    // A class that implements interface.
    class testClass implements in1
    {
        // Driver Code
        public static void main (String[] args)
        {
            in1.display();
        }
    }
    
    

    输出:

    hello

关于接口的重要观点:

  • 我们不能创建接口的实例(接口不能被实例化),但我们可以引用它来引用它的实现类的对象。
  • 一个类可以实现多个接口。
  • 一个接口可以扩展另一个接口或多个接口(多个接口)。
  • 实现接口的类必须实现接口中的所有方法。
  • 所有的方法都是公开的和抽象的。所有的领域都是公共的,静态的和最终的。
  • 它用于实现多重继承。
  • 它用于实现松耦合。

在JDK 9中的接口中添加的新功能

从Java 9开始,接口也可以包含以下内容

  1. 静态方法
  2. 私人方法
  3. 私有静态方法
  •   本文标题:Java 接口 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/3749.html

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读