目录
[抽象类的常见应用场景: 模板方法设计模式](#抽象类的常见应用场景: 模板方法设计模式)
多态
基本概念:
什么是多态:多态在继承/实现 情况下的一种现象,表现为: 对象多态、行为多态
咱们来举出一个现实中的一个例子来解释对象多态和行为多态是个啥东西:
对象多态:你是你父母的儿子,是老师的学生,我们每个人会有不同的角色,这个就是生活中的对象多态
行为多态: 我们每个人都会跑,但是有人跑的慢,有的人跑的快,同一种行为会有不同的表现形式,这就是我们说的行为多态
多态的代码实现:
多态的识别技巧:编译看左边,运行看右边
多态的前提: 有继承/实现关系; 存在父类引用子类对象 ;存在方法重写
有一点需要注意: 多态是对象、行为的多态,Java中的属性(成员变量)不太多态
使用多态的好处
在多态形式下,右边对象是解耦合的,更便于扩展和维护
定义方法的时,使用父类类型的形参,可以接收一切子类对象,扩展性更强,更便利
上面的意思就是我们现在要体测,老师和学生都要参加,我们在体测这个方法中设置形参的时候,设置父类People数据类型就行了,就可以接收他所有的子类对象
类型转换
遇到的问题
多态中有个问题就是对象是不能调用子类中的私有方法的
解决方法
自动类型转换: 父类 变量名 = new 子类()
强制类型转换: 子类 变量名 = (子类) 父类变量
强制类型转换的一个注意事项
存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错
运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来
正确形式
错误形式
强制转换类型的时候,Java建议我们要进行instanceof来进行判断
final
final关键字是最终的意思,可以修饰(类,方法,变量)
修饰类: 该类被称为最终类,特点是不能被继承了
修饰方法:该方法被称为最终方法,特点是不能被重写了
修饰变量: 该变量只能被赋值一次(变量: (1) 局部变量(2)成员变量 : 静态成员变量和实例成员变量)
常量
使用static final 修饰的成员变量就被称为常量
作用: 通常用于记录系统中的配置
抽象类
抽象类是不能定义对象的,假如说我有一个抽象类为A , A a = new A();这样会报错的
Java中有一个关键字叫: abstract,他是抽象的意思,可以用它修饰类,成员方法
abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法
啥是个抽象类?
抽象类的注意事项,特点
2.类该有的变量(成员变量,方法,构造器)抽象类都可以有
3.抽象类最主要的特点: 抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现
4.子类中的方法必须重写,否则他也是一个抽象类,用abstract来修饰
抽象类的场景和好处
父类知道每个子类都要做某一个行为 ,但每个子类都做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态(对象多态和行为多态)(很重要呀,知道好处了,就能深刻理解这东西了)
我们来举个例子来看看
假如说我现在有需求,某宠物游戏,需要管理猫,狗的数据。猫的数据有;名字,行为是:喵喵喵的叫~,
狗的数据有:名字,行为是: 汪汪汪的叫~,请用面向对象编程设计该程序
思路: 因为我们看见这个猫和狗都有名字,我们可以将猫和狗定义一个父类Animal,父类中写一个成员变量,来存放名字,可以将Animal设置成抽象类,然后子类来实现这个方法重写
抽象类的常见应用场景: 模板方法设计模式
接口
基本概念
语法:
另外说明一点: 接口中是不存在构造器啥的,只有我上面写的两种东西
因为这个是抽象类的有抽象方法,所以是不能创建A类对象的
注意: 接口不能创建对象,接口是用来被类实现的,实现接口的类称为实现类
上面是我们实现的两个接口,下面是我们的实现类,一个实现类可以有多个接 口(可以理解成干爹),,实现类实现多个接口,必须重写全部接口的全部抽象方法,否则实现类需要定义成抽象类
接口的好处
弥补了类单继承的不足,一个类可以同时有多个接口
JDK8开始,接口新增了三种形式的方法:
public interface A {
/**
* 1.默认方法(实例方法):使用default修饰,默认会被加上public修饰,注意,只能使用接口的实现类对象调用
* 默认是public方法修饰的
*/
default void test1()
{
System.out.println("这是默认方法");
test2();
}
/**
* 私有方法:必须用private修饰(jdk9才开始支持)
*/
private void test2()
{
}
/**
* 类方法(静态方法):调用static修饰,默认会被加上public修饰,注意:只能用接口来调用
*/
static void test3()
{
}
}
接口的多继承
一个接口可以同时继承多个接口
public interface C extends B,A{
}
注意事项:如果继承的多个接口冲突,就像下面这样,I和J中都有test1方法,但是一个有返回值,一个没有返回值,则就不支持多继承了
当一个子类既继承了父类,又存在接口,我们可以看下面这个图,IT和Fu都有run方法,但是子类会优先调用它父亲的run方法