接口
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版本
-
静态常量:接口中默认为[public static final]修饰 接口.常量
-
抽象方法:接口中方法默认为[public abstract]修饰
JDK1.8版本
-
JDK8及以后可以定义静态方法
-
静态方法:static 返回值 方法名([参数]){}
-
类的继承中,父类的静态方法子类是可以继承并使用的
-
接口中定义了静态方法后,只能通过接口.方法名的方式进行调用
-
实现类的对象是无法重写、无法继承并使用
-
那么接口中定义静态方法的作用就是为了自己使用,类似于一个工具类
-
-
默认方法:
default 返回值 方法名([参数]){}
实现接口的类对该方法进行重写,如果实现接口的类没有重写该方法,可以由子类对象对该方法进行调用(可以被实现类重写,也可以被重写)
不可以用private/protected修饰方法
接口中的静态方法调用是通过:接口.静态方法();因为该静态方法是属于接口的不是属于对象的
JDK1.9版本
可以创建私有方法
1.5注意事项
-
接口中非静态方法在实现类中的区别
-
有方法体的方法在实现类中算重写
-
没有方法体的方法在实现类中算实现
-
-
一个类如果继承了父类且实现了接口,且父类和接口中存在同名同参数的方法
-
子类在没有重写此方法的情况下,默认调用父类的同名同参数方法
-
这种情况叫做:类优先原则
-
-
一个类如果实现了多个接口,且多个接口中都存在同名同参数的方法
-
子类在没有重写的情况下,会报错:
com.carl.javacore.interfaceTest.Plane inherits unrelated defaults for play() from types com.carl.javacore.interfaceTest.FlyAble and com.carl.javacore.interfaceTest.Attack;这种情况叫做:接口冲突 -
如何解决接口冲突:
-
必须在实现类中重写该同名同参数的方法
-
如果该实现类有其他父类,可以用父类重写该同名同参数的方法(不推荐,这样就使功能和规范混乱了)
-
-
存在类的优先原则和接口冲突问题,那么如何指定特定的类或接口的方法
-
父类的方法调用:super.方法名();
-
接口的方法调用:接口名.super.方法名();
-
1.6接口和继承的区别
-
继承中父类用于定义有共性的行为;
-
接口用于定义额外功能,以后有什么类需要这些功能就扩展进去;
1.9总结
static 静态成员 可以修饰属性,方法,内部类,属于类的成员
final 最终的,可以修饰类(不能继承),属性(常量与static),方法(不能被重写)

浙公网安备 33010602011771号