接口
接口中的方法全都是抽象方法,用来指定一些规则,让子类去重写。接口的作用主要体现在一下两点
1.指定规则
2.利用这些规则给类做功能扩展
接口的定义和使用
接口使用interface关键字来定义,使用implements来实现。
//定义接口
public interface Inter{
//接口中的抽象方法
public abstract void method(); //可以省略 public abstract ,接口会默认添加
}
//实现接口
public class InterImpl implements Inter{
//复写抽象方法
public void method(){
System.out.println("复写实现类方法");
}
}
接口的成员特点
1.接口中的成员变量,默认被 public static final 修饰
2.接口中的方法,默认被 public abstract 修饰
3.接口中不能写构造方法
JDK7以后对接口做了一些更新
JDK7: 接口中的方法全都是抽象方法,子类必须重写
JDK8: 允许在接口中写默认方法(被 public default 修饰的方法),可选重写
如果多个接口中有相同的默认方法,子类必须重写
允许在接口中写静态方法(被 public static 修饰),使用接口名调,可选重写
JDK9: 允许在接口中写私有方法 (被 private 修饰),只能在本接口中使用
接口中的方法可用的权限修饰符只有 public , private 两种,不写会默认用 public , 虽然也有可能出现 default ,但其并不作为权限修饰符使用,只是一种固定写法
接口中的成员方法只能用 public 修饰,不写会默认用 public
类与接口的关系
1.类与类的关系:只能单继承
2.类与接口的关系:多实现关系
3.接口与接口关系:多继承关系
子类在继承父类的同时也可以实现接口
多态
同一个对象可以用多种数据类型(父类、接口)进行接收。
多态的前提
1.要有继承、实现的关系
2.要有方法重写
3.父类/接口接收子类对象
Animal a=new Dog(); //Animal是Dog的父类
Usb u=new Mouse(); //Usb是Mouse的接口
多态的成员访问特点
1.成员变量的访问特点
编译看左边(父类),运行也看左边(父类)
大白话:父类有就用父类的,父类没有就报错了
调用时需注意
public class Test {
public static void main(String[] args) {
Usb接口 u = new U盘();
// u.a; //报错,not a statement(不是声明)
int b = u.a;
System.out.println(u.a);
}
}
2.成员本方法的访问特点
编译看左边(父类),运行看右边(子类)
大白话:子类复写父类方法,就执行子类的方法。
多态的好处和弊端
1.好处:提高了代码的扩展性
把方法的参数写成父类、接口,调用方法时可以传递任意的子类对象。
2.弊端:不能调用子类特有的方法 需要向下转型后方可调用
多态的转型
1.向上转型
Animal a=new Dog(); //多态的写法,就是向上转型
2.向下转型
//判断变量a具体是什么类型
if(a instanceof Dog){
Dog dog=(Dog)a;
dog.swimming();
}
注意:多态的转型并不是随意的,它是一个还原的动作。原本是什么类型,才能转换为什么类型。
3.多态转型可能会遇到的问题
ClassCastException: 多态的转型出现的问题,类型转换错了