📄 java入门(8).htm
字号:
</CODE></PRE></TD></TR></TBODY></TABLE>
<P><B> 8.3 创建子类</B></P>
<P><B> 传授新知</B></P>
<P> 至此,我们已经学会了如何创建自己需要的自定义类,已经学会了创造!</P>
<P> 正如创建Java的类一样,人们在认知了大自然后,也开始创建属于自己的“类”,如“电灯”、“电视”、“电脑”、“电话”、“飞机”等……。这些伟大的发明使得历史的车轮迅速地向前滚去。</P>
<P> 然而,人类之所以得以这样迅速的发展,不仅得益于杰出科学家们的不断创新,还得益于继承,使得每一项新的发明与创造都是“站在巨人头上的进步”。人们在创造新事物的同时,还总结了一些用于创造的基础配件,如“集成电路”、“模板”,新的发明,就从组装、改进、复用它们而得到。</P>
<P> 软件危机后,人们意识到在软件工程领域也采用这种思想,必将使软件得于更大的发展。这就是软件复用。而在面向对象方法学中,创建子类就是用以实现这种思想的有效工具。在这一小节中,我们将学习如何继承一个类,创建出更有特色的子类。</P>
<P> 举个例子,我们在程序中定义了一个类:“交通工具”,而这时我们需要一个“客机”类,我们就可以通过继承“交通工具”类共性(公用变量和方法),然后新增一些“客机”类独有的属性和方法,就能够很轻松地构建出新的类来。如下图所示:</P><A
href="Java入门(8).files/8-7.jpg"><IMG alt=8-7
src="Java入门(8).files/8-7.jpg" width=450 border=0></A>
<P><B> 图8-7 继承示意图</B></P>
<P> 下面,我们一起来看一个创建子类的例子。假设我们已有一个交通工具类vehicle:</P>
<P> 源程序:vehicle.java</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public class vehicle
{
public int passenger;
public float carfare;
public vehicle()
{
passenger=0;
}
public vehicle(int p)
{
passenger=p;
}
public getgrossEarnings()
{
float grossEarnings= passenger*carfare;
return grossEarnings;
}
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 在这个类中,有两个成员变量:</P>
<P> 1) passenger:定义为公用的,整型数,用于存放乘客总数;</P>
<P> 2) carfare:定义为公用的,浮点数,用于存放票价。</P>
<P> 同时,我们构造了两个构造器方法:</P>
<P> 1) 如果没带参数,则将成员变量passenger赋值为0;</P>
<P> 2) 如果带上了一个int型参数,则将成员变量passenger赋值为这个数。</P>
<P> 另外,在程序中还有一个有用的方法:getgrossEarnings(),它用来统计这次的总收入(当然是乘客数乘以票价)。</P>
<P> 分析完这个类后,我们现在需要构建一个“客机”类,完成的功能与“交通工具”类相同。这时,我们就可以使用创建子类的方法来构建这个“客机”类:plane。</P>
<P> 源程序:plane.java</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public class plane extends vehicle
{
public int baggage;
public float bPrice;
public plane()
{
super();
baggage=0;
}
public vehicle(int p,int b)
{
super(p);
baggage=b;
}
public getgrossEarnings()
{
float grossEarnings= passenger*carfare+baggage*bPrice;
return grossEarnings;
}
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 下面,我们来分析一下这段程序:</P>
<P> 1)public class plane extends vehicle</P>
<P> 第1句,是用来定义类的。它与其它类的定义不同的地方是后面加上了extends
vehicle,其中extends的意思是扩展,也就是plane类是从vehicle类中扩展的,也就是说plane是vehicle的子类。</P>
<P> 大家应该还记得,我们在编写Java小应用程序的时候,定义类的时候,后面都有一个extends
Applet,说明所有的小应用程序是从Applet类中扩展的。其中Applet是Java语言为小应用程序提供的一个类。</P>
<P> 2)</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public int baggage;
public float bPrice;
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 由于在客机上,行李也是计费的,因此,我们需要加上两个变量baggage和bPrice,这样,plane类就有了四个成员变量:</P>
<P> § passenger:从超类vehicle中继承,用于存放乘客总数;</P>
<P> § carfare:从超类vehicle中继承,用于存放票价;</P>
<P> § baggage:新的成员变量,整型,用于存放计费行李总公斤数;</P>
<P> § bPrice:新的成员变量,浮点数,用于存放每公斤行李的运费。</P>
<P> 3)</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public plane()
{
super();
baggage=0;
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 这一段程序构建了一个构造器方法。在这个方法中使用了一个第一次遇到的语句:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
super();
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 这个语句是用来调用超类的构造器,也就是调用了vehicle类的构造器vehicle()。</P>
<P> 同样,我们以相同的方法定义了另一个构造器plane(int p,int b)。</P>
<P> 4)</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
public getgrossEarnings()
{
float grossEarnings= passenger*carfare+baggage*bPrice;
return grossEarnings;
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P> 由于行李也要计费了,所以总收入的计算方法也就不一样了,因此,在plane类中重新定义了方法getgrossEarnings,这叫做“方法overlay”。实际上就是指在子类中,重新定义一个新的同名方法,替换掉超类中定义的同名方法。</P>
<P><B> 自测练习</B></P>
<P> 1) 创建子类时,我们使用了一个新的关键字,是___________。</P>
<P> a. subclass b.modifyclass c.extends d.inherit </P>
<P> 2) 子类继承时,___________不被继承。</P>
<P> a.静态变量 b私有变量 c.公用变量</P>
<P> 3) 子类继承时,___________不被继承。</P>
<P> a.私有方法 b公用方法 c.静态方法</P>
<P> 4) 如果你想要在子类中引用超类的构造器方法,应该使用___________。</P>
<P> a.不可以引用 b.super() c.直接使用超类的构造器方法名</P>
<P> 5) 子类中的“方法overlay”是指:_______________。</P>
<P> a. 在子类中,将超类里定义的某个方法去掉,使其不生效</P>
<P> b.在子类中,重新定义超类里定义过的某个方法,使其更适合于子类。</P>
<P><B> 练习答案</B></P>
<P> 1)c 在Java语言中,用extends来表示继承一个类。</P>
<P> 2)b 用private定义的私有变量将不会被继承到子类中去。</P>
<P> 3)a 用private定义的私有方法将不会被继承到子类中去。</P>
<P> 4)b 在Java语言中定义了一个super()的方法,为子类提供了使用超类 的构造器方法的手段。</P>
<P> 5)b 方法overlay就是对其重新定义,使其更适合子类。</P></SPAN><BR>
<DIV class=contentblk align=right>【责任编辑:<A
href="mailto:fjxufeng@linuxaid.com.cn">风过留枫</A>】<BR>【<A
href="javascript:window.close();">关闭窗口</A>】</DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!----><IMG
height=2 alt=smallline src="Java入门(8).files/smallline.gif" width=600
border=0>
<TABLE cellSpacing=0 cellPadding=0 width=605 border=0>
<TBODY>
<TR>
<TD height=2></TD></TR>
<TR>
<TD class=blackblk>
<TABLE cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=blackblk align=middle>相关内容</TD>
<TD class=brightblk
width="80%"> </TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD height=2></TD></TR>
<TR>
<TD class=blackblk>
<TABLE cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=brightblk>
<TABLE cellSpacing=2 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD></TD></TR>
<TR>
<TD>·
无</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!----><IMG
height=2 alt=smallline src="Java入门(8).files/smallline.gif" width=600
border=0>
<TABLE class=blackblk cellSpacing=1 cellPadding=0 width=605 border=0>
<TBODY>
<TR>
<TD>
<TABLE class=brightblk cellSpacing=0 cellPadding=8 width="100%"
border=0>
<TBODY>
<TR>
<TD>
<FORM name=remarkform onsubmit="return remarkformcheck()"
action=/articles/savecom.jsp method=post><INPUT type=hidden
value=35684958 name=nid>
<TABLE cellSpacing=0 cellPadding=2 width="100%"
bgColor=#e1e1e1 border=1>
<TBODY>
<TR align=middle>
<TD colSpan=2><B>请您评论</B></TD></TR>
<TR>
<TD align=middle width="15%">姓名:</TD>
<TD><INPUT maxLength=64 size=40 name=tfullname> </TD></TR>
<TR>
<TD align=middle width="15%">电邮:</TD>
<TD><INPUT maxLength=64 size=40 name=temail> </TD></TR>
<TR>
<TD align=middle width="15%">留言:</TD>
<TD><TEXTAREA name=tcomments rows=5 wrap=VIRTUAL cols=50></TEXTAREA>
</TD></TR>
<TR align=middle>
<TD colSpan=2><INPUT type=submit value=发表 name=Submit> <INPUT type=reset value=取消 name=Submit2>
</TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!----><IMG
height=2 alt=smallline src="Java入门(8).files/smallline.gif" width=600
border=0>
<TABLE class=blackblk cellSpacing=1 cellPadding=0 width=605 border=0>
<TBODY>
<TR>
<TD>
<TABLE class=brightblk cellSpacing=0 cellPadding=8 width="100%"
border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD width="50%" bgColor=#cccccc><B>网友:用户</B></TD>
<TD bgColor=#cccccc><B>发表时间:2002-08-31
11:02:04</B></TD></TR>
<TR>
<TD bgColor=#f5f5f5 colSpan=2> </TD></TR>
<TR>
<TD bgColor=#f5f5f5 colSpan=2>是不是应该分页呢?</TD></TR>
<TR>
<TD bgColor=#f5f5f5 colSpan=2> </TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -