在学习完UML概述之后,视频中讲了一些关于面向对象技术特点的介绍,而且在剩下的视频中将不再详细的叙述面向对象的知识,所以做个总结,通过视频中的一个小例子来加强对于面向对象技术中的封装、继承、多态、抽象、接口等概念的理解。
例子(一)、封装
描述一个乐团,其中很多乐器,通过编写代码实现各种乐器的调音和演奏。
先拿一个乐器小提琴为例:
Class XiaoTiQin
{
Double price; //属性 琴的价格
<span style="white-space:pre"> </span>Public void play() {system.out.println(“XiaoTiQin play”);} //演奏方法 代码实现
<span style="white-space:pre"> </span>Public void tune() {system.out.println(“XiaoTiQin play”);} //校准方法 代码实现
}
Public class Test
{
<span style="white-space:pre"> </span>Public static void main(int ,string[])
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>XiaoTiQin s1=new XiaoTiQin(); //创建小提琴对象,
<span style="white-space:pre"> </span>S1.tune(); //小提琴先调音
<span style="white-space:pre"> </span>S1.play();
<span style="white-space:pre"> </span>}
}
该段代码定义了两个类,XiaoTiQin和Test,XiaoTiQin类定义了小提琴的价格属性和演奏以及校准方法,在Test类中创建小提琴对象s1,实现小提琴的调音和演奏的方法。程序执行后,main过程实现了s1对象的两个预期方法。
封装性:
通过上面的例子将XiaoTiQin的价格属性以及演奏和校准方法写到XiaoTiQin类中,从而实现了外界只能通过将该类实例化成s1之后才能去调用访问price属性和play与tune方法,这就是面向对象技术中封装性的体现。
例子(二)、抽象+继承
如果乐团中除了小提琴还有小号、钢琴……(上百种乐器),而且要给所有的乐器加上商标的属性,在代码中如何实现?
方法一:在每种乐器的类中都加一条商标的代码即可实现,但是乐器有上百种,这样的话很容易漏加,而且程序员工作量会很大,该方法舍弃。
方法二:抓住小提琴、钢琴、小号的共性即都是乐器,便可以在这些类的基础上抽象出一个新的类“Instrument”:
Abstract Class Instrument //抽象类的定义方法
{
Double price; //属性 琴的价格
String brand; //商标
Public void play(); //演奏 只有方法的接口
Public void tune(); //校准
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
注意,在抽象的父类中,方法一般只提供接口,具体实现要在子类中编写,这样定义之后,乐器的属性就可以直接继承了。
Class XiaoTIqin extends Instrument //继承父类时要加上extends
{
<span style="white-space:pre"> </span>Public void play() {system.out.println(“XiaoTiQin play”);} //演奏方法 接口的具体实现在类中编写//
<span style="white-space:pre"> </span>Public void tune() {system.out.println(“XiaoTiQin play”);} //校准方法 代码实现
}
So,在主程序中仍以小提琴为例:
Public class Test
{
Public static void main(int ,string[])
{
<span style="white-space:pre"> </span> XiaoTiQin s1=new XiaoTiQin(); //创建小提琴对象,
<span style="white-space:pre"> </span> S1.tune(); //小提琴先调音
S1.play();
}
}
这样就实现了在面向对象技术中的继承。
即通过抽象出子类和父类,子类可以直接调用父类中的所有的属性和方法,这种机制就叫做继承。
例子(三)、多态
拿小提琴、钢琴、小号来举例子,如何编写主程序从而实现演奏顺序的灵活性呢?
此时需要在text类中多加一个方法yanzou。
Public class Test
{
<span style="white-space:pre"> </span>Public void yanzou(Instrument x) //新加的方法
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> x.play();
<span style="white-space:pre"> </span>}
Public static void main(int ,string[])
<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> XiaoTiQin s1=new XiaoTiQin(); 创建小提琴对象,
<span style="white-space:pre"> </span> GangQin s2=new GangQin();
<span style="white-space:pre"> </span> XiaoHao s3=new XiaoHao();
<span style="white-space:pre"> </span> S1.tune(); 小提琴先调音
<span style="white-space:pre"> </span> S2.tune();
<span style="white-space:pre"> </span> S3.tune();
<span style="white-space:pre"> </span> Instrument ss1=new XiaoTiQin();
<span style="white-space:pre"> </span> Instrument ss2=new GangQin();
<span style="white-space:pre"> </span> Instrument ss3=new XiaoHao();
<span style="white-space:pre"> </span> While(乐谱结束)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> Instrument a=读取下一个演奏对象;
a.play(); //
<span style="white-space:pre"> </span> }
}
}
在这个例子中,通过创建一个yanzou的方法,以及创建三个乐器的实例ss1、ss2、ss3,利用一个判断的机制,当乐曲演奏结束则读取下一种乐器来进行演奏,a.play则实现了多态的体现,即给不同的对象传相同的激励,得到不同乐器演奏的响应,就是面向对象技术中多态的体现。
通过这三个例子的讲解,让我对于面向对象中的封装、抽象、继承的概念又上深了一个层次,在UML接下来的学习中,我想也会遇到这种理念去画图并理解.