java学习 学生管理系统-v6.0 多态
java学习 学生管理系统-v6.0
本次将使用多态来对上次的学生管理系统-v5.0进行改进。
多态
多态的概述
一个对象,多种形态;
多态的前提
有继承或有实现
多态的代码形式(重点)
父类类型 变量名 = new 子类类名();
多态中成员访问的特点
成员变量(了解)
编译和运行都看父类类型
成员方法(重点)
编译看左边(父类),运行看右边(子类);
多态的好处和弊端
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型座位参数,该方法就可以接收这父类的任意子类对象
多态的弊端:不能使用子类特有的功能
多态的转型
向上转型:子类对象,转成父类,Fu f = new Zi();
向下转型:父类对象,转成子类,Zi z = (Zi) f;
在想下转型的过程中,会出现异常 java.lang.ClassCastException 该异常为类转换异常
public class Test {
public static void main(String[] args) {
//向方法中传递一个Zi2的对象
test(new Zi2());
}
//测试方法,获取一个父类对象
public static void test(Fu fu) {
//将父类对象向下转型为子类1
Zi1 z1 = (Zi1) fu;
}
}
//父类
class Fu {
}
//子类1继承父类
class Zi1 extends Fu {
}
//子类2继承父类
class Zi2 extends Fu {
}
观察该段代码可以发现,在向下转型的过程中,转换的结果是一个Zi1对象,而在主方法中我们传递的是一个Zi2类型的对象,这就发生了冲突,为了解决类型转换异常,在转换之前,应该先判断被转的对象是否与目标类型一致
判断格式
if(对象名 instanceof 类名){
转换语句
}
这样在转换之前会先判断传入的Fu类对象是否能向下转换为该类,如果可以返回true,继续执行转换语句,这样就解决了类型转换异常
代码实现
现在我们知道了多态的好处和使用方法,现在我们就用多态来对之前的学生管理系统在进行更进一步的改进
分析如何改进
首先我们先来看看,代码中哪一块可以用多态来进行改进
在之前我们使用了两种方法向学生列表中添加学生,所以创建了OtherStudentController和StudentController两个Controller,而我们想要在两者中更换时,就需要在程序入口处删除之前的对象,再重新创建新的对象,这样操作起来很繁琐,但我们发现,他们两者均继承了BaseStudentController这个类,所以我们就可以再这里用多态进行改进。
开始改进
首先我们需要先创建一个Factory包,再包下创建一个StudentFactory类,类中创建一个返回值类型为BaseStudentController的getStudentController方法,并返回一个BaseStudentController对象,这样返回的对象是多变的,既可以返回StudentController对象,又可以返回OtherStudentController对象
public class StudentFacatory {
public BaseStudentController getStudentController(){
return new OtherStudentController();
//return new StudentController();
}
}
最后,我们再程序入口就不用我们自己创建StudentController对象了,只需创建StudentFactory对象,调用里面的getStudentController方法就可以了
//StudentController studentController = new StudentController();
//OtherStudentController studentController = new OtherStudentController();
BaseStudentController studentController = new StudentFacatory().getStudentController();
小结
代码中上次修改的StudentDAO同样也可以使用多态的形式来进行改进
老师管理系统同学生管理系统修改内容大致一样就不详细描述了