JAVA_SE_笔记整理(面向对象三(多态,抽象类))
面向对象三(多态,抽象类)
1、多态:
某一事物,在不同时刻表现出来的不同状态。
举例:
猫可以是猫的类型。猫 m = new 猫();
同时猫也是动物的一种,也可以把猫成为动物
动物 d = new 猫();
水在不同时刻的状态
多态的前体和体现
继承关系
有方法重写
有父类有引用指向子类对象
多态案例以及成员访问特点
按照前提写一个多态案例
成员访问特点:
成员方法:
编译看左边(语法),运行看右边(执行代码)
成员变量:
编译看左边(语法),运行看左边(执行父类变量)
静态方法:
编译看左边(语法),运行看左边(执行父类静态方法)
多态好处与弊端:
多态的好处:
提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)
多态的弊端:
不能访问子类特有功能
如果能够访问子类的特有功能呢?
多态中的转型
2、多态转型:
向上转型:
用子类对象赋值给父类变量,将子类交给了父类;父类引用执行子类对象;
动物 d = new 猫();
向下转型:
用父类对象赋值给子类变量,将父类交给了子类;父类引用转为子类对象;
猫 m = (猫)父类对象;
子类转父类,默认转换
父类转子类,强制类型转换,前提,这个父,本质就是子类,在可以转换。如果本质就是父类,编译不会报错,执行时报运行时异常。java.lang.ClassCastException
3、制作帮助文档
我想要对数组进行操作
如何制作一个说明书呢?
A:写一个工具类
B:对这个类加入文档注释
怎么加呢?
加些什么东西呢?
@author
@version V.10
@param 这是要被遍历的数组
@return 返回数组中的最大值
D:格式
javadoc -d 目录 ArrayTool.java
目录:就可以写一个文件夹的路径
制作帮助文档出错:
找不到可以文档化的公共或受保护的类:告诉我们类的权限不够
4、抽象类
在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
如果一个类中包含了一个或者多个抽象方法,类就必须定义为abstract(抽象)。“抽象方法”属于不完成的方法,只包含一个声明,没有方法主体。
抽象类的特点:
抽象类和抽象方法必须用abstract关键字修饰
格式:
abstract class 类名{
…
}
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类,一定是抽象类。
抽象类不能实例化
那么,抽象类如何实例?
按照多态的方式,由具体的抽象类的子类实例。
抽象类的子类
要么事抽象类,要么实现抽象类中的所有抽象方法。
抽象类的成员特点:
成员变量:可以是变量,也可以是常量
构造方法:有构造方法,但是不能实例化,那么构造方法的作用是什么?用于父类数据初始化,在子类new或者主动调用父类构造时。
成员方法:可以有抽象方法,作用是限定子类必须完成某些动作。
可以有非抽象方法,提供代码复用性。
抽象类的几个小问题:
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
abstract不能和哪些关键字共存
private 冲突
final 冲突
static 无意义