JAVA面向对象(多态,抽象类)
多态:同一个对象(事物),在不同时刻体现出来不同的状态
多态的前提:
- 要有继承关系
- 要有方法重写(没有也可以,但是就没有意义了)
- 要有父类引用指向子类对象:父 f = new 子();
多态中的成员访问特点:
- 成员变量
- 编译看左边,运行看左边(左右边指:父 f = new 子()的左右变 )
- 构造方法
- 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
成员方法
- 编译看左边,运行看右边
- (由于成员方法存在方法重写,所以他运行看右边)
静态方法
- 编译看左边,运行看左边
- (静态和类相关,算不上重写,所以,访问还是左边的)
多态的好处:
- 提高了代码的维护性(继承保证)
- 提高了代码的扩展性(由多态保证)
多态的弊端:
- 不能使用子类的特有功能
怎么用呢?
- 创建子类对象调用方法即可(可以,但是很多时候不合理,而且太占内存了)
- 把父类的引用强制转换为子类的引用(向下转型 )
对象转换问题
向上转型:
Fu f = new Zi( );(从子到父)
父类引用指向子类对象
向下转型:
Zi z = (Zi) f;(从父到子 )
父类引用转为子类对象
抽象类特点
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类和抽象方法必须用abstract关键字修饰.eg:abstract class 类名 {}
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
- 抽象类不能实例化(如何实例化呢:按照多态的方式,有具体的子类实例化,这也是多态的一种,抽象类多态)
- 抽象的子类要么是抽象类,要么重写抽象类中所有的抽象方法
抽象类的成员变量特点
- 成员变量可以是变量法,也可以是常量
构造方法
- 有构造方法,但是不能实例化
- 构造方法作用:用于子类访问父类数据的初始化
成员方法
- 有抽象方法,强制要求子类做的事情(不复写会报错)
- 也有非抽象方法,子类继承的事情,提高代码复用性
abstract不能喝哪些关键字共存
- private 冲突(私有不能被继承,而抽象就是要被继承后重写)
- final 冲突(被final修饰后不能改变,故不能被重写)
- static 无意义(静态方法可以用类名调用,但是抽象方法中没有方法体,)