什么是接口
接口是多个类的公共规范,接口是一种引用数据类型,最重要的内容就是其中的抽象方法
接口是比抽象类更抽象的抽象类,规范了对子类的约束,全面专业的实现了规范和具体实现的分离
如何定义接口
public interface 接口名称{ 接口内容 }
接口中的抽象方法如何定义
步骤:
1、新建一个java文件,类型选做interface类型
2、在接口里面写抽象方法,在接口中的抽象方法,修饰符必须是固定的关键字:public abstract(这两个关键字可以选择性删除掉)
使用步骤:
1、接口不能直接使用,必须有一个实现类来实现该接口
格式:
public class 实现类名称 implements 接口名称
2、接口的实现类必须覆盖重写(实现)接口中所有的抽象方法
格式:
重写方法,去掉abstract关键字,加上方法体
3、创建实现类的对象,进行使用
接口中的默认方法如何定义
格式:
public default 返回值类型 方法名称(参数列表){ 方法体 }
作用:
接口中默认方法的出现,目的是解决接口升级问题,当我们接口里面写好一个或几个抽象方法后,实现类实现了该接口,功能正常实现了。当需要在接口中定义新的方法时,如果使用抽象方法,那么实现接口类必须得全部重写新的抽象方法,所以,我们为了减少代码的更改,可以使用默认方法
接口默认方法的使用
接口中的默认方法,默认被实现类继承,实现类可直接调用。
在调用实现类的时候,如果实现类中没有默认方法,会默认向上(接口中)查找。
同时,接口的默认方法,也可以被实现类覆盖重写。
接口静态方法的定义和使用
接口静态方法的定义格式:
public static 返回值类型 方法名称(参数列表){ 方法体}
调用的时候 接口名称.静态方法名();
注意:
不能通过接口实现类来调用接口中的静态方法。因为一个实现类可实现多个接口,如果直接用实现类来调用静态方法,后期可能会产生一定的冲突。
接口常量定义与使用
接口中也可以定义成员变量,但是必须使用public static final 三个关键字进行修饰,这就是接口中的“常量”
注意:
接口中的常量必须,也可以省略public static final
接口中的常量,必须进行赋值。
调用的时候,直接接口 名.变量名
继承父类实现多个接口
1、接口中没有静态代码块,也没有构造方法
2、一个类的直接父类是唯一的,但是一个类同时可以实现多个接口,实现多个接口的时候,用逗号隔开。必须实现多个接口中的抽象方法。
格式:
public class 实现类 implements 接口1,接口2
3、如果实现类所实现的接口中出现方法重名的现象,只需重写覆盖一个方法即可。
4、如果实现类没有实现所有接口的抽象方法,那么该实现类就必须是抽象类
5、如果实现类所实现的多个接口中,存在相同的默认方法,那么实现类一定要对冲突的默认方法覆盖重写
6、一个类直接父类的方法和其实现接口的方法冲突是,那么父类优先。在java中,继承优先于接口
接口的多继承关系
1、类之间属于单根继承,只能有一个直接父类
2、类和接口之间,一个类可实现多个接口
3、接口与接口之间是多继承的
格式:
public interface 接口1 entends 接口2,接口3{}
此时就是接口1继承了接口2和接口3.
一个接口继承多个接口时,如果抽象方法重复,没有关系。如果默认方法重复,则子接口必须覆盖重写
接口练习
//CPU接口 方法获得CPU类型
public interface Cpu {
public abstract String getCpu();
}
//硬盘接口
public interface Hdd {
public abstract String getHdd();
}
//内存接口
public interface Ram {
public abstract String getRam();
}
public class Factory implements Cpu,Hdd,Ram {
@Override
public String getCpu() {
return "Inter I7";
}
@Override
public String getHdd() {
return "金士顿 500G";
}
@Override
public String getRam() {
return "8G运存";
}
}
public class Computer {
//电脑具备属性
public String ram;
public String hdd;
public String cpu;
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
public String getHdd() {
return hdd;
}
public void setHdd(String hdd) {
this.hdd = hdd;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void show(){
System.out.println("品牌信息如下");
System.out.println("CPu品牌"+this.cpu);
System.out.println("硬盘信息"+this.hdd);
System.out.println("运行内存"+this.ram);
}
}
public class TestComputer {
public static void main(String[] args) {
Computer computer = new Computer();
Factory factory = new Factory();
computer.setCpu(factory.getCpu());
computer.setHdd(factory.getHdd());
computer.setRam(factory.getRam());
computer.show();
}
}
结果展示: