关键字interface接口:
主要用途就是被实现类实现(面向接口编程)
1.解释:有时必须从几个类中抽取出一些共同的行为特征
继承是一个"是不是"的关系,而接口实现则是 "能不能"的关系
接口的本质是契约,标准,规范
2.interface与类并列
3.如何定义接口:
JDK7.0之前:只能定义全局常量和抽象方法
全局常量public static final的,但是写时可以省略(在接口中写) interface Flyable{ public static final int max_num= 100;//全局常量 int min_num = 1;//全局常量 } 抽象方法public abstract的
**JDK8:**可以定义全局常量、抽象方法、静态方法、默认方法
静态方法(static):只能通过接口来调用,不能通过实现类去调用
interface Flyable{ public static void method1(){ //方法体 } } 默认方法(default):可以通过实现类去调用 interface Runable{//两种书写方法 public default void method2(){ //方法体 } } interface Flyable{ default void method2(){ //方法体 } }
如何在子类(或实现类)的方法中调用父类、接口被重写的方法
①*如果实现类重写了接口中的默认方法,调用的是重写以后的方法
class SubClass implements Runable{
public void method2(){//方法体}//重写方法
public void Mymethod(){
method2();//调用的就是自己重写的
}
}
②*如果子类(或实现类)继承的父类和实现的接口中声明了同名同参的方法,
那么子类在没有重写此方法的情况下,默认调用父类的同名同参方法(类优先原则)
class SubClass extends 父类 implements Runable{
public void Mymethod(){
method2();//调用的是父类的
}
}
③*如果子类实现了多个接口,接口中还有同名同参的方法,
如果子类没有重写此方法就会编译报错
class SubClass implements Runable,Flyable{
public void Mymethod(){
method2();//编译报错
}
}
//先继承后实现
class SubClass extends 父类 implements Runable,Flyable{
public void method2(){//方法体};
public void Mymethod(){
method2();//调用自己重写的的
super.method2();//调用父类的
Runable.super.method2();//调用接口Runable的默认方法
Flyable.super.method2();//调用接口Flyable的的默认方法
}
}
补充:
①接口中不能定义构造器!意味着接口不可以实例化
②Java开发中,接口通过让类去实现(implements)接口
---- 如果实现类覆盖了接口中所有抽象方法,则实现类就可以实例化
---- 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
面试题:抽象类与接口有哪些异同?
相同点:
不能实例化,内部结构不可以用private权限修饰符、都可以包含抽象方法、要有子类或实现类才有意义====================================================
不同点:
接口:
没有构造器
jdk7.0之前:接口只能定义全局常量和抽象方法
jdk8.0之后:接口能定义全局常量、抽象方法、静态方法\默认方法(default修饰的方法)(public default void method(){ } )
且接口中可以省略public、final、abstract等关键字修饰符。
权限修饰符只能是public
支持多实现
=================================================
抽象类:
有构造器
内部可以定义全局常量的值和非全局常量的值、抽象方法、普通方法(非抽象方法)、静态方法
不能省略public、final、abstract等关键字修饰符
权限修饰符可以是public、protected、default(这里的是啥也不写 void method(){ })
只能单继承