第五课 继承与多态.docx
- 文档编号:28367933
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:33
- 大小:50.88KB
第五课 继承与多态.docx
《第五课 继承与多态.docx》由会员分享,可在线阅读,更多相关《第五课 继承与多态.docx(33页珍藏版)》请在冰豆网上搜索。
第五课继承与多态
第五课 继承与多态
5.1继承
继承是存在于面向对象程序中的两个类之间的一种关系,当一个类拥有另一个类的所有数据和操作时,就称这两个类之间具有继承关系。
被继承的类称为父类或超类,继承了父类或超类的所有数据和操作的类称为子类。
5.2Java的继承
JAVA仅支持单重继承,即一个子类只能有一个父类。
5.2.1派生子类
●通过extends关键字实现继承
●private的方法和属性不可继承
5.2.2域的继承与隐藏
●父类的所有非私有域是各子类都有的域的集合:
继承
●子类中变量对同名父类变量和属性的隐藏
●子类执行继承父类的操作时,处理父类的变量,执行自己定义的方法时,操作自己定义的变量。
程序5-1 TestHiddenField.java
程序源代码说明
publicclassTestHiddenField
{
publicstaticvoidmain(Stringargs[])
{
D200_Cardmy200=newD200_Card();
my200.balance=50.0;
System.out.println("Fatherbalance:
"+my200.getBalance());
//子类D200_Card中没有getBalance()方
//法,故继承父类PhoneCard的方法,所
//以使用PhoneCard的balance域
if(my200.performDial())
System.out.println("Sonbalance:
"+my200.balance);
//子类D200_Card中有balance域,所以
//使用自己的balance域
}
}
abstractclassPhoneCard
{
doublebalance;
abstractbooleanperformDial();
doublegetBalance()
{
returnbalance;
}
}
abstractclassNumber_PhoneCardextendsPhoneCard //抽象子类Number_PhoneCard
{
longcardNumber;
intpassword;
StringconnectNumber;
booleanconnected;
booleanperformConnection(longcn,intpw)
{
if(cn==cardNumber&&pw==password)
{
connected=true;
returntrue;
}
else
{
connected=false;
returnfalse;
}
}
}
classD200_CardextendsNumber_PhoneCard //具体子类D200_Card
{
doubleadditoryFee;
doublebalance;
booleanperformDial()
{
if(balance>(0.5+additoryFee))
{
balance-=0.5+additoryFee;
returntrue;
}
else
returnfalse;
}
}
5.2.3方法的继承与覆盖
子类可以实现对父类同名方法的覆盖。
●方法的覆盖与域的隐藏的区别在于:
子类隐藏父类的域只是使之不可见,父类的同名域在子类对象中仍占有内存空间,而子类方法对父类方法的覆盖将清除父类方法占用的内存空间。
●子类对父类方法的覆盖应保持与父类完全相同的方法头声明,即方法名,返回值,参数列表都相同。
程序5-2 TestOverLoad.java
程序源代码说明
publicclassTestOverLoad
{
publicstaticvoidmain(Stringargs[])
{
D200_Cardmy200=newD200_Card();
my200.balance=50.0;
System.out.println("Fatherbalance:
"+my200.getBalance());
//因为子类D200_Card已定义了方法
//getBalance(),所以覆盖父类
//PhoneCard定义的方法getBalance()
if(my200.performDial())
System.out.println("Sonbalance:
"+my200.balance);
}
}
abstractclassPhoneCard
{
doublebalance;
abstractbooleanperformDial();
doublegetBalance() //父类PhoneCard定义的方法getBalance()
{
returnbalance;
}
}
abstractclassNumber_PhoneCardextendsPhoneCard
{
longcardNumber;
intpassword;
StringconnectNumber;
booleanconnected;
booleanperformConnection(longcn,intpw)
{
if(cn==cardNumber&&pw==password)
{
connected=true;
returntrue;
}
else
{
connected=false;
returnfalse;
}
}
}
classD200_CardextendsNumber_PhoneCard
{
doubleadditoryFee;
doublebalance;
booleanperformDial()
{
if(balance>(0.5+additoryFee))
{
balance-=0.5+additoryFee;
returntrue;
}
else
returnfalse;
}
doublegetBalance() //子类D200_Card定义的方法getBalance()
{
returnbalance;
}
}
5.2.4this与super
●Java系统默认,每个类都缺省地具有null,this,super三个域,可以直接使用。
null代表空,在定义一个对象但尚未为其开辟内存单元时可以指定这个对象为null
Node*pnode;
pnode=NULL;
if(pnode==NULL)newmalloc(….)
deletepnode;
pnode=NULL;
this代表当前对象的一个引用,但它不是地址,与指针无关,仅仅是对象的另一个名字
super表示当前对象的直接父类对象
●父类对象与子类对象的转换要注意以下原则:
子类对象可以被视为是其父类的一个对象
父类对象不能被当作是其某一个子类的对象
如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数
如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化为子类对象的引用
程序5-3 HiddenField.java
程序源代码说明
publicclassHiddenField
{
publicstaticvoidmain(Stringargs[])
{
D200_Cardmy200=newD200_Card();
my200.balance=50.0;
System.out.println("Fatherbalance:
"+my200.getBalance());
if(my200.performDial())
System.out.println("Sonbalance:
"+my200.balance);
//用直接父类Number_PhoneCard的balance
//域,它没有,则用再上一层PhoneCard的balance
}
}
abstractclassPhoneCard
{
doublebalance;
abstractbooleanperformDial();
doublegetBalance()
{
returnbalance;
}
}
abstractclassNumber_PhoneCardextendsPhoneCard
{
longcardNumber;
intpassword;
StringconnectNumber;
booleanconnected;
booleanperformConnection(longcn,intpw)
{
if(cn==cardNumber&&pw==password)
{
connected=true;
returntrue;
}
else
{
returnfalse;
}
}
}
classD200_CardextendsNumber_PhoneCard
{
doubleadditoryFee;
doublebalance;
booleanperformDial()
{
if(balance>(0.5+additoryFee))
{
balance-=0.5+additoryFee;
returntrue;
}
else
returnfalse;
}
doublegetBalance()
{
returnsuper.balance;//表示使用它直接父类的balance域
}
}
5.3多态
多态即程序中同名的不同方法共存的情况,以下为两种常见的多态方式:
●子类对父类方法的覆盖
●利用重载在同一个类中定义多个同名的不同方法
5.4Java的重载
重载是类对自身已有的同名方法的重新定义。
5.5构造函数的继承与重载
●构造函数可以从父类那里继承,也可以互相重载。
●类的若干个构造函数可以相互调用,一个构造函数调用另一构造函数时,可以使用关键字this,同时这个调用语句应该是整个构造函数的第一个可执行语句。
●子类继承父类的构造函数遵循以下原则
(1)子类无条件地继承父类的不含参数的构造函数
(2)如果子类没有构造函数,则根据上一条,继承父类无参数的构造函数
(3)如果子类有构造函数,则先继承父类无参数的构造函数,再执行自己的构造函数
(4)子类可以继承父类的有参数的构造函数,必须用super关键字显式使用,而且该语句必须是子类构造函数的第一个可执行语句。
5.6包
Java中的包把各种类组织在一起,使用程序功能清楚,结构分明。
5.6.1创建包
●缺省情况下,系统会为每一个.java源文件创建一个无名包,该.java文件中定义的所有类都隶属于这个无名包,可以相互引用非private的域或方法。
但它不能被其它包所引用。
●创建包在整个.java文件中第一个语句为 package包名;
packageCardClasses;
packageCardSystem.CardClasses; (.是目录分隔符)
程序5-4 PhoneCard.java
程序源代码说明
packageCardClasses; //创建包,以下的类都放在包CardClasses中
abstractclassPhoneCard
{
doublebalance;
abstractbooleanperformDial();
doublegetBalance()
{
returnbalance;
}
}
abstractclassNumber_PhoneCardextendsPhoneCard
{
longcardNumber;
intpassword;
StringconnectNumber;
booleanconnected;
booleanperformConnection(longcn,intpw)
{
if(cn==cardNumber&&pw==password)
{
connected=true;
returntrue;
}
else
{
connected=false;
returnfalse;
}
}
}
classD200_CardextendsNumber_PhoneCard
{
doubleadditoryFee;
doublebalance;
booleanperformDial()
{
if(balance>(0.5+additoryFee))
{
balance-=0.5+additoryFee;
returntrue;
}
else
returnfalse;
}
}
5.6.2包的引用
一个类只能引用同一包中的类,否则可使用以下方法:
●使用包名,类名前缀
●加载需要使用的类
●加载整个包
●CLASSPATH
importjava.io.*;
5.7接口
5.7.1接口概述
●接口是用来实现类间多重继承的功能的
●接口的定义:
将完成特定功能的若干属性组织成相对独立的属性集合,该属性集合就是接口
●ActionListener接口的功能 actionPerformed()方法
●接口定义的仅仅是实现某一特定功能的一组功能的对外接口和规范,而并没有真正实现这个功能,真正实现在继承这个接口的各个类中完成,因而通常把接口功能的继承称为“实现”。
5.7.2声明接口
[public]interface接口名 [extends父接口名列表]
{
}
●接口是由常量和抽象方法组成
●类只能有一个父类,但可实现多个接口(中间用“,”分隔)
●public接口是公共接口,没有public的接口只能被同一包中的其他类和接口使用
●接口中的属性都是publicstaticfinal的,方法都是publicabstract的,方法还可用其他语言写,这时是native修饰的。
5.7.3实现接口
一个类要实现接口时,要注意:
●在类的声明部分,用implements关键字声明该类将要实现哪些接口
●如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法
●如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。
但是对于这个抽象类任何一个非抽象的子类面言,它们父类所实现的接口中的所有抽象方法都必须有实在的方法体。
●一个类在实现某接口的抽象方法时,必须使用完全相同的方法头,如果所实现的方法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新的方法,而不是实现已有的抽象方法。
●接口的抽象方法的访问限制符都已指定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。
程序5-5 ImplementActionListener.java
程序源代码说明
importjava.applet.*;
importjava.awt.*;
importjava.awt.event.*;
publicclassImplementActionListenerextendsAppletimplementsActionListener
{
//该类要实现接口ActionListener
TextFieldpassword=newTextField("Password");
Buttonbtn=newButton("Hidden");
publicvoidinit()
{
add(password);
add(btn);
btn.addActionListener(this);
}
publicvoidactionPerformed(ActionEvente)
{
password.setEchoChar('*');
password.selectAll();
}
}
小结
本节围绕着继承和重载这两大特色,介绍了面向对象程序设计的一些较深入的问题,即继承,派生,隐藏,多态等问题。
习题:
1.什么是多态,多态有哪些方式?
答:
多态即程序中同名的不同方法共存的情况,有以下两种方式:
●子类对父类方法的覆盖
●利用重载在同一个类中定义多个同名的不同方法
2.什么是接口?
答:
将完成特定功能的若干属性组织成相对独立的属性集合,该属性集合就是接口,接口是用来实现类间多重继承的功能的,接口定义的仅仅是实现某一特定功能 的一组功能的对外接口和规范,而并没有真正实现这个功能,真正实现在继承这个接口的各个类中完成,因而通常把接口功能的继承称为“实现”。
3.根据下面的要求编程实现复数类ComplexNumber
(1)复数类ComplexNumber的属性
m_dRealPart:
实部,代表复数的实数部分
m_dImaginPart:
虚部,代表复数的虚数部分
(2) 复数类ComplexNumber的方法
ComplexNumber() 构造函数,将实部,虚部都置为0
ComplexNumber(doubler,doubleI) 构造函数,创建复数对象的同时完成复数的实部,虚部的初始化
GetRealPart() 获取实部
GetImaginaryPart() 获取虚部
SetRealPart(doubled) 设置实部
SetImaginaryPart(doubled) 设置虚部
ComplexAdd(ComplexNumberc) 复数相加
ComplexAdd(doublec) 复数相加
ComplexMinus(ComplexNumberc) 复数相减
ComplexMinus(doublec) 复数相减
ComplexMulti(ComplexNumberc) 复数相乘
ComplexMulti(doublec) 复数相乘
ToString() 把当前复数对象的实部,虚部组合成a+bi的字符串形式
第六课 工具类与算法
6.1语言基础类库
6.1.1Object类
Object类是类库中所有类的父类。
有如下方法:
●protectedObjectclone()生成当前对象的一个拷贝,并返回这个复制对象
●publicbooleanequals(Objectobj) 比较两个对象是否相同,是则返回true
●publicfinalClassgetClass()获取当前对象所属的类信息,返回Class对象
●protectedvoidfinalize() 定义回收当前对象时所需完成的清理工作
●publicStringtoString() 返回当前对象本身的有关信息,接字符串对象返回
6.1.2数据类型类
数据类型类与基本数据类型密切相关。
下面介绍Interger类:
●MAX_VALUE域和MIN_VALUE域分别规定了int类型量的最大值和最小值
●构造函数publicInteger(itnvalue)和publicInteger(Strings)可以分别利用一个基本数据类型int的量和一个字符串对象来生成一个Integer对象
●数据类型转换方法分别将当前对象所对应的int量转换成其他基本数据类型的量,并返回转换后的值
publicdoubledoubleValue()
publicintintValue()
publiclonglongValue()
●字符串与int量相互转化的方法
publicStringtoString()
publicstaticintparseInt(Strings)
publicstaticIntegervalueOf(Strings)
6.1.3Math类
Math类的方法都是static的。
publicfinalstaticdoubleE;//数学常量e
publicfinalstaticdoblePI;//圆周率常量
publicstaticdoubleabs(doublea); //绝对值
publcistaticdoubleacos(doublea); //反余弦
publicstaticdoubleexp(doublea);//e的参数次幂
publicstaticdoublefloor(doublea) //不大于参数的最大整数
publicstaticdoubleIEEEremainder(doublef1,doublef2); //求余
publicstaticdoublelog(doublea) //自然对数
publicstaticdoublemax(doublea,doubleb); //最大值
publicstaticfloatmain(floatafloatb)//最小值
publicstaticdoublepow(doublea,doubleb) //乘方
publicstaticdoublerandom() //产生0和1(不含)之间的伪随机数
publicstaticdoublerint(doublea) //四舍五入
publicstaticdoublesqrt(doublea) //平方
6.1.4System类
System类的属性和方法都是static的。
System类的属
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五课 继承与多态 第五 继承