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同样也可以使用多态的形式来进行改进

老师管理系统同学生管理系统修改内容大致一样就不详细描述了

版权声明:本文为ling-long原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ling-long/p/13810892.html