11.面向对象(3)
MODULE 11 面向对象
- 会定义接口
- 会在接口中定义抽象方法,默认方法,静态方法,成员变量
- 会调用接口中的成员
- 会利用多态的方式new对象
- 知道多态的前提
- 要知道使用多态的好处
- 会在多态的前提下,向下转型
- 会利用instanceof判断类型
一.接口
(一)接口的介绍
1.接口:是一个引用数据类型,是一个标准,规则
2.关键字:
(1)interface接口
public interface 接口名{}
(2)implements 实现
实现类 implements 接口名{}
3.接口中可以定义的成员
(1)jdk7以及之前:
抽象方法:public abstract -> 即使不写public abstract,默认也有
成员变量:public static final 数据类型 变量名 = 值 -> 即使不写 public static final,默认也有
final是最终的,被final修饰的变量不能二次赋值,所以我们一般将 final修饰的变量视为常量
(2)jdk8:
默认方法:public default 返回值类型 方法名(形参){}
静态方法:public static 返回值类型 方法名(形参){}
(3)jdk9开始:
` 私有方法:private的方法
(二)接口的定义以及使用
1.定义接口:
public interface 接口名{}
2.实现:
public class 实现类类名 implements 接口名{}
3.使用:
(1)实现类实现接口
(2)重写接口中的抽象方法
(3)创建实现类对象(接口不能直接new对象)
(4)调用重写的方法
(三)接口中的成员
1.抽象方法
(1)定义格式
public abstract 返回值类型 方法名(形参);
(2)注意
不写public abstract 默认也有
(3)使用
A.定义实现类,实现接口
B.重写抽象方法
C.创建实现类对象,调用重写的方法
2.默认方法
(1)格式:
public default 返回值类型 方法名(形参){
方法体
return 结果
}
(2)使用
A.定义实现类,实现接口
B.默认方法可重写,可不重写
C.创建实现类对象,调用默认方法
3.静态方法
(1)格式
public static 返回值类型 方法名(形参){
方法体
return 结果
}
(2)使用
接口名直接调用
默认方法和静态方法 -> 可以作为临时加的一个小功能
4.成员变量
(1)格式
public static final 数据类型 变量名 = 值
(2)相关知识点:final
final代表最终的,被它修饰的变量,不能二次赋值,可以视为常量
(3)特点
不写public static final默认也有
(4)使用
接口名直接调用
(5)注意
A.被static final修饰的成员变量需要手动赋值
B.习惯上我们会将static final修饰的成员变量名大写
(四)接口的特点
1.接口可以多继承 -> 一个接口可以继承多个接口
public interface InterfaceA extends InterfaceB,InterfaceC{}
2.接口可以多实现 -> 一个实现类可以实现一个或者多个接口
public class InterfaceImp1 implements InterfaceA,InterfaceB{}
3.一个子类可以继承一个父类的同时实现一个或多个接口
public class Zi extends Fu implements InterfaceA,InterfaceB{}
4.注意:
继承也好,实现接口也罢,只要是父类中或者接口的抽象方法,子类或者实现类 都要重写
当一个类实现多个接口时,如果接口中的抽象方法有重名且参数一样的,只需要重 写一次
当一个类实现多个接口时,如果多个接口中默认方法有重名的,且参数一样的,必须 重写一次默认方法
(五)接口和抽象类的区别
相同点:
(1)都位于继承体系的顶端,用于被其他类实现或者继承
(2)都不能new
(3)都包含抽象方法,其子类或者实现类都必须重写这些抽象方法
不同点:
(1)抽象类:一般作为父类使用,可以有成员变量,构造,成员方法,抽象方法等
(2)接口:成员单一,一般抽取接口,抽取的都是方法,视为功能的大集合
(3)类不能多继承,但是接口可以
二.多态
1.面向对象三大特征:封装 继承 多态
2.怎么学:
(1)不要从字面上理解多态两个字,要从使用形式上掌握
(2)要知道多态的好处
(3)要知道多态的前提
(一)多态的介绍
1.前提
(1)必须有子父类继承或者接口实现关系
(2)必须有方法的重写(没有重写,多态没有意义),多态主要玩的是重写方法
(3)new对象:父类引用指向子类对象
Fu fu = new Zi() ->理解为大类型接收了一个小类型的数据 -> double b = 10
2.注意
多态下不能直接调用子类特有功能
(二)多态的基本使用
(三)多态条件下成员的访问特点
1.成员变量
看等号左边是谁,先调用谁的变量
2.成员方法
看new的是谁,就先调用谁的成员方法,子类没有找父类
(四)多态的好处
1.问题描述:
如果使用原始的方式neew对象(等号左右两边一样),既能调用重写的,还能调 用继承的,还能调用自己特有的成员,但是多态方式new对象,只能调用重写的, 不能直接调用子类特有的成员,那为啥还要用多态呢?
2.多态方式和原始方式new对象的优缺点:
原始方式:
(1)优点:既能调用重写的,还能调用父类非私有的,还能调用自己特有的
(2)缺点:扩展性差
多态好处:
(1)优点:扩展性强
Fu fu = new Zi()
double b = 10;
b = 100L;
(2)缺点:不能直接调用子类特有功能
形参传递父类类型,调用此方法父类类型可以接收任意它的子类对象
传递哪个子类对象,就指向哪个子类对象,就调用哪个子类对象重写的方法
(五)多态中的转型
1.向上转型
(1)父类引用指向子类对象
好比是:double b = 1;
2.向下转型
(1)好比是强转,将大类型强转成小类型
(2)表现方式:
父类类型 对象名1 = new 子类对象() -> 向上转型 -> double b = 1
子类类型 对象名2 = (子类类型)对象名1 -> 向下转型 -> int i = (int)b
3.想要调用子类特有功能,需要向下转型
(六)转型可能会出现的问题
1.如果等号两边类型不一致,会出现类型转换异常(ClassCastException)
2.解决:
在向下转型之前,先判断类型
3.怎么判断类型:instanceof
判断结果是boolean型
4.使用:
对象名 instanceof 类型 -> 判断的是关键字前面的对象是否符合关键字后 面的类型