Java中的接口

什么是接口

  1. 接口类似于抽象类,但它并不是类。
  2. 接口用interface修饰,格式是 interface 接口名{}
  3. 接口是抽象方法的集合,也就是说,接口内部只能是没有方法体的抽象方法。
  4. 接口存在的意义就是给另一个类实现的。如果一个类实现了接口,那么就需要继承这个接口中所有的抽象方法。

为什么要使用接口

因为Java中只能单继承。虽然c++支持多继承,但是Java设计师为了减少不必要的麻烦,就摒弃了多继承。因为多继承中的多个父类若有同名的方法时,就不知道调用的方法是谁的了。比如动物类里有一个run方法,猫科动物类也有一个run方法,tiger同时继承了猫科动物类和动物类,那么我们就会搞混,分不清super.run是谁的run方法。

多继承示例代码

public class Animal {
    public void run(){
        System.out.println("动物奔跑");
    }
}
public class Cat_Animal {
    public void run(){
        System.out.println("猫科动物奔跑");
    }
}
public class Tiger extends Animal,Cat_Animal {//直接编译报错,只支持单继承
    @Override
    public void run() {
        super.run();
    }
}

多实现示例代码

虽然Java中不支持多继承,但并不代表我们没有这个需求。为了实现需求、且要减少麻烦,于是就有了接口。接口是支持多继承的,但为了与类作区分,所以我们通常说成“多实现(implements)”

public interface Animal {
    void run();
}
public interface Cat_Animal {
    void run();
}
public class Tiger implements Animal,Cat_Animal {//多实现用implements修饰,接口名用逗号隔开
    @Override
    public void run() {
        System.out.println("老虎奔跑");
    }
}

public class Test {
    public static void main(String[] args) {
        Tiger tiger = new Tiger();
        tiger.run();
    }
}
老虎奔跑

接口的特点

  1. 接口中的方法都是抽象方法。默认都是public abstract,但我们可以不用写,直接写出返回值类型 方法名();即可,因为public abstract会被自动省略。除非实现了接口的类是抽象的,否则接口中的所有方法都要在类中实现。如果实现接口的类是抽象类,则没必要全部实现。
  2. 接口中没有成员变量,都是常量。尽管我们可以在接口中看到int a = 5;String name = "张三";之类的“变量”,但这些都是伪装。因为前面默认的public static final 被省略了。
  3. 接口可以继承多个父接口,如public interface BigCat extends Animal, Cat_Animal{},extends后的接口名用逗号隔开。implements关键字要放在extend后面
  4. 接口中没有构造方法,所以不能被实例化。也正因为不能实例化,所以接口中才没有成员属性和成员变量。因为无法被实例化,我们也就无法通过对象去对接口中的值进行修改。此时,接口中若还支持成员属性和成员变量,那不是很鸡肋嘛。

类和接口的区别

  1. 接口用interface修饰,类用class修饰
  2. 接口中没有构造函数,类中有构造函数。因此接口不能被实例化,和抽象类相同。
  3. 类中描述的是属性和行为,属性就是颜色、大小、形状等等,行为就是指做的事情。比如猫这个类,包含橘色、抓老鼠这些内容。而接口中只包含行为,行为就是所作所为。比如猫的所作所为就是抓老鼠和钓鱼,那么抓老鼠和钓鱼就是接口中的两个抽象方法。
  4. 类只能继承一个类,但可以实现多个接口。接口不能实现接口,却可以继承多个父接口,如 public interface Demo extends Animal,BigCat,Cat_Animal{}

接口和抽象类的区别

- 共同点

  1. 抽象类和接口都是抽象的,都不能被实例化。
  2. 继承抽象类和实现接口,都需要重写方法

- 不同点

  1. 接口是interface关键字标识,抽象类是abstract class关键字标识。
  2. 接口内部只有常量和抽象方法,抽象类内部可以没有抽象方法。抽象类除了不能被实例化,和普通类没区别。
  3. 抽象类可以实现多个接口,接口可以继承多个父接口。
  4. 接口中的方法必须是public的,变量用final修饰,也就是常量。抽象类中,方法用public、protected、private修饰。
posted @ 2019-04-26 20:49  爱听音乐的猪  阅读(262)  评论(0编辑  收藏  举报