2.3 接口的使用
接口不能直接使用,那么也就不能 new 一个接口 。接口需要通过类来实现,实现接口当中的所有抽象方法。类需要通过 implements 来实现接口
注:子类与父类之间是 extends 继承关系,类与接口之间是 implements 实现关系
interface IDome { int number = 1; void fun(); default void fun2() { System.out.println("fun2"); } static void fun3() { System.out.println("fun3"); } } class Dome implements IDome { //需要实现接口中的抽象方法 public void fun() { System.out.println("fun"); } } public class Test { public static void main(String[] args) { Dome dome = new Dome(); System.out.println(dome.number); dome.fun(); dome.fun2(); IDome.fun3(); } }
2.4 接口的属性
interface IDome { int number = 1; void fun(); } class Dome implements IDome { //需要实现接口中的抽象方法 public void fun() { System.out.println("fun"); } }
我们通过这个代码来,说说接口的属性
①接口类型是一种引用类型,但是不能直接new接口的对象
②接口中每一个方法都是 public 的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)
③接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
④重写接口中方法时,不能使用 default 访问权限修饰
编译报错,重写 IDome 中 fun 方法时,不能使用默认修饰符
⑤接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
因为 number 是 public static final 修饰的,所以它无法重新赋值
⑥接口中不能有静态代码块和构造方法
⑦接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
⑧如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
⑨jdk8中:接口中还可以包含default方法
2.5 实现多个接口
在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承。但是一个类可以实现多个接口。
一个类实现多个接口的语法格式:
interface IFlying { void fly(); } interface IRuning { void run(); } interface ISwimming { void swim(); } class Animal { public String name; public int age; public Animal(String name, int age) { this.name = name; this.age = age; } } class Duck extends Animal implements IFlying,IRuning,ISwimming { public Duck(String name, int age) { super(name, age); } public void fly() { System.out.println(name+age+"会飞"); } public void run() { System.out.println(name+age+"会跑"); } public void swim() { System.out.println(name+age+"会游泳"); } } public class Test { public static void main(String[] args) { Duck duck = new Duck("小黄鸭",2); duck.run(); duck.fly(); duck.swim(); } }
运行结果:
一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
一个类只能继承一个父类, 但是可以同时实现多种接口
2.6 接口中的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字
interface Runing { void run(); } interface Swimming { void swim(); } interface Amphibian extends Runing,Swimming { } class Zoon implements Amphibian { public void run() { System.out.println("跑"); } public void swim() { System.out.println("游"); } } public class Test { public static void main(String[] args) { Zoon zoon = new Zoon(); zoon.swim(); zoon.run(); } }
当 Zoom 类实现 Amphibian 接口时,需要重写 run 方法和 swim 方法。因为接口继承了接口, 达到复用的效果
接口间的继承相当于把多个接口合并在一起
2.7 抽象类和接口的区别
抽象类和接口都是 Java 中多态的常见使用方式
相同点:
都是 abstract 修饰的
里面都可以有抽象方法,被其他类继承或者实现 时都需要重写(除了抽象类以外不需要重写)
不同点:
抽象类是类,是被其他类继承的
接口是接口,是被其他类实现的
抽象类中可以包含普通方法和普通字段 ,这样普通方法和普通字段可以被子类直接使用
接口中不能有普通方法,除非普通方法前面加上 default
抽象类可以有构造方法
接口不能有构造方法
抽象类存在的意义是为了让编译器更好的校验,像 Animal 这样的类我们并不会直接使用,而是使用它的子类,要是创建了 Animal 的实例,编译器会及时提醒我们
抽象类和接口的区别图: