实验9 JAVA面向对象.docx

上传人:b****2 文档编号:23189500 上传时间:2023-05-15 格式:DOCX 页数:16 大小:128.82KB
下载 相关 举报
实验9 JAVA面向对象.docx_第1页
第1页 / 共16页
实验9 JAVA面向对象.docx_第2页
第2页 / 共16页
实验9 JAVA面向对象.docx_第3页
第3页 / 共16页
实验9 JAVA面向对象.docx_第4页
第4页 / 共16页
实验9 JAVA面向对象.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

实验9 JAVA面向对象.docx

《实验9 JAVA面向对象.docx》由会员分享,可在线阅读,更多相关《实验9 JAVA面向对象.docx(16页珍藏版)》请在冰豆网上搜索。

实验9 JAVA面向对象.docx

实验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;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1