Java类及对象实验报告.docx
《Java类及对象实验报告.docx》由会员分享,可在线阅读,更多相关《Java类及对象实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
Java类及对象实验报告
XX邮电大学
(计算机学院)
课实验报告
实验名称:
类与对象
专业名称:
计算机科学与技术
班级:
计科1405班
学生:
高宏伟
学号:
04141152
指导教师:
霞林
实验日期:
2016.9.29
一、实验目的
通过编程和上机实验理解Java语言是如何体现面向对象编程基本思想,了解类的封装方法,以及如何创建类和对象,了解成员变量和成员方法的特性,掌握OOP方式进行程序设计的方法。
二、实验要求
1.编写一个创建对象和使用对象的方法的程序。
2.编写一个包含类成员和示例成员的程序。
3.编写一个使用Java包的程序。
三、实验容
(一)三角形、梯形和圆形的类封装
✧实验要求:
编写一个Java应用程序,该程序中有3个类:
Trangle、Leder和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。
具体要求如下:
a)Trangle类具有类型为double的三个边,以及周长、面积属性,Trangle类具有返回周长、面积以及修改三个边的功能。
另外,Trangle类还具有一个boolean型的属性,该属性用来判断三个属能否构成一个三角形。
b)Lader类具有类型double的上底、下底、高、面积属性,具有返回面积的功能。
c)Circle类具有类型为double的半径、周长和面积属性,具有返回周长、面积的功能。
✧程序模板:
AreaAndLength.java
classTrangle
{
doublesideA,sideB,sideC,area,length;
booleanboo;
publicTrangle(doublea,doubleb,doublec)
{
this.sideA=a;//【代码1】参数a,b,c分别赋值给sideA,sideB,sideC
this.sideB=b;
this.sideC=c;
if((sideA+sideB)>sideC&&(sideC+sideB)>sideA&&(sideC+sideA)>sideB)
//【代码2】a,b,c构成三角形的条件表达式
{
boo=true;//【代码3】给boo赋值。
}
else
{
boo=false;【代码4】//给boo赋值。
}
}
doublegetLength()
{
returnsideA+sideB+sideC;【代码5】//方法体,要求计算出length的值并返回
}
publicdoublegetArea()
{
if(boo)
{
doublep=(sideA+sideB+sideC)/2.0;
area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
returnarea;
}
else
{
System.out.println("不是一个三角形,不能计算面积");
return0;
}
}
publicvoidsetABC(doublea,doubleb,doublec)
{
this.sideA=a;
this.sideB=b;
this.sideC=c;//【代码6】参数a,b,c分别赋值给sideA,sideB,sideC
if((sideA+sideB)>sideC&&(sideC+sideB)>sideA&&(sideC+sideA)>sideB【代码7】)//a,b,c构成三角形的条件表达式
{
boo=true;【代码8】//给boo赋值。
}
else
{
boo=false;【代码9】//给boo赋值。
}
}
}
classLader
{
doubleabove,bottom,height,area;
Lader(doublea,doubleb,doubleh)
{
this.above=a;
this.bottom=b;
this.height=h;【代码10】//方法体,将参数a,b,c分别赋值给above,bottom,height
}
doublegetArea()
{
return(above+bottom)*height/2;【代码11】//方法体,,要求计算出area返回
}
}
classCircle
{
doubleradius,area;
Circle(doubler){this.radius=r;【代码12】//方法体}
doublegetArea(){returnMath.PI*radius*radius;
//【代码13】方法体,要求计算出area返回
}
doublegetLength(){
returnMath.PI*2*radius;//【代码14】getArea方法体的代码,要求计算出length返回}
voidsetRadius(doublenewRadius){radius=newRadius;}
doublegetRadius(){returnradius;}
}
publicclassAreaAndLength{
publicstaticvoidmain(Stringargs[]){
doublelength,area;
Circlecircle=null;
Trangletrangle;
Laderlader;
circle=newCircle(5);【代码15】//创建对象circle
trangle=newTrangle(3,4,5);【代码16】//创建对象trangle。
lader=newLader(2,3,4);【代码17】//创建对象lader
length=circle.getLength();
System.out.println("圆的周长:
"+length);
area=circle.getArea();
System.out.println("圆的面积:
"+area);
length=trangle.getLength();
System.out.println("三角形的周长:
"+length);
area=trangle.getArea();
System.out.println("三角形的面积:
"+area);
area=lader.getArea();
System.out.println("梯形的面积:
"+area);
trangle.setABC(12,34,1);
area=trangle.getArea();
System.out.println("三角形的面积:
"+area);
length=trangle.getLength();
System.out.println("三角形的周长:
"+length);}}
✧实验后的练习:
1.程序中仅仅省略【代码15】,编译能通过吗?
不能通过,提示如下
Exceptioninthread"main"java.lang.Error:
Unresolvedpilationproblems:
Thelocalvariablecirclemaynothavebeeninitialized
Thelocalvariablecirclemaynothavebeeninitialized
atAreaAndLength.Trangle$AreaAndLength.main(Trangle.java:
85)
2.程序中仅仅省略【代码16】,编译能通过吗?
不能通过,提示如下
Exceptioninthread"main"java.lang.Error:
Unresolvedpilationproblems:
Thelocalvariabletranglemaynothavebeeninitialized
Thelocalvariabletranglemaynothavebeeninitialized
Thelocalvariabletranglemaynothavebeeninitialized
Thelocalvariabletranglemaynothavebeeninitialized
Thelocalvariabletranglemaynothavebeeninitialized
atAreaAndLength.Trangle$AreaAndLength.main(Trangle.java:
89)
3.程序中仅仅省略【代码15】,运行时出现怎样的异常提示?
Exceptioninthread"main"java.lang.Error:
Unresolvedpilationproblems:
Thelocalvariablecirclemaynothavebeeninitialized
Thelocalvariablecirclemaynothavebeeninitialized
atAreaAndLength.Trangle$AreaAndLength.main(Trangle.java:
85)
1.给Trangle类增加3个方法,分别用来返回3个边:
sideA、sideB和sideC。
doublegetsideA(){returnsideA;}
doublegetsideB(){returnsideB;}
doublegetsideC(){returnsideC;}
2.让AreaAndLength类中的circle对象调用方法修改半径,然后输出修改后的半径以及修改半径后的圆的面积和周长。
circle.setRadius(3);
System.out.println("修改后的半径为"+circle.getRadius());
System.out.println("修改后的面积为"+circle.getArea());
System.out.println("修改后的周长为"+circle.getLength());
(二)实例成员与类成员。
✧实验要求:
按程序模板的要求编写源文件,要特别注意程序的输出结果,并能正确解释输出的结果。
✧程序运行效果示例:
程序运行效果如下图所示:
✧程序模板:
Example.java
classA
{
【代码1】//声明一个float型实例变量a
【代码2】//声明一个float型类变量b,
voidsetA(floata)
{
【代码3】//将参数a的值赋值给成员变量a
}
voidsetB(floatb)
{
【代码4】//将参数b的值赋值给成员变量b
}
floatgetA()
{
returna;
}
floatgetB()
{
returnb;
}
voidinputA()
{
System.out.println(a);
}
staticvoidinputB()
{
System.out.println(b);
}
}
publicclassExample
{
publicstaticvoidmain(Stringargs[])
{
A.b=100;//通过类名操作类变量b,并赋值100
A.inputB();//通过类名调用方法inputB()
Acat=newA();
Adog=newA();
cat.setA(200);//cat调用方法setA(inta)将cat的成员a的值设置为200
cat.setB(400);//cat调用方法setB(intb)将cat的成员b的值设置为400
dog.setA(150);//dog调用方法setA(inta)将dog的成员a的值设置为150
dog.setB(300);//dog调用方法setB(intb)将dog的成员b的值设置为300
cat.inputA();//cat调用inputA()。
cat.inputB();//cat调用inputB()。
dog.inputA();//dog调用inputA()。
dog.inputB();//dog调用inputB()。
}
}
✧实验后的练习:
1.将inputA()方法中的
System.out.println(a);
改写为
System.out.println(a+b);
编译是否出错?
为什么?
不会,可以在非静态方法中引用静态变量。
2.将inputB()方法中的
System.out.println(b);
改写为
System.out.println(a+b);
编译是否报错?
为什么?
会,无法在静态方法中引用非静态变量。
(三)使用package语句与import语句。
✧实验要求:
按实验要求使用package语句,并用import语句使用Java平台提供的包中的类以及
自定义包中的类。
掌握一些重要的操作步骤。
程序模板:
模板1:
将模板1给出的Java源文件命名为SquareEquation.java,将编译后得到的字节码文件复制到c:
\1000\tom\jiafei目录中。
SquareEquation.java
packagetom.jiafei;
publicclassSquareEquation
{
doublea,b,c;
doubleroot1,root2;
booleanboo;
publicSquareEquation(doublea,doubleb,doublec)
{
this.a=a;
this.b=b;
this.c=c;
if(a!
=0)
{
boo=true;
}
else
{
boo=false;
}
}
publicvoidgetRoots()
{
if(boo)
{
System.out.println("是一元2次方程");
doubledisk=b*b-4*a*c;
if(disk>=0)
{
root1=(-b+Math.sqrt(disk))/(2*a);
root2=(-b-Math.sqrt(disk))/(2*a);
System.out.printf("方程的根:
%f,%f\n",root1,root2);
}
else
{
System.out.printf("方程没有实根\n");
}
}
else
{
System.out.println("不是一元2次方程");
}
}
publicvoidsetCoefficient(doublea,doubleb,doublec)
{
this.a=a;
this.b=b;
this.c=c;
if(a!
=0)
{
boo=true;
}
else
{
boo=false;
}
}
}
模板2:
将模板2给出的Java源程序SunRise.java保存到d:
\2000中。
在编译模板2给出的Java源文件之前,要重新设置classpath。
假设本地机SDK的安装目录是E:
\jdk1.8。
在命令行执行如下命令:
setclasspath=C:
\ProgramFiles\java\jdk\jre\lib\rt.jar;.;c:
\1000
或用鼠标右键点击“我的电脑”,弹出快捷菜单,然后选择“属性”命令,弹出“系统属性”对话框,再单击该对话框中的“高级”选项卡,然后单击“环境变量”按钮。
将classpath的值修改为:
E:
\jdk1.5\jre\lib\rt.jar;.;c:
\1000
C:
\ProgramFiles\java\jdk\jre\lib\rt.jar;.;c:
\1000
然后重新打开一个命令行窗口,编译模板2给出的Java源程序。
SunRise.java
importtom.jiafei.*;
classSunRise
{
publicstaticvoidmain(Stringargs[])
{
SquareEquationequation=newSquareEquation(4,5,1);
equation.getRoots();
equation.setCoefficient(-3,4,5);
equation.getRoots();
}
}
【运行结果】
五.总结
本次实验是Java的第二次上机,通过编程和上机实验理解了Java语言是如何体现面向对象编程基本思想,了解了类的封装方法,以及如何创建类和对象,了解了成员变量和成员方法的特性,掌握了OOP方式进行程序设计的方法。
感受到了Java语言独有的魅力,为以后的Java语言编程奠定了基础。