Java实验三参考答案昆工版本.docx
《Java实验三参考答案昆工版本.docx》由会员分享,可在线阅读,更多相关《Java实验三参考答案昆工版本.docx(26页珍藏版)》请在冰豆网上搜索。
Java实验三参考答案昆工版本
昆明理工大学信息工程与自动化学院学生实验报告
(2012—2013学年第一学期)
课程名称:
java程序设计开课实验室:
信自4452012年11月21日
年级、专业、班
计科11
学号
姓名
苏东博,狄家帆,张盼
成绩
95
实验项目名称
Java面向对象程序设计
指导教师
张晓丽
教师评语
复习题仔细查看并掌握;编程题可参考书提供的源代码。
教师签名:
年月日
一、实验目的及内容
目的:
掌握Java中面向对象的思想,类和对象的应用,可见性修饰符,数据域的封装,静态变量和方法,给方法传递对象参数。
内容:
完成下面要求的程序和习题
(一).复习题
1.课本P234第八章复习题8.12,给出正确的程序并显示结果,分析错误问题;
2.课本P235第八章复习题8.16,显示并分析结果;
3.课本P235第八章复习题8.17,显示并分析结果;
4.课本P236第八章复习题8.18,显示并分析结果;
5.课本P236第八章复习题8.19,显示并分析结果;
6.课本P237第八章复习题8.20,给出正确的程序并显示结果,分析错误问题;
(二).编程题
1.课本P238第八章编程题8.4(使用Random 类,参考jdk_7_docs.api,)
注:
通俗说,两者的区别是:
带种子的,每次运行生成的结果都是一样的。
不带种子的,每次 运行生成的都是随机的,没有规律可言。
2.课本p238第八章编程练习题8.7(账户类);
注:
月利率=balance*(annualInterestRate/12)
3.课本p239第八章编程练习题8.9(正n边形)
注:
面积公式错误:
p->PI;则JAVA编程公式:
n*side*side/(4*Math.tan(Math.PI/n)
访问器getter和修改器setter,在eclipse中可自动生成(eclipse中source菜单\Generategetterandsetter)
4.完成并掌握每章课后复习题,上课提问检查;
5.每章其他编程练习题;(选作)
二、要求(编程题中给出实验内容的程序设计、实现和结果,并对结果进行分析。
)
(一).复习题
1.课本P234第八章复习题8.12,给出正确的程序并显示结果,分析错误问题;
分析:
不能从静态方法中直接调用一个实例方法或引用实例变量,须实例化对象后,通过该对象调用实例方法或变量;但可以从一个实例方法中调用一个静态方法或引用一个静态变量。
正确程序1:
publicclassFoo{
publicstaticvoidmain(String[]args){
method1();
}
publicstaticvoidmethod1()
{
method2();}
publicstaticvoidmethod2(){
System.out.println("Whatisradius"+c.getRadius());
}
staticCirclec=newCircle();
}
classCircle{
staticdoubleradius;
staticdoublegetRadius(){
radius=1;
returnradius;
}
}
正确程序2:
publicclassBe8_12{
/*不能从静态方法中直接调用一个实例方法或引用实例变量,
*须实例化对象后,通过该对象调用实例方法或变量
*但可以从一个实例方法中调用一个静态方法或引用一个静态变量。
*/
publicstaticvoidmain(String[]args){
newBe8_12().method1();
}
publicvoidmethod1(){
method2();
}
publicstaticvoidmethod2(){
Circlec=newCircle();//注须将Circle.java源程序放在同一包p8中,或importp8.Circle;且Circle类中须有getRadius方法:
publicdoublegetRadius(){
returnr;
}
System.out.println("whatisradius"+c.getRadius());
//newBe8_12().method1();//须实例化对象后,通过该对象调用实例方法或变量
}
}
大多数错误程序:
publicclassFoo{
publicstaticvoidmain(String[]args){
method1();
}
publicstaticvoidmethod1(){
method2();
}
doubleradius;
//错误:
不在Circle类中如何能定义该构造函数。
Circle(){
radius=5.0;
}
Circle(doublenewRadius){
radius=newRadius;
}
publicstaticvoidmethod2(){
Circlec=newCircle();
System.out.println("whatisradius"+c.getRadius());
}
doublegetRadius(){
returnradius;}
}
结果显示:
whatisradius1.0//注1.0由无参构造函数Circle()决定
2.课本P235第八章复习题8.16,显示并分析结果;
分析:
传递基本类型参数,传递的是实参的值,实参的值不会改变;
传递引用类型参数,传递的是对象的引用,可以改变实参的值。
程序:
publicclassTest{
publicstaticvoidmain(String[]args){
CountmyCount=newCount();
inttimes=0;
for(inti=0;i<100;i++)
increment(myCount,times);
System.out.println("countis"+myCount.count);
System.out.println("timesis"+times);
}
publicstaticvoidincrement(Countc,inttimes){
c.count++;times++;
}
}
classCount{
publicintcount;
publicCount(intc){
count=c;
}
publicCount(){
count=1;
}
}
结果显示:
3.课本P235第八章复习题8.17,显示并分析结果;
分析:
第三四行分别创建了半径为1和2的两个对象circle1和circle2;
然后分别调用swap1()和swap2()函数,并输出两个对象的半径;
在swap1()函数对地址值交换,但未影响对象,值未做交换;
在swap2()函数中两个对象的半径在内存里交换了,值成功交换;
程序:
publicclassBe8_17{
publicstaticvoidmain(String[]args){
Circle3circle1=newCircle3
(1);
Circle3circle2=newCircle3
(2);
swap1(circle1,circle2);
System.out.println("Afterswap1:
circle1="+circle1.radius
+"circle2="+circle2.radius);
swap2(circle1,circle2);
System.out.println("Afterswap2:
circle1="+circle1.radius
+"circle2="+circle2.radius);
}
publicstaticvoidswap1(Circle3x,Circle3y){
Circle3temp=x;
x=y;
y=temp;
}
publicstaticvoidswap2(Circle3x,Circle3y){
doubletemp=x.radius;
x.radius=y.radius;
y.radius=temp;
}
}
classCircle3{
doubleradius;
Circle3(doublenewRadius){
radius=newRadius;
}
}
}
结果显示:
4.课本P236第八章复习题8.18,显示并分析结果;
分析:
Swap方法实现了两个形参的交换,但是未能改变实参-数组元素的值。
即在调用swap函数的时候把a[0]a[1]的值1,2传给了n1,n2在swap()函数中只调换了n1,n2的位置,但并没有调换a[0]和a[1]的值,所以输出结果仍然为a[0]=1,a[1]=2
程序:
publicclassfuxiti{
publicstaticvoidmain(String[]args){
int[]a={1,2};
swap(a[0],a[1]);
System.out.println("a[0]="+a[0]+"a[1]="+a[1]);
}
publicstaticvoidswap(intn1,intn2){
inttemp=n1;
n1=n2;
n2=temp;
}
}
结果显示
Swap方法利用传递数组的方式来实现了两个数据的交换,Swap方法将a[0]a[1]做了交换
publicclassfuxiti{
publicstaticvoidmain(String[]args){
int[]a={1,2};
swap(a);
System.out.println("a[0]="+a[0]+"a[1]="+a[1]);
}
publicstaticvoidswap(int[]a){
inttemp=a[0];
a[0]=a[1];
a[1]=temp;
}
}
传递一个实例化对象到swap方法中,实现了e1,e2值的交换
publicclassfuxiti{
publicstaticvoidmain(String[]args){
Tt=newT();
swap(t);
System.out.println("e1="+t.e1+"e2="+t.e2);
}
publicstaticvoidswap(Tt){
inttemp=t.e1;
t.e1=t.e2;
t.e2=temp;
}}
classT{
inte1=1;
inte2=2;
}
结果显示:
静态变量i将变量值存储在一个公共的内存地址,所以任何对象对此变量的值修改,都会使同一类的所有对象都受到影响。
对象t1的实例化使i的值从0加到1,对象t2的实例化使i的值从1加到2,此时i的输出结果就是2.
publicclassfuxiti{
publicstaticvoidmain(String[]args){
Tt1=newT();
Tt2=newT();
System.out.println("t1'si="+t1.i+"andj="+t1.j);
System.out.println("t2'si="+t2.i+"andj="+t2.j);
}
}
classT{
staticinti=0;
intj=0;
T(){
i++;
j=1;
}
}
结果显示:
5.课本P236第八章复习题8.19,显示并分析结果;
A代码:
importjava.util.Date;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Datedate=null;
m1(date);
System.out.println(date);
}
publicstaticvoidm1(Datedate)
{
date=newDate();
}
}
截图:
结果分析:
给对象date赋初值为null的,调用函数m1,只给形参(局部变量)赋值当前时间,可m1无返回值,对象date依然为null。
B代码:
importjava.util.Date;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Datedate=newDate(1234567);
m1(date);
System.out.println(date.getTime());
}
publicstaticvoidm1(Datedate)
{
date=newDate(7654321);
}
}
截图:
结果分析:
给对象date赋初值,调用函数m1,只给形参(局部变量)赋值,可m1无返回值,对象date依然为原值,所以还是原先实例的值。
C代码:
importjava.util.Date;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Datedate=newDate(1234567);
m1(date);
System.out.println(date.getTime());
}
publicstaticvoidm1(Datedate)
{
date.setTime(7654321);
}
}
截图:
结果分析:
给对象date赋初值,调用函数m1,后来利用date的修改器setTime来修改了date值为7654321。
D代码:
importjava.util.Date;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Datedate=newDate(1234567);
m1(date);
System.out.println(date.getTime());
}
publicstaticvoidm1(Datedate)
{
date=null;
}
}
截图:
结果分析:
给对象date赋初值,调用函数m1,只给形参(局部变量)赋null值,可m1无返回值,对象date依然为原值,所以还是原先实例的值。
6.课本P237第八章复习题8.20,给出正确的程序并显示结果,分析错误问题;
原出错程序
publicclassBE8_20{
publicstaticvoidmain(String[]args){
java.util.Date[]dates=newjava.util.Date[10];//只给date数组分配了空间,未赋初值,均为Null。
System.out.println(dates[0]);//date[0]为null
System.out.println(dates[0].toString());//toString是把date对象的时间转换为字符串,遭遇空指针异常,提示NullPointerException.
}
}
正确程序1:
importjava.util.Date;
publicclassfuxiti{
publicstaticvoidmain(String[]args){
java.util.Datedates=newjava.util.Date();//用普通变量代替数组,并赋初值
System.out.println(dates);
System.out.println(dates.toString());
}
}
正确程序2:
publicclassTest{
publicstaticvoidmain(String[]args){
java.util.Date[]dates=newjava.util.Date[10];
for(inti=0;i<10;i++){
dates[i]=newjava.util.Date();//为数组的每个元素赋初值
}
System.out.println(dates[0]);
System.out.println(dates[0].toString());
}
}
结果显示:
(二).编程题
1.课本P238第八章编程题8.4(使用Random 类,参考jdk_7_docs.api,)
注:
通俗说,两者的区别是:
带种子的,每次运行生成的结果都是一样的。
不带种子的,每次运行生成的都是随机的,没有规律可言。
(1)程序:
publicclassRandom8_4{
/**
*E8-4使用随机类,种子1000
*通俗说,两者的区别是:
带种子的,每次运行生成的结果都是一样的。
*不带种子的,每次运行生成的都是随机的,没有规律可言。
*/
publicstaticvoidmain(String[]args){
Randomrd=newRandom(1000);
for(inti=0;i<50;i++){
System.out.print(rd.nextInt(100)+",");
//nextInt(n)返回一个伪随机数,它是从此随机数生成器的序列中取出的、在0(包括)和指定值(不包括)之间均匀分布的int值
}
}
}
(2)运行截图:
2.课本p238第八章编程练习题8.7(账户类);注:
月利率=balance*(annualInterestRate/12)
(1)程序:
importjava.util.Scanner;
publicclassAccount{
privateintid=0;
privatedoublebalance=0;
privatedoubleannualInterestRate=0;
privatejava.util.DatedateCreated;
publicintgetId(){returnid;}
publicvoidsetId(intid){
System.out.print("请输入账户ID:
");
this.id=input.nextInt();
}
publicdoublegetBalance(){returnbalance;}
publicvoidsetBalance(doublebalance){
System.out.print("请设置您的账户余额:
");
this.balance=input.nextDouble();
}
publicdoublegetAnnualInterestRate(){returnannualInterestRate;}
publicvoidsetAnnualInterestRate(doubleannualInterestRate){
System.out.print("请输入年利率:
");
this.annualInterestRate=input.nextDouble();
}
Scannerinput=newScanner(System.in);
publicdoublegetMonthlyInterestRate(){
doubleMonthlyInterestRate=balance*(annualInterestRate/12);
returnMonthlyInterestRate;
}
publicjava.util.DategetDateCreated(){
returndateCreated;
}
publicvoidsetDateCreated(java.util.DatedateCreated){
this.dateCreated=newjava.util.Date();
}
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);
inta,b;
Accountaccount1=newAccount();
System.out.println("\n\t\t\t所创建的第一个账户的账户信息:
");
System.out.println("账户ID:
"+account1.id+"\t账户余额:
"+account1.balance+"\t年利率:
"+account1.annualInterestRate+"\t开户时间:
"+account1.dateCreated);
do{
System.out.print("请选择业务:
1.存款;2.取款!
3.修改器");
a=input.nextInt();
if(a==1){
account1.deposit();
System.out.println("月利息为"+accoun