接口

1. 接口概述

什么是接口?接口一种标准或者是一种规范,和类是一个级别,是特殊的抽象类,是专门用于定义类的行为规范,使之规范化

抽象类和接口之间的区别:

  • 接口是一种契约、规范、标准,抽象类约束子类的行为

  • 接口可以多实现,抽象类和普通类一样,只能单继承

  • 接口的设计是为了实现通用功能或规范,但是没有关联的情况下影响了父子类的is a的关系,因此,接口和实现类的关系是:类 have a 接口

  • 接口中只能定义全局常量,抽象类中可以定义变量也可以定义常量

  • 接口中没有构造方法,抽象类可以定义构造器,不定义默认为无参构造器

  • 接口中出了静态方法和默认方法,其他方法必须是抽象方法(1.9可以定义私有方法),抽象类中可以是抽象方法也可以是普通方法

  • 接口与接口之间支持多继承,抽象类与抽象类/普通类之间只支持单继承

2. 接口特点

  • 接口使用interface关键字来定义

  • 在Java中,类和接口是并列存在的两个结构

  • 如何定义接口,定义接口中的成员

    • 3.1在JDK7及以前:只能定义全局常量抽象方法

    • 3.2在JDK8开始,除了能定义抽象方法和全局常量,还可以定义静态方法默认方法

  • 接口中不能定义构造器,接口不能实例化,可以通过匿名对象创建

  • Java开发中,接口通过让类去实现implement来使用

  • 实现类如果将接口的抽象方法全部实现,则为普通类,若未全部实现,则为抽象类

  • 接口采用的是多继承机制,多个接口用逗号隔开implements a接口,b接口

  • 接口与实现类也存在多态性

  • 接口之间可以使用extends实现继承interface类名 extends 接口1,接口2,接口3……{}

注意:如果存在一个类同时继承父类和实现接口,需要先写extends,再写implements

如:class SubClass extends SuperClass implements InterfaceA{}

1.3语法

语法:[访问权限修饰符] interface 接口名{}

访问权限修饰符:public 默认(package)

//定义接口
interface AnimalTrain{

  public abstract void jump();

}

abstract class Dog implements AnimalTrain{

  public void jump(){

    System.out.println("够");

  }

}

class Cat implements AnimalTrain{

  public void jump(){

    System.out.println("猫跳高")

  }
}

class InterfaceDemo{

  public static void main(String[] args){

    //AnimalTrain是抽象的,无法实例化

    AnimalTrain ar=new AnimalTrain();

    at.jump();

    AnimalTrain a=new Cat();

    a.jump();

  }
}

1.4版本对比

JDK1.7版本

  1. 静态常量:接口中默认为[public static final]修饰 接口.常量

  2. 抽象方法:接口中方法默认为[public abstract]修饰

JDK1.8版本

  • JDK8及以后可以定义静态方法

    1. 静态方法:static 返回值 方法名([参数]){}

    2. 类的继承中,父类的静态方法子类是可以继承并使用的

    3. 接口中定义了静态方法后,只能通过接口.方法名的方式进行调用

    4. 实现类的对象是无法重写、无法继承并使用

    5. 那么接口中定义静态方法的作用就是为了自己使用,类似于一个工具类

  • 默认方法:default 返回值 方法名([参数]){}

实现接口的类对该方法进行重写,如果实现接口的类没有重写该方法,可以由子类对象对该方法进行调用(可以被实现类重写,也可以被重写)

不可以用private/protected修饰方法

接口中的静态方法调用是通过:接口.静态方法();因为该静态方法是属于接口的不是属于对象的

JDK1.9版本

可以创建私有方法

1.5注意事项

  • 接口中非静态方法在实现类中的区别

    1. 有方法体的方法在实现类中算重写

    2. 没有方法体的方法在实现类中算实现

  • 一个类如果继承了父类且实现了接口,且父类和接口中存在同名同参数的方法

    1. 子类在没有重写此方法的情况下,默认调用父类的同名同参数方法

    2. 这种情况叫做:类优先原则

  • 一个类如果实现了多个接口,且多个接口中都存在同名同参数的方法

    1. 子类在没有重写的情况下,会报错:com.carl.javacore.interfaceTest.Plane inherits unrelated defaults for play() from types com.carl.javacore.interfaceTest.FlyAble and com.carl.javacore.interfaceTest.Attack;这种情况叫做:接口冲突

    2. 如何解决接口冲突:

    3. 必须在实现类中重写该同名同参数的方法

    4. 如果该实现类有其他父类,可以用父类重写该同名同参数的方法(不推荐,这样就使功能和规范混乱了)

  • 存在类的优先原则和接口冲突问题,那么如何指定特定的类或接口的方法

    1. 父类的方法调用:super.方法名();

    2. 接口的方法调用:接口名.super.方法名();

1.6接口和继承的区别

  • 继承中父类用于定义有共性的行为;

  • 接口用于定义额外功能,以后有什么类需要这些功能就扩展进去;

1.9总结

static 静态成员 可以修饰属性,方法,内部类,属于类的成员

final 最终的,可以修饰类(不能继承),属性(常量与static),方法(不能被重写)

posted @ 2024-03-22 13:23  杰尼龟的小龟壳  阅读(16)  评论(0)    收藏  举报