文章目录

  • 1.接口
  • 1.1 Java接口定义
  • 2.接口的实现
  • 2.1 implements 关键字
  • 2.2 使用接口的限制
  • 2.2.1 实现接口的类必须有接口中的所有方法
  • 2.2.2 实现接口的抽象类可以不提供方法的实现
  • 2.2.3 如果父类实现了某个接口,那么子类也就自然实现了该接口
  • 2.2.4 接口也可以被继承
  • 3.接口和多态
  • 4.接口回调
  • 4.1 什么是接口回调
  • 4.2 实例


1.接口

1.1 Java接口定义

在Java程序中,我们将使用关键字interface声明的特殊类称之为接口。
接口的定义和类的定义很相似,分为接口声明和接口体。例如:

/**
 * 定义一个名为Printable的接口
 * 其中拥有常量MAX,
 * 抽象方法add(),sum(float x,float y)
 */
public interface Printable {
    
    final int MAX = 100;

    /**
     * 执行加操作
     */
    float add(float x);

    /**
     * 对x和y进行求和
     * @param x
     * @param y
     * @return
     */
    float sum(float x,float y);
}

对于一个接口,我们要记住:

  • 1)接口用来描述类应该做什么,而不是指定它们具体应该如何做,也就是说,Java接口从技术层面来说不应该包含实现,而是定义一些抽象的方法或者常量。接口定义来就是要被其他类去实现的。
  • 2)一个类可以实现一个或多个接口。(下一节会介绍)
  • 2)接口不是普通的类,而是对希望符合这个接口的类的一组需求。
  • 3)接口中的所有方法都自动是public的(无须提供public关键字)。
  • 4)接口中可以定义常量。

注意:接口绝不会有实例字段,在java8之前,接口绝不会实现方法,现在我们已经可以在接口中提供简单方法(但这些方法不能引用实例字段),提供实例字段和方法实现的任务应该由实现接口的那个类来完成。 因此我们可以将接口看成是没有实例字段的抽象类。

2.接口的实现

2.1 implements 关键字

一个类可以使用implements关键字实现一个或多个接口。
因为接口可以进行多实现(继承只能单一继承),所以接口比抽象类更为灵活。
例如:

class A implements Printable,Addable{
....
}

注意: 普通类和抽象类都可以实现接口。但是二者的实现是有差别的。
类通过实现接口里的抽象方法来实现接口,抽象类既可以实现接口中的方法,也可以直接拥有接口中的抽象方法。

2.2 使用接口的限制

2.2.1 实现接口的类必须有接口中的所有方法

当一个类实现了某个接口,那么这个类就得提供这个接口的所有抽象的实现。
如下:

public class PrintableImp implements Printable{
    @Override
    public float add(float x) {
        return 0;
    }

    @Override
    public float sum(float x, float y) {
        return 0;
    }
}

2.2.2 实现接口的抽象类可以不提供方法的实现

public abstract class AbstractPrintable implements Printable{
    
}

2.2.3 如果父类实现了某个接口,那么子类也就自然实现了该接口

public class PrintableImpSon extends PrintableImp{
    
}

2.2.4 接口也可以被继承

即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。

public interface PrintableSon extends Printable{
    void sayHello();
}

3.接口和多态

接口的使用也是多态的一种体现:
由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式。

4.接口回调

4.1 什么是接口回调

接口回调是指一个接口声明的变量被赋予实现类的对象地址时,可以调用一个类实现的接口方法,此时这个变量也就是实现类的上转型对象。

4.2 实例

public class Example {
    public static void main(String[] args) {
        //声明一个接口变量
        showMessage sm;
        //将实现类TV的实例地址赋给接口变量
        sm = new TV();
        sm.showSome("长虹电视机");//接口回调
        //将实现类PC的实例地址赋给接口变量
        sm = new PC();
        sm.showSome("华为电脑");//接口回调
    }
}

/**
 * 定义一个showMessage接口
 */
interface showMessage{
    void showSome(String s);
}

/**
 * 定义一个接口showMessage的实现类TV
 */
class TV implements showMessage{
    public void showSome(String s){
        System.out.println(s);
    }
}

/**
 * 定义一个接口showMessage的实现类PC
 */
class PC implements showMessage {
    public void showSome(String s) {
        System.out.println(s);
    }
}

java如何进行接口设计案例 java接口编写教程_java