← 返回首页
JavaSE系列教程(二十九)
发表时间:2020-01-06 17:59:02
讲解接口以及接口与抽象类的区别。

1.什么是接口

接口(Interface)是一种特殊的抽象类,接口里面的属性都是public static final修饰的,接口里的方法都是public abstract修饰的。

接口使用关键字interface来定义,使用implements表示实现接口,例如:


public interface MyInterface{
   int num = 100; //等同于:public static final int num = 100;
   public void fn();//等同于:public abstract void fn();

   //JDK8及以后,允许我们在接口中定义static方法和default方法。
   // static修饰符定义静态方法
    static void staticMethod() {
        System.out.println("接口中的静态方法");
    }

    // default修饰符定义默认方法
    default void defaultMethod() {
        System.out.println("接口中的默认方法");
    }

}

class A implements MyInterface{

    @Override
    public void fn(){
        MyInterface.staticMethod();
        System.out.println("fn()....");
        this.defaultMethod();
    }

    public static void main(String[] args) {
        new A().fn();
    }
}

2.接口的特征

1)Java中一个类有且只有一个父类,但是一个类可以实现多个接口。

2)接口不能实例化,只能实例化接口的实现类。

3)接口允许多重继承。

4)接口没有构造方法。

5)接口里面的属性都是public static final修饰的,接口里的方法都是public abstract修饰的。

6)接口侧重于表示事物的功能。表达了xxx has a xxx 的概念。

3.接口与抽象类的区别

抽象类侧重描述事物的本质,表达了xxx is a xxx的概念。 接口侧重于表示事物的功能。表达了xxx has a xxx 的概念。

比如:

保温杯是水杯,有保温的功能。所以水杯是抽象类,保温是接口。 伪代码描述为:class 保温杯 extends 水杯 implements 保温

防盗门是门,有防盗功能。所以门是抽象类,防盗是接口。 伪代码描述为:class 防盗门 extends 门 implements 防盗 ...

我们通过一个综合实例来深入理解抽象类和接口的区别。

我们分别设计了动物、小猫、小狗、小鸭、老鼠类。 分析得到,小狗、小猫、小鸭、老鼠都是动物,所以动物应该设计为抽象类。小猫和小狗都有捉耗子的本领,所以让小狗和小猫都去实现捉耗子接口,而小鸭和小狗都有游泳的本领,所以让小狗和小鸭都去实现游泳的接口。

实现代码如下:


//动物是抽象类
public abstract class Animal {

    String gender;
    String alias;
    int age;
    int speed; //奔跑速度。

    public Animal() {
    }

    public Animal(String gender, String alias, int age, int speed) {
        this.gender = gender;
        this.alias = alias;
        this.age = age;
        this.speed = speed;
    }

    public abstract void bark(); //动物叫方法也是抽象方法。


}

//捉耗子的接口
public interface CatchMouse {

    public boolean catchMouse(Mouse m);
}

//游泳接口
public interface Swim {

    public void swim();
}

//小狗类分别实现了捉耗子和游泳接口
public class Dog extends Animal implements CatchMouse,Swim {

    public Dog() {
    }

    public Dog(String gender, String alias, int age, int speed) {
        super(gender, alias, age, speed);
    }

    @Override
    public boolean catchMouse(Mouse m) {

        if(this.speed>m.speed){ //能否捉到老鼠取决于速度
          return  true;
        }
        return false;
    }

    @Override
    public void swim() {
        System.out.println("我会狗刨,我也会游泳...");
    }

    @Override
    public void bark() {
        System.out.println("汪汪..");
    }
}

//小猫类实现了捉耗子接口
public class Cat extends Animal implements CatchMouse {

    public Cat() {
    }

    public Cat(String gender, String alias, int age, int speed) {
        super(gender, alias, age, speed);
    }

    @Override
    public boolean catchMouse(Mouse m) {
        if(this.speed>m.speed){  //能否捉到老鼠取决于速度
            return  true;
        }
        return false;
    }

    @Override
    public void bark() {
        System.out.println("喵喵...");
    }
}

//小鸭类实现了游泳接口
public class Duck extends Animal implements Swim{

    public Duck() {
    }

    public Duck(String gender, String alias, int age, int speed) {
        super(gender, alias, age, speed);
    }

    @Override
    public void swim() {
        System.out.println("我是天生的游泳健将...");
    }

    @Override
    public void bark() {
        System.out.println("嘎嘎...");

    }
}

//老鼠类
public class Mouse extends Animal {

    public Mouse() {
    }

    public Mouse(String gender, String alias, int age, int speed) {
        super(gender, alias, age, speed);
    }

    @Override
    public void bark() {
        System.out.println("吱吱...");
    }
}

//测试类
public class Test {

    public static void main(String[] args) {

        Animal dog = new Dog("公","旺财",3,100);
        Animal cat = new Cat("母","Tom",5,200);
        Animal duck = new Duck("母","唐纳德",4,50);
        Animal mouse = new Mouse("公","Jerry",3,120);

        dog.bark();
        cat.bark();


        if(((Dog) dog).catchMouse((Mouse)mouse)){
            System.out.println("狗狗捉到了老鼠");
        }else{
            System.out.println("狗狗放走了老鼠");
        }

        if(((Cat) cat).catchMouse((Mouse)mouse)){
            System.out.println("Tom捉到了老鼠");
        }else{
            System.out.println("Tom放走了老鼠");
        }


        ((Dog) dog).swim();
        ((Duck) duck).swim();


    }
}

运行结果:
汪汪..
喵喵...
狗狗放走了老鼠
Tom捉到了老鼠
我会狗刨,我也会游泳...
我是天生的游泳健将...

小结:

1)Java中一个类有且只有一个父类,但是一个类可以实现多个接口。

2)接口不能实例化,只能实例化接口的实现类。

3)接口允许多重继承。

4)接口没有构造方法。

5)接口里面的属性都是public static final修饰的,接口里的方法都是public abstract修饰的。

6)接口侧重于表示事物的功能。表达了xxx has a xxx 的概念。

7)接口的实现类必须实现接口里的所有方法这也是多态性的表现