JavaSE进阶第三天
课程大纲:
- 接口
- 多态
一.接口
1.什么是接口
现实世界的接口:USB接口、插排
Java中的接口
使用interface定义的特殊的类,比抽象类更加抽象,
因为接口中的所有方法都是抽象方法(JDK8之前)。
2.接口的好处
2.1定义规则
2.2提高拓展性
3.接口的格式
3.1定义格式
public interface 接口名 {
}
接口名和类名的命名规范一致,遵循大驼峰式命名
3.2使用格式
方式一:
public class 实现类 implements 接口 {
}
方式二:
public interface 子接口 extends 父接口 {
}
4.接口的特点
1、接口不能创建对象(不能实例化)
2、一个类去实现接口的时候必须实现其中所有的抽象方法,要么该类要变成抽象类
5.接口的成员特点
5.1成员变量
成员变量:没有
常量:可以有
有默认修饰符,public static final
5.2 成员方法
非抽象方法:不能有 (JDK8之前)
抽象方法:可以有
有默认修饰符,public abstract
构造方法 没有
6.抽象类的成员的特点
6.1 成员变量
成员变量:可以有
常量:可以有
6.2 成员方法
抽象方法:可以有
非抽象方法:可以有
6.3 构造方法
一定有
二.接口的新特性
这些新特性针对的都是接口中的方法的,而且这些方法都是非抽象的方法。
1. JDK8的新特性
1.1 默认方法
1.1.1 格式
public default 返回值类型 方法名(参数列表){
方法体;
}
注意:
public可以省略,如果显式写出只能用public权限修饰符default必须要有.
1.1.2 特点
1、可以被实现类所继承
2、默认方法不要求强制重写,但是也可以进行重写
实现类在重写的时候,权限修饰符必须是public,同时要去掉default
1.1.3 应用场景
利于接口的功能的扩展,如果定义成抽象方法,所有的实现类都必须
重写这些方法,所有的实现类都要进行修改,如果定义成默认方法之后
就可以将实现的功能定义在接口,而实现类继承这个默认方法的功能即可,
不要要求实现类去进行强制重写。
1.2 静态方法
1.2.1 格式
public static 返回值类型 方法名(参数列表){
方法体;
}
注意:
public可以省略,如果显式写出只能用public权限修饰符,static必须要有
1.2.2 特点
只能通过接口名去调用这个方法,实现类无法使用该方法
1.2.3 应用场景
利于接口的扩展,如果这个方法不想给实现类使用,那么就可以定义为静态方法
2. JDK9的新特性
2.1 私有方法
2.1.1 格式
private 返回值类型 方法名(参数列表){
方法体;
}
private static 返回值类型 方法名(参数列表){
方法体;
}
2.1.2 注意
权限修饰符必须是private,而且不能省略
私有的默认的方法,default要去掉
私有的静态的方法,static必须加上
2.1.3 特点
只能在当前接口中使用,出了接口无法使用
2.1.4 应用场景
抽取接口中的默认方法和静态方法的共性代码,而抽取到方法中的这些共性代码又不希望外类进行使用
三. 类和接口的关系
类和类的关系:继承关系(extends),单继承,不支持多继承,支持多层继承
类和接口的关系:实现关系(implements),支持单实现、支持多实现,还支持多层实现
class InterImpl implements InterA {} // 单实现
class InterImpl implements InterA,InterB{} // 多实现
class InterImpl implements InterA{} // 多层实现
interface InterA extends InterB{}
接口和接口的关系:继承关系(extends),支持单继承、多继承和多层继承
interface InterA extends InterB {} // 单继承
interface InterA extends InterB,InterC {} // 多继承
interface InterA extends InterB {} // 多层继承
interface InterB extends InterC {}
interface InterC {}
一个类可以在继承的同时有实现关系。
class InterImpl extends Fu implements InterA,InterB,InterC{}
四.类和接口的面试题
面试题:Java是否支持多继承?
Java中的类不支持多继承
Java中的接口支持多继承
面试题:抽象类和接口的区别?
1、定义上的区别
抽象类是abstract class定义的
接口是interface定义的
2、成员上的区别
抽象类:
有构造方法,可以定义成员变量和常量
可以定义抽象方法和非抽象方法
抽象类中的常量没有默认修饰符,定义的时候必须加上final进行修饰
抽象类中的抽象方法没有默认修饰符,定义的是必须加上abstract进行修饰
接口:
没有构造方法,不能定义成员变量,可以定义常量
JDK8之前不能定义非抽象方法,只能定义抽象方法
JDK8之后也可以定义三种固定格式的非抽象方法
接口中的常量有默认修饰符:public static final
接口中的抽象方法有默认修饰符:public abstract
3、和类的关系的区别
抽象类和类之后是继承关系,支持单继承、不支持多继承,支持多层继承
接口和类之间的关系,是实现关系,支持单实现、支持多实现,支持多层实现
五.多态
5.1什么是多态
是面向对象的三大特征(封装、继承和多态)之一
多态:
一个事物表现出来的多种形态
在Java中,多态表示一个对象表现出来的多态形态,
一个对象可以用当前类型进行接收,也可以使用父类类型进行接收
白居易曰:横看成岭侧成峰,远近高低各不同
5.2 多态的前提
1、有继承或者实现关系
2、一般会有方法重写
3、父类的引用指向子类的对象
Animal a = new Cat();
接口的引用指向实现类的对象
Inter i = new InterImpl();
5.3多态下成员访问的特点
成员变量:编译看左边(父类),运行看左边(父类)
成员方法:编译看左边(父类),运行看右边(子类)
静态方法:编译看左边(父类),运行看左边(父类)
总结:编译都看左边(父类),运行除了成员方法看右边之外,其余都看左边
5.4多态的好处和弊端
好处:提高了代码的扩展性
弊端:无法使用子类特有的成员
5.5 多态下的引用类型的转型
向上转型:小类型(子类)自动转为大类型(父类)
父类的引用指向子类的对象
Animal a = new Cat();
向下转型:大类型(父类)转为小类型(子类),要强制转换
目标数据类型 变量名 = (目标数据类型)值;
int i = 10;
byte b = (byte)i;
Cat c = (Cat)a;
向下转型可能出现的问题
问题
ClassCastException:类型转换出错问题
问题出现的原因
向下转型的时候大类型中记录的对象本质的类型和你要转换的类型不一致
解决办法
加入类型判断,是这种类型再转为这种类型,否则不转换
instanceof关键字,运算符
格式:
boolean flag = 对象(名) instanceof 类(型);
判断某个对象(名)是否是指定的类型
注意:
instanceof前面的对象(名)对应的类型
与
instanceof前面类(类型)必须要有子父类关系,或者是相同类型
否则编译都会报错
Cat c = (Cat)a;
````java
向下转型可能出现的问题
问题
ClassCastException:类型转换出错问题
问题出现的原因
向下转型的时候大类型中记录的对象本质的类型和你要转换的类型不一致
解决办法
加入类型判断,是这种类型再转为这种类型,否则不转换
instanceof关键字,运算符
格式:
boolean flag = 对象(名) instanceof 类(型);
判断某个对象(名)是否是指定的类型
注意:
instanceof前面的对象(名)对应的类型
与
instanceof前面类(类型)必须要有子父类关系,或者是相同类型
否则编译都会报错