接口
官方解释: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现 ,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
包含内容:
(Java 7)变量,抽象方法
(Java 8)默认方法,静态方法
(Java 9)私有方法
为什么要使用接口?
接口可以解决Java无法多继承的缺陷
定义接口方法 : 关键字为interface
public interface USB {
//变量
//方法体
}
定义接口类(实现接口)方法
public class computer implements USB {
//方法体
}
1. 抽象方法(abstract)
使用规则:接口的实现类必须覆盖重写(实现)接口中的抽象方法 去掉abstract关键字,加上方法体大括号
使用方法:接口类对象.方法名称();
接口
public interface USB {
public abstract void read(); //抽象方法——读
}
接口类
public class computer implements USB {
@Override //覆盖重写
public void read() {
System.out.println("这是一个抽象方法");
}
}
2.默认方法(default)
目的:实现接口升级,无需再在接口类中重写
使用方法:接口类对象.方法名称();
public interface USB {
public default void method(){
System.out.println("这是一个默认方法");
}
}
3.静态方法(static)
目的:同类对象共享的内容
使用方法:接口名称.方法名称();
public interface USB {
public static void method(){
System.out.println("这是一个静态方法");
}
}
4.私有方法
私有方法 只有接口中的静态/默认方法可以使用 private
多态
多态是java继封装性,继承性之后的第三大特性,extends继承和implements接口实现,是多态的前提
为什么要用多态? 我们现实中的事物常常会有许多形态,比如小明即是一个人也是一个学生,
代码中体现多态,就是父类引用指向子类对象
向上转型格式:
- 父类类型 变量名 = new 子类类型
- 接口名称 变量名 = new 实现类名称
向下转型格式:
- 子类类型 变量名 = (子类类型) 父类对象
- 实现类名称 对象名称 = (实现类名称) 接口名称
向上转型的意义:当接口中的方法已经能够满足需求时,这样更加安全方便
向下转型的意义:能够访问接口类中的独有方法,这些方法接口中不存在
主方法中
访问成员方法:new谁就优先使用谁 没有向上找
访问成员变量
1.直接通过对象名称访问:看等号左边是谁 优先使用 没有则向上找
2.间接通过成员方法访问:看方法属于谁 优先使用 没有则向上找
总结一句话就是:
成员变量)编译看左边,运行看左边
成员方法)编译看左边,运行看右边
举个例子
我建立了一个USB的接口,它的功能是(打开/关闭)设备.
public interface USB {
public abstract void open(); //打开设备
public abstract void close(); //关闭设备
}
它拥有两个接口类(鼠标和键盘)来实现接口
这两个接口类有覆盖方法和自己独有的方法
鼠标接口类
public class Mouse implements USB{
@Override
public void open() {
System.out.println("打开鼠标");
}
@Override
public void close() {
System.out.println("关闭鼠标");
}
/**
* Mouse独有的方法
*/
public void click(){
System.out.println("点击鼠标");
}
}
键盘接口类
public class KeyBoard implements USB{
@Override
public void open() {
System.out.println("打开键盘");
}
@Override
public void close() {
System.out.println("关闭键盘");
}
/**
* KeyBoard独有方法
*/
public void click1(){
System.out.println("敲击键盘");
}
}
有一个电脑设备去使用接口
public class Cmoputer {
//笔记本自己的方法
public void PowerOn(){
System.out.println("笔记本开机");
}
public void PowerOff(){
System.out.println("笔记本关机");
}
//使用设备方法
public void useDevice(USB obj){
obj.open(); //打开设备
if(obj instanceof Mouse){
Mouse useMouse = (Mouse)obj; //如果obj对象是Mouse类创建 就向下转型
useMouse.click(); //调用Mouse类中click独有的方法
}else if(obj instanceof KeyBoard){
KeyBoard useKeyBoard =(KeyBoard)obj; //如果obj对象是KeyBoard类创建 就向下转型
useKeyBoard.click1();
}
obj.close(); //关闭设备
}
}
在主方法中我们可以测试
public class Demo01Test {
public static void main(String[] args) {
Cmoputer cmoputer = new Cmoputer();//创建一个computer对象
USB mouse = new Mouse(); //向上转型
cmoputer.PowerOn(); //笔记本自己的方法
cmoputer.useDevice(mouse); //接口实现的方法
cmoputer.PowerOff(); //笔记本自己的方法
}
}
测试结果:
笔记本开机
打开鼠标
点击鼠标 //通过向下转型实现接口没有 但是接口类中拥有的方法
关闭鼠标
笔记本关机
以上代码的示例图