级java语言实验3指导面向对象程序设计继承封装多态.docx
《级java语言实验3指导面向对象程序设计继承封装多态.docx》由会员分享,可在线阅读,更多相关《级java语言实验3指导面向对象程序设计继承封装多态.docx(17页珍藏版)》请在冰豆网上搜索。
级java语言实验3指导面向对象程序设计继承封装多态
上机实验三:
面向对象程序设计(继承、封装、多态)
类是面向对象程序设计的基础,是Java的核心和本质所在,在Java中,所有的语言元素都封装在类中。
编写java程序的过程就是从现实世界中抽象出java可实现的类,并用合适的语句定义它们的过程,本节将学习类的应用,以及如何创建类的实例,通过类的继承更有效的组织程序结构,明确类之间的关系。
掌握本节所讲的内容后,读者就可以使用面向对象技术编写java程序了。
接口是特殊的抽象类,只包含常量和方法的定义,而没有方法的实现,也就是说接口是方法定义和常量值的集合。
包是Java语言中有效管理类的一个机制。
通过关键字package声明包语句,package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包。
使用import语句可以引入包中的类。
一、实验目的
1)掌握类的定义和使用
2)掌握对象的声明和使用
3)了解构造函数的概念和使用
4)掌握类的继承关系和派生方法
5)掌握多态的概念与使用
6)掌握接口的定义和使用
7)掌握Java中包的应用
二、实验内容
1)类的声明
2)定义类成员变量以及成员方法
3)实例化类、创建类对象以及类方法的调用
4)类的继承
5)通过实例理解接口的定义
6)通过实例熟悉接口的应用
7)正确应用Java中包和import语句
三、实验步骤
1)类和类的实例化
一个类的实现包括两部分:
类声明和类体。
(1)、类声明
[public][abstract][final]classclassName[extendssuperclassName]
[implementsinterfaceNameList]
{……}
期中修饰符[public][abstract][final]说明类的属性
className为类名
superclassName为父类的名字
interfaceNameList为类实现的接口列表
(2)、类体
类体定义如下
classclassName
{
[public|protected|private][static][final][transient][volatile]
TypevariableName;//成员变量
[public|protected|private][static][final][abstract][native][synchronized]
returnTypemethondName([paramList])[throwsexceptionList]
{statements}//成员方法
}
(3)、成员变量
成员变量的声明方式如下
[public|protected|private][static][final][transient][volatile]
TypevariableName;//成员变量
其中:
[public|protected|private]→可见性
[static]→静态变量(类变量),相当于实例变量
[final]→常量
[transient]→暂时性变量,用于对象存档
[volatile]→变量,用于共发线程的共享
(4)、成员方法
[public|protected|private][static][final][abstract][native][synchronized]
returnTypemethondName([paramList])[throwsexceptionList]//方法体的声明
{statements}//方法体
其中:
[public|protected|private]→可见性
[static]→静态方法,也叫类方法,可以通过类名直接调用
[final]→方法不能被重写
[abstract]→抽象方法,没有方法体(体现多态时常用)
[native]→集成其他语言的代码
[synchronized]→控制多个并发线程的访问
例子3-1请根据注释填写语句,并上机调试成功
根据注释添加语句,并调试和修改程序,使其能够执行。
---------------------------------------------------------------------------------------------------------------------
classRetangle{
publicRetangle(doublel,doublew)
{length=l;width=w;}
publicdoublecalcPerimeter()//返回周长
{
(1)}
publicdoublecalcArea()//返回面积
{
(2)}
publicvoidShow()//显示矩形的长和宽
{(3)}
protecteddoublelength;
protecteddoublewidth;
}
classSquareextendsRetangle{
publicSquare(doubleside)//调用父类的构造方法
{(4)}
publicdoublecalcPerimeter()
{returnwidth*4;}
publicvoidShow(){
System.out.println(“边长为”+width+“的正方形”);
}
}
publicclassTest{
publicstaticvoidmain(Stringargs[]){
Squaresq1=newSquare(2.0);
sq1.Show();
System.out.println("正方形的边长为"+sq1.calcPerimeter());
(1)return(width+length)*2;
(2)returnwidth*length;
(3)System.out.print("length="+length+"\n"+"width="+width;
(4)super(side,side);
}
}
-----------------------------------------------------------------------------------------------------------------
填写的语句是:
classRetangle{
publicRetangle(doublel,doublew)
{length=l;width=w;}
publicdoublecalcPerimeter()//返回周长
{return(width+length)*2;}
publicdoublecalcArea()//返回面积
{returnwidth*length;}
publicvoidShow()//显示矩形的长和宽
{System.out.print("length="+length+"\n"+"width="+width);
}
protecteddoublelength;
protecteddoublewidth;
}
classSquareextendsRetangle{
publicSquare(doubleside)//调用父类的构造方法
{super(side,side);}
publicdoublecalcPerimeter()
{returnwidth*4;}
publicvoidShow(){
System.out.println("边长为"+width+"的正方形");
}
}
publicclassTest{
publicstaticvoidmain(Stringargs[]){
Squaresq1=newSquare(2.0);
sq1.Show();
System.out.println("正方形的周长为"+sq1.calcPerimeter());
}
}
2)类的继承
继承是面向对象程序设计的方法中的一种重要手段,通过继承可以更有效的组织程序的结构,明确类之间的关系。
继承通过extends关键字来实现,子类继承父类的属性和行为,同时可以修改父类的属性和行为,并添加新的属性和行为。
Java不支持多重继承。
创建子类的格式如下
classSubClassextendsSuperClass{
……
}
其中SubClass→子类的名称
extends→继承的关键字
SuperClass→父类的名字
例子3-2请分析程序,填写语句的功能注释,并上机调试成功。
下面这个例子通过点、圆的层次结构,介绍类的继承。
----------------------------------------------------------------------------
importjava.text.DecimalFormat;//调用格式化数字输出
importjavax.swing.JOptionPane;//joptionpane让您轻松弹出一个标准的对话框
classPoint{//父类点的的定义
protectedintx,y;//定义点的坐标
publicPoint(){//确定构造函数
setPoint(0,0);
}
publicPoint(inta,intb){//构造函数重载带参数的构造函数
setPoint(a,b);
}publicvoidsetPoint(inta,intb){//(
1)
x=a;
y=b;
}
publicintgetX(){returnx;}//获得X的坐标
publicintgetY(){returny;}//获得Y的坐标
publicStringtoString(){
return"["+x+","+"y"+"]";
}
}
/*子类圆的定义*/
classCircleextendsPoint{//圆类继承父类点类
protecteddoubleradius;//定义圆的半径
publicCircle(){setRadius(0);}//定义子类的构造函数,隐含调用了父类的构造函数
publicCircle(doubler,inta,intb){
super(a,b);//
(2)
setRadius(r);
}
publicvoidsetRadius(doubler){
radius=(r>=0.0?
r:
0.0);//(3)
}
publicdoublegetRadius(){//获得圆半径
returnradius;
}
publicdoublearea(){//(4)
returnMath.PI*radius*radius;
}
publicStringtoString(){//圆的半径。
以及圆心坐标转换成字符串输出
return"Center="+"["+x+","+y+"]"+";Radius="+radius;
}
}
publicclassInheritanceTest{
publicstaticvoidmain(Stringargs[]){
PointpointRef,p;//声明两点对象
CirclecircleRef,c;//声明两圆对象
Stringoutput;//定义一个字符串变量
p=newPoint(30,50);//给点对象赋值
c=newCircle(2.7,120,89);//给圆对象赋值
//把点对象和圆对象转换成字符串后给字符串output赋值
output="Pointp:
"+p.toString()+"\nCirclec:
"+c.toString();
pointRef=c;
output=output+"\n\nCirclec(viapoineRef):
"+pointRef.toString();
circleRef=(Circle)pointRef;
output=output+"\n\nCirclec(viapoineRef):
"+circleRef.toString();
DecimalFormatprecision2=newDecimalFormat("0.00");
output+="\nAreaofc(viacircleRef):
"+precision2.format(circleRef.area());
//将圆定义成点对象输出
if(pinstanceofCircle){//(5)
circleRef=(Circle)p;
output+="\n\ncastsuccessful";
}elseoutput+="\n\npdosenotrefertoaCircle";
//利用对话框输出相关信息
JOptionPane.showMessageDialog(null,output,
"InheritanceTset",JOptionPane.INFORMATION_MESSAGE);
//退出
System.exit(0);
}
}
语句的功能注释:
(1)方法成员,设置变量x、y
(2)调用父类的构造函数
(3)设置半径
(4)求取面积
2.接口的定义与应用
接口声明的形式如下所示:
interface接口名字
{……//常量定义和方法定义
}
接口使用的关键字是implements,形式如下所示:
classAimplementsPrintable,Addable
其中类A中使用接口Printable和Addable
接口的特点:
1.类体中必须实现接口中定义的所有方法;
2.接口中的方法和常量必须是public的。
3.实现方法时,方法头必须一致(返回值类型,名字,参数);
4.父类被继承时,接口同时被继承;
5.接口也可被继承,关键字为extends;
6.接口一般表示功能,而类一般表示属性。
例子3-3本实例实现了一个字符栈。
程序思路是:
首先定义一个字符栈的接口CharStackInterface,定义了栈的空间容量,规定栈所包含的方法,然后定义栈类CharStack,该类实现了字符栈的接口,最后编写测试类StackDemo进行测试。
请根据编程思路实现字符栈的接口CharStackInterface,并调试程序正确运行,写出程序执行结果。
------------------------------------------------------------------------------------------------------------------------------
interfaceCharStackinterface{
//需要实现的字符栈接口
}
classCharStackimplementsCharStackinterface{
chardata[];
inttop;
CharStack(){
data=newchar[maxsize];
}
publicvoidinitStack(){
top=-1;
}
publicbooleanpush(charx){
if(!
full()){
data[++top]=x;
returntrue;
}
else{
returnfalse;
}
}
publiccharpop(){
if(!
empty()){
top--;
returndata[top+1];
}
else{
return'\0';
}
}
publicbooleanempty(){
returntop==-1;
}
publicbooleanfull(){
returntop==maxsize-1;
}
}
publicclassStcckDemo{
publicstaticvoidmain(Stringargs[]){
CharStacks=newCharStack();
s.initStack();
s.push('A');
s.push('B');
System.out.println(s.pop());
System.out.println(s.pop());
}
}
字符栈的接口CharStackInterface:
程序的执行结果:
四、上机实践
1.编写程序:
在圆类的基础上派生出了圆锥类,按照注释填空,并调试执行成功,写出程序的执行结果。
classCircle
{doubler;
Circle(){
(1)}//无参构造方法,默认半径为1.0
Circle(doublea)//有参构造方法
{
(2)}
doubleArea(){(3)}//返回面积
doubleGirth(){(4)}//返回周长
}
classConeextendsCircle{
doubleh;
Cone()
{super();
h=1.0;
}
Cone(doublerr,doublehh){
(5)//为半径和高赋值
}
doubleV(){(6)}//返回圆锥的体积
}
publicclassConeTest{
publicstaticvoidmain(Stringargs[])
{Conec1=newCone();
System.out.println(c1.V());
Conec2=newCone(1.0,3.0);
System.out.println(c2.V());
}
}
------------------------------------------------------------------------------
按照注释的填空:
(1)r=1.0
(2)this.a=a;
(3)returnArea
(4)returnGirth
(5)rr=r;hh=h;
(6)returnV
程序的执行结果:
2.下面程序实现了抽象类的继承和接口的实现,同时还体现了接口的回调和向上转型,请调试该程序,根据注释填空,并写出程序执行结果。
-----------------------------------------------------------------------------
abstractclassPerson{
publicabstractvoidEat();
publicabstractvoidSleep();
}
interfaceFather{
publicvoidSmoking();
publicvoidGoFishing();
}
interfaceMon{
publicvoidWatchTV();
publicvoidCook();
}
classMe{//
(1)继承Person类,实现Father和Mon接口
publicvoidEat(){
System.out.println("我喜欢吃鱼香茄子");
}
publicvoidSleep(){
System.out.println("我喜欢睡觉时做梦");
}
publicvoidSmoking(){
System.out.println("我不喜欢抽烟");
}
publicvoidGoFishing(){
System.out.println("我喜欢钓鱼");
}
publicvoidWatchTV(){
System.out.println("我喜欢看电视");
}
publicvoidCook(){
System.out.println("我不太会做菜");
}}
publicclassTest3{publicstaticvoidmain(String[]args){
Personp1=newMe();
p1.Eat();
//
(2)调用p1的Sleep()方法
Monm1=(Mon)p1;
//(3)调用m1的WatchTV()方法
m1.Cook();
}}
----------------------------------------------------------------------------------------------------------------------
根据注释填空:
程序执行结果:
3.将程序上机调试成功,并写出程序执行结果。
----------------------------------------------------------------------------------------------------------------------
importjava.util.*;
interfaceInstrument5{
inti=5;
voidplay();
Stringwhat();
voidadjust();
}
classWind5implementsInstrument5{
publicvoidplay(){
System.out.println("Wind5.play()");
}
publicStringwhat(){return"Wind5";}
publicvoidadjust(){}
}
classPercussion5implementsInstrument5{
publicvoidpl