实验9 JAVA面向对象.docx
《实验9 JAVA面向对象.docx》由会员分享,可在线阅读,更多相关《实验9 JAVA面向对象.docx(16页珍藏版)》请在冰豆网上搜索。
实验9JAVA面向对象
实训报告
实验九JAVA面向对象编程(5)
【实验目的】
1.掌握JAVA语言接口的定义和使用。
2.掌握JAVA语言抽象类的声明和使用。
3.掌握JAVA语言抽象方法的概念和使用。
4.掌握类成员变量及方法的使用。
【预习内容】
1.JAVA抽象类的定义格式;
2.JAVA接口定义的语法格式;
3.this和super关键词的功能和区别;
4.JAVA构造方法的重载;
5.JAVA多态的概念,及重载和覆盖的区别;
【实验内容及步骤】
1.上机验证题
1.阅读下面的程序,在理解的基础上并运行程序:
(1)定义一个Point(点)类,然后创建Point(点)类的子类Line(线)。
最后通过构建一个测试类来输出线段的长度。
程序中通过super(a,b)调用父类Point的构造方法为父类的x和y赋值。
在子类Line的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使用this引用,告诉编译器是为当前类的成员变量赋值。
在length和toString方法中使用父类成员变量时,使用super引用,告诉编译器使用的是父类的成员变量。
(2)使用this、super和super()的程序文件LX7_4.java,源代码如下。
classPoint{
protectedintx,y;
Point(inta,intb){
setPoint(a,b);
}
publicvoidsetPoint(inta,intb){
x=a;
y=b;
}
}
classLineextendsPoint{
protectedintx,y;
Line(inta,intb){
super(a,b);
setLine(a,b);
}
publicvoidsetLine(inta,intb){
this.x+=a;
this.y+=b;
}
publicdoublelength(){
intx1=super.x,y1=super.y,x2=this.x,y2=this.y;
returnMath.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
publicStringtoString(){
return"直线端点:
["+super.x+","+super.y+"]["+
x+","+y+"]直线长度:
"+this.length();
}
}
publicclassLX3_10{
publicstaticvoidmain(Stringargs[]){
Lineline=newLine(50,50);
System.out.println("\n"+line.toString());
}
}
(3)编译并运行程序,结果如图所示。
图7.3
[程序运行过程]
(4)在以上程序的基础上,请修改程序实现:
(1)从键盘输入2个点的x,y坐标,求出该两点间的直线距离。
(2)从键盘输入1个初始点的x,y坐标,和与终点间的x,y偏移值,求出终点的x,y坐标,以及该两点间的直线距离。
[程序清单]
importjava.util.*;
publicclassPoint
{
privateintx;
privateinty;
publicdoublegetX()
{
returnx;
}
publicintsetX(intx)
{
this.x=x;returnx*x;
}
publicintgetY()
{
returny;
}
publicintsetY(inty)
{
this.y=y;returny*y;
}
publicPoint()
{}
publicPoint(intx,inty)
{
this.setX(x);
this.setY(y);
}
publicstaticvoidadd(inta,intb)
{
doublec=Math.sqrt(a+b);
System.out.println("两点间的距离为:
"+c);}
publicstaticvoidmain(String[]args)
{
Scannersc=newScanner(System.in);
Pointp=newPoint();
System.out.println("请输入x1的横坐标");
inti1=sc.nextInt();
System.out.println("请输入x1的纵坐标");
intj1=sc.nextInt();
System.out.println("请输入x2的横坐标");
inti2=sc.nextInt();
System.out.println("请输入x2的纵坐标");
intj2=sc.nextInt();
add(p.setX(i1-i2),p.setY(j1-j2));
}
}
[程序运行过程]
2.编程定义的一个图形接口Shape,内含2个抽象方法getArea()和toString().定义一个矩形抽象类Rectangle类实现Shape接口的2个抽象方法,并添加自己的一个抽象方法getGirth().再定义一个具体类Square,继承于Rectangle类,并编写一个测试类,测试Shape,Rectangle类以及Square类的性能。
[程序清单]
interfaceShape{
intgetArea();
StringtoString();
}
abstractclassRectangleimplementsShape
{
publicintgetArea()
{
return0;
}
publicStringtoString()
{
return"rect";
}
abstractintgetGirth();
}
classSquareextendsRectangle
{
intsize;
Square(ints)
{
size=s;
}
publicintgetArea()
{
returnsize*size;
}
intgetGirth()
{
return4*size;
}
}
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Rectangles=newSquare
(2);
System.out.println(s.getArea());
System.out.println(s.getGirth());
System.out.println(s);
}
}
[程序运行结果(截图)]
3.验证如下程序,并写出运行结果(截图):
/**PolytechnicStudent.java:
定义了polytechnicstudent包,包含了两个
接口、一个抽象类和一个具体类*/
packagestudent.polytechnicstudent;
interfacePeople//定义父接口
{StringgetName();}//定义一个抽象方法
interfaceStudentextendsPeople//定义子接口
{StringgetNumber();}//新增一个抽象方法
abstractclassCollegeStudentimplementsStudent
{//定义专科学生类(抽象类)
staticfinalintLENGTHOFSCHOOLING=3;//定义学制(类常量)
StringstrName;//新增学生姓名
StringstrNumber;//新增学号
StringstrSpecialty;//新增学号
publicStringgetName()//实现了People接口中的getName方法
{returnstrName;}
publicStringgetNumber()//实现了Student接口中的getNumber方法
{returnstrNumber;}
publicStringtoString()//新增方法
{return"学生姓名="+strName+",学号="+strNumber;}
publicabstractStringgetSpecialty();
//新增抽象方法getSpecialty()
}
publicclassPolytechnicStudentextendsCollegeStudent
{//定义高职学生类(具体类)
privateStringstrPracticeCompany="";//新增实习单位
publicPolytechnicStudent(Stringname,Stringnumber)//构造方法
{strName=name;//属性strName继承于父类
strNumber=number;//属性strNumber继承于父类
}
publicPolytechnicStudent(Stringname,Stringnumber,
Stringspecialty)//重载构造方法
{
this(name,number);//利用this关键字调用本类的另一构造方法(2个参数)
strSpecialty=specialty;
}
publicStringgetSpecialty()//新增方法getSpecialty()
{
returnstrSpecialty;
}
publicvoidsetSpecialty(Stringspecialty)
{//新增方法setSpecialty(...)
strSpecialty=specialty;
}
publicStringtoString()//覆盖父类的toString()方法
{returnsuper.toString()+strSpecialty+",学制="+
LENGTHOFSCHOOLING+"年\n";
//利用super关键字调用父类中的同名方法toString()
}
}
本程序自定义了一个包:
student.polytechnicstudent,该包中的所有类和接口被存放在当前文件夹的student子文件夹下的polytechnicstudent文件夹中,该程序编译的命令行如下:
javac-d.PolytechnicStudent.java
其中参数–d.表示把编译生成的包文件放在当前的目录下。
本例中当前目录为:
C:
\ProgramFiles\Java\jdk1.5.0\bin\,因此本程序编译结果如图4-30所示:
图4-30包文件编译
对于已经创建的包的应用如下:
importstudent.polytechnicstudent.PolytechnicStudent;//导入自定义包
publicclassPolytechnicStudentTest
{publicstaticvoidmain(String[]args)
{PolytechnicStudenttom=newPolytechnicStudent("Tom",
"20020888");
//系统调用含2参数的构造方法
tom.setSpecialty("软件技术");
System.out.println(tom.toString());
//调用子类PolytechnicStudent中的toString()方法
PolytechnicStudentjack=newPolytechnicStudent("Jack",
"20020999","电子商务");
//系统调用含3参数的构造方法
System.out.println(jack.toString());
//调用子类PolytechnicStudent中的toString()方法
//CollegeStudentlinda=newCollegeStudent();
//error,抽象类只能定义其句柄,不能定义其对象
Objectlinda=newPolytechnicStudent("Linda","20020222",
"国际贸易");
//Object类是所有类的父类
//父类句柄可以关联一个子类(具体类)对象,发生多态现象
//linda.setSpecialty("国际贸易");
//error,父类句柄虽然关联了一个子类对象,但不允许访问子类所特有的方法
System.out.println(linda.toString());
//利用一个父类句柄访问一个父子类都具有的覆盖方法,
//实际上调用的是子类中的那个覆盖方法,此处发生多态现象
}}
PolytechnicStudentTest.java程序运行的结果如下图所示【自己运行截图】:
图4-31类与对象综合应用
4)编写一个自动售货机的程序,要求编写一个自动售货机的程序。
该程序应具如下功能:
有二级菜单,一级菜单商品类的选择,二级是具体商品的选择,顾客先选择商品类,然后选择具体商品,输入购买数量,自动售货机根据选择的商品和输入的数量,计算并显示所选商品总金额。
示例输出:
【提示】
问题解答提示:
1、程序功能具有二级菜单,因此需要使用swith/case的嵌套结构实现;
2、第一层嵌套实现对商品类型的选择,根据用户选择的序号进行匹配;
3、在进入所属商品类型后,顾客选择该类型下的具体商品,并提示输入购买数量;
4、第二层嵌套实现对具体商品的选择,根据用户选择的序号进行匹配,同时根据购买数量计算总额;
5、最后输出顾客本次购买的总金额;
importjava.io.*;
importjava.util.Scanner;
publicclasssale
{
publicstaticvoid
main(String[]args)
{
Scannerscan=newScanner(System.in);
inta,b,c,d,e;
System.out.println("请选择:
1.日用品2.文具 3.食品");
a=scan.nextInt();
switch(a)
{
case1:
System.out.println("请选择:
1.牙刷(3.5元/支)2.牙膏(6.2元/支)3.肥皂(2元/块)4.毛巾(8.6元/条)");
b=scan.nextInt();
System.out.println("请输入数量:
");
c=scan.nextInt();
switch(b)
{
case1:
System.out.println("总计:
"+3.5*c);
break;
case2:
System.out.println("总计:
"+6.2*c);
break;
case3:
System.out.println("总计:
"+2*c);
break;
case4:
System.out.println("总计:
"+8.6*c);
break;
}
break;
case2:
System.out.println("请选择:
1.笔(1元/支)2.本子(3元/本)3.橡皮(1元/块)");
b=scan.nextInt();
System.out.println("请输入数量:
");
d=scan.nextInt();
switch(b)
{
case1:
System.out.println("总计:
"+1*d);
break;
case2:
System.out.println("总计:
"+3*d);
break;
case3:
System.out.println("总计:
"+1*d);
break;
}
break;
case3:
System.out.println("请选择:
1.牛奶(2元/瓶)2.蛋糕(5元/块)3.面包(1元/个)");
b=scan.nextInt();
System.out.println("请输入数量:
");
e=scan.nextInt();
switch(b)
{
case1:
System.out.println("总计:
"+2*e);
break;
case2:
System.out.println("总计:
"+5*e);
break;
case3:
System.out.println("总计:
"+1*e);
break;
}
break;
}
}
}