超萌新级的Java学习心得——类与对象(三)

多态与继承和封装一样是面向对象的一个重要方法,即对于接口的多种不同的实现方法。这种说法有一点广泛,我在这次文章里只描述重载与重写。

重载与重写是两种不同的概念,重载(Overload)是一个类中的多态性表现;重写(Override)是父类与子类之间的多态性表现。

这种说法有一点抽象,我通俗点讲,就是你有一把步枪,可以攻击中距离的敌人;但是有一天,你遇到了远处的敌人,于是你加上延长枪管和先进光学瞄准镜,得到步枪改_远;然后你遇到了烟雾中的敌人,于是给装上热成像与烟雾透镜,得到了步枪改_烟……上述操作是根据不同的作战环境得到不同的步枪便与重载类似。有一天,你把步枪给了你的孩子,你的孩子直接改装了步枪,在下面加上了下挂霰弹发射器,变成了步枪改_c8……上述操作是子类对父类的方法进行重写。

现在我们来看一看具体的例子:

重载的例子:

我们来制作一个程序,用于判断输入的是什么数据类型,用类中的check()方法实现。这个程序实现的难度在于我们不知道数据类型,因此判断方法check()应该用什么类型的形式参数我们也不知道。因此,我们将check()方法重载,根据不同的参数进行不同的操作:

超萌新级的Java学习心得——类与对象(三)

在上面的类中,我编写了三个check()方法,但是参数的数据类型不同,如果重载是可以根据不同的输入值执行不同的操作,那么这三个方法应该是check()这一个方法根据int、char、double这三种不同的数据类型而执行相应的操作,我们使用下面的测试程序来验证:

超萌新级的Java学习心得——类与对象(三)

结果为

超萌新级的Java学习心得——类与对象(三)

证实。

 

重写的例子:

我们借用上面的Test_Overload_Override_super()类作为父类(命名暴露了一切),我们继续编写一个Test_Overload_Override_son()类作为子类,代码如图:

超萌新级的Java学习心得——类与对象(三)

然后我们重写了父类的check()方法,但是参数类型是int,如果重写成立,那意味着我们在调用check()且参数类型是int时,我们会调用子类的check(),我们使用下面的测试程序来验证:

超萌新级的Java学习心得——类与对象(三)

结果为:

超萌新级的Java学习心得——类与对象(三)

前三个结果证明父类是没有问题的,第四个是子类重写的check()(参数类型为int)输出的结果,但是参数类型为char的check()方法依然引用的是父类的方法,这说明我们一定程度上可以把重载的几个方法看成几个不同的方法,子类改变的是是父类中参数类型为int的方法,其他没有重写的方法不受影响。

 

插曲:关于UML类图的简单绘制,这里我使用的是软件Visio,此外,还有许多好用的软件及网页可以实现绘制UML图等各种工程图流程图,这里麻烦大家自行百度。

我拿出一个我之前绘制过UML类图:

超萌新级的Java学习心得——类与对象(三)

这是我的一个实验报告用的UML类图,描述一个Fan类,我们先无视掉各个变量和方法的具体内容,只看符号之类的。

标题是这个类的类名,如Fan就是这个类的类名;

 

下一层是这个类的变量,其中变量名前面的符号表示的是这个变量的修饰符:

“+”表示公有,对应public;

“-”表示私有,对应private;

“#”表示保护,对应protected;

下划线表示静态变量;

变量的格式为:修饰符 变量名 :变量类型(=data)

如:+number : int —— public int number;

 

下一层为这个类中的方法

格式为:修饰符 方法名(参数名:参数类型) : 方法类型

如:+tostring() : String —— public String tostring();

 

继承关系使用带箭头(箭头空心)的直线表示,

关联关系使用带箭头(箭头实心)的直线表示,如图:

超萌新级的Java学习心得——类与对象(三)

 

Student与Employee两个类继承了Person类,同时Employ类创建了MyDate类的对象。

其他的内容之后我深入学习之后会进一步详细说明。

 

致此,类与对象这个系列暂时告一段落,接下来将会讲Java的可视化界面,接口类及部分事件监听器的说明,同时也会实现绘图板功能;三篇文章之后,感觉至今还需要学习更多更好的知识,再把它写成文章进行总结。

 

预告,接口类,可视化界面。