Java的接口以及接口与抽象类区别

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();
 }
}

在这里插入图片描述

与继承关系类似,接口与实现类之间存在多态

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来实例化,但是抽象类有构造方法,接口没有

从设计层面来说,抽象类是对事物的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范

猜你喜欢

转载自blog.csdn.net/m0_61820867/article/details/126670491