多态
多态的前提 (polymorphic)和体现
有继承关系
有方法重写(其实没有也是可以的,但是没有这个就没有意义)
有父类引用指向子类对象
父 f=new 子()
动物 d=new 猫()
d.show()
动物 d=new 狗()
d.show()
动态中的成员访问特点
A:成员变量
编译看左边。运行看左边
B: 构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
C:成员方法
编译看左边 ,运行看右边
D:静态方法
编译看左边,运行看左边
(静态是和类相关的,算不上重写,所以,访问的还是左边的)、
多态的好处:
1.提高了代码的维护性(继承)
2.提高了代码的扩展性( 由多态保障 )
多态的弊端:
不能使用子类的特有功能
抽象类
在java中,一个方法体的方法,定义为抽象方法,而类中如果有抽象方法,该类必须是抽象类。
抽象类的概述:(动物不应该定义为具体的东西,而且动物中的吃,睡等行为也不应该是具体的)
我们把一个不是具体的功能称为抽象功能,而一个类中如果有抽象的功能,这个类必须是抽象类
抽象类的特点:
A: 抽象类和抽象方法必须用abstract关键字修饰
格式
abstract class 类名 {}
public abstract void eat();
B: 抽象类不一定有抽象方法,有抽象方法的 类 一定是抽象类
C: 抽象类不能实例化 因为它不是具体的
abstract class Animal{}
Animal a=new Animal();// 错误: Animal是抽象的; 无法实例化
抽象类是有构造方法的,但是不能实例化,构造方法的作用:
用于子类访问父类数据的初始化
抽象类的子类
A:如果不重写先抽象方法,该子类是一个抽象类
B:重写所有的抽象方法,这个时候子类是一个具体的类
抽象类的实例化问题[其实是靠具体的子类实现的,是多态的方式]
如果 Animal.class 是抽象类的父类,Pig.class是重写了所有方法抽象方法的子类
则:
Animal a=new Pig();
可以通过上述方式对 抽象类进行实例化
抽象类的成员特点
成员变量
成员变量即可以是变量也可以是常量
构造方法
有——作用是用于子类访问父类的初始化
成员方法
即可以是抽象的,也可以是非抽象的
抽象类的成员方法特性:
A:抽象方法 强制要求子类做的事情
B:非抽象方法 子类继承的事情,提高代码的复用性
注意,当子类中有自己特有的东西时,一般用自己的类进行测试(不用多态)
一个类中如果没有抽象方法,可不可以定义为抽象类?意义?
可以
意义是:不让创建对象
抽象关键字不能和哪些关键字共存?
private 冲突
final 冲突
static 无意义
//错误: 非法的修饰符组合: abstract和private
//private abstract void show();
//因为私有 不能被继承,即不能被重写,而抽象类则强制抽象方法被重写
//final abstract void show();
因为最终的是不能被重写的,而抽象类强制要求方法被重写
static abstract void show();
static 修饰方法不需要创建对象 可以被类直接调用 假如抽象类是FU.class 则Fu.show()。
但是,show方法没有方法体,所以调用无意义