java的接口
产生的背景
有时候必须从几个类中派生出一个子类,继承他们所有的方法,java不支持多继承,于是就有接口
当抽象类中全是抽象方法时,为了简化abstract关键字,于是就有了接口
特点
接口用interface实现
接口中所有的方法默认都是public abstract(不写访问权限修饰符就是默认public abstract)
接口中所有的变量都是public static final修饰的(该变量属于类还是常量,必须初始化)
接口没有构造方法(不能被继承,可以继承其他类),但是可以使用多态(接口和实现类之间)
实现接口的类必须实现接口中所有的方法,除非实现类为抽象类,但是继承了该实现类(抽象类)的类也要实现(重写)接口的所有方法以及实现类中的抽象方法,当然该继承类为抽象类也可以不重写,知道有一个非抽象类的继承为止…
类不会因为实现了接口,就不能继承其他类
java 8之后,接口中可以有默认方法,使用default修饰即可,也就是对方法写方法体了
public interface A { default void run(){ System.out.println("A"); } }
public class C implements A,B{ @Override public void sleep() { } @Override public void run() { System.out.println("C"); } public static void main(String[] args) { C c = new C(); c.run(); } }
与继承关系类似,接口与实现类之间存在多态
扫描二维码关注公众号,回复: 14766718 查看本文章AnimalInt接口
public interface AnimalInt { void run(); void sleep(); void eat(); }
AnimalIntImpl实现类
public class AnimalIntImpl implements AnimalInt{ @Override public void run() { System.out.println("动物1跑"); } @Override public void sleep() { System.out.println("动物1睡"); } @Override public void eat() { System.out.println("动物1吃"); } }
AnimalIntImpl2实现类
public class AnimalIntImpl2 implements AnimalInt{ @Override public void run() { System.out.println("动物2跑"); } @Override public void sleep() { System.out.println("动物2睡"); } @Override public void eat() { System.out.println("动物2吃"); } }
Test测试类
public class Test { public static void main(String[] args) { AnimalInt animalInt1 = new AnimalIntImpl();//使用接口指向实现类,有点类似父类指向子类引用,这里存在多态 AnimalInt animalInt2 = new AnimalIntImpl2(); animalInt1.eat(); animalInt2.eat(); } }
接口与类之间是实现关系,使用implements关键字表示,(也可以支持多实现)举例:使用implements A,B
接口和接口之间是继承关系,使用extends关键字表示(而且可以多继承)剧烈使用extends A,B可以同时继承A,B接口
为什么接口可以实现多继承,普通的类必须,因为不同的类可以有重复的方法,继承的子类开年不好抉择是那个父类的方法,接口由于完全抽象的特性,其方法都没有实现内容,即使出现重复的方法,也没有关系,实现类选任意一个实现即可
接口D
public interface D { void jump(); }
接口B
public interface B { void sleep(); }
接口A继承于接口B,D(由于接口是抽象类,不需要重写父类的方法)
public interface A extends B,D{ void run(); }
实现类C 要重写A,B,D的所有(抽象)方法
public class C implements A{ @Override public void sleep() { } @Override public void run() { } @Override public void jump() { } }
接口回调
先有接口调用者,后又接口的实现者
Usb接口
public interface Usb { void service(); }
Computerl类
public class Computer { Usb usb1; Usb usb2; Usb usb3; public void run(){ System.out.println("电脑启动"); if (usb1!=null){ usb1.service(); } if (usb2!=null){ usb2.service(); } if (usb3!=null){ usb3.service(); } } }
Mouse实现类
public class Mouse implements Usb{ @Override public void service() { System.out.println("鼠标插上去了,正常启动了"); } }
Keyboard实现类
public class Keyboard implements Usb{ @Override public void service() { System.out.println("键盘插上去了,正常启动了"); } }
Upan实现类
public class Upan implements Usb{ @Override public void service() { System.out.println("U盘插上去了,正常启动了"); } }
TestComputer测试类
public class TestComputer { public static void main(String[] args) { Computer computer =new Computer(); computer.usb1 = new Mouse();//多态,usb1是接口(也是computer的成员变量),Mouse是实Usb的实现类 computer.usb2 = new Upan(); computer.usb3 = new Keyboard(); computer.run(); } }
接口的好处
接口就是一套规则,如同jdbc是java的一个重要接口,里面定义一些方法,java不负责书写里面的内容,具体的内容由各大厂商完成,比如使用Mysql,就导入mysql的jar包,包内含有实现java接口的实现类,使用Orcal同理。提高了代码的灵活性
接口与抽象类
接口的方法默认都是public的,是抽象的,接口中不能有实现(java 8之后,接口方法可以实现,使用default);抽象类中可以有非抽象方法
接口中的实例变量默认是final类型的,而抽象类中则不一定
一个类可以实现多个接口,但是最多只能继承一个抽象类
接口和抽象类都不能使用new来实例化,但是抽象类有构造方法,接口没有
从设计层面来说,抽象类是对事物的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范