Java实验三参考答案昆工版本Word下载.docx
《Java实验三参考答案昆工版本Word下载.docx》由会员分享,可在线阅读,更多相关《Java实验三参考答案昆工版本Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
类,参考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){
}
publicstaticvoidmethod1(){
method2();
doubleradius;
//错误:
不在Circle类中如何能定义该构造函数。
Circle(){
radius=5.0;
Circle(doublenewRadius){
radius=newRadius;
publicstaticvoidmethod2(){
Circlec=newCircle();
System.out.println("
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);
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{
Circle3circle1=newCircle3
(1);
Circle3circle2=newCircle3
(2);
swap1(circle1,circle2);
Afterswap1:
circle1="
+circle1.radius
+"
circle2="
+circle2.radius);
swap2(circle1,circle2);
Afterswap2:
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{
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{
swap(a);
a[0]="
publicstaticvoidswap(int[]a){
inttemp=a[0];
a[0]=a[1];
a[1]=temp;
传递一个实例化对象到swap方法中,实现了e1,e2值的交换
Tt=newT();
swap(t);
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.
Tt1=newT();
Tt2=newT();
t1'
si="
+t1.i+"
andj="
+t1.j);
t2'
+t2.i+"
+t2.j);
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代码:
Datedate=newDate(1234567);
System.out.println(date.getTime());
date=newDate(7654321);
截图:
结果分析:
给对象date赋初值,调用函数m1,只给形参(局部变量)赋值,可m1无返回值,对象date依然为原值,所以还是原先实例的值。
C代码:
date.setTime(7654321);
给对象date赋初值,调用函数m1,后来利用date的修改器setTime来修改了date值为7654321。
D代码:
date=null;
结果分析:
给对象date赋初值,调用函数m1,只给形参(局部变量)赋null值,可m1无返回值,对象date依然为原值,所以还是原先实例的值。
6.课本P237第八章复习题8.20,给出正确的程序并显示结果,分析错误问题;
原出错程序
publicclassBE8_20{
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:
publicstaticvoidmain(String[]args){
java.util.Datedates=newjava.util.Date();
//用普通变量代替数组,并赋初值
System.out.println(dates);
System.out.println(dates.toString());
正确程序2:
publicclassTest{
java.util.Date[]dates=newjava.util.Date[10];
for(inti=0;
10;
i++){
dates[i]=newjava.util.Date();
//为数组的每个元素赋初值
System.out.println(dates[0]);
System.out.println(dates[0].toString());
1.课本P238第八章编程题8.4(使用Random
不带种子的,每次运行生成的都是随机的,没有规律可言。
(1)程序:
publicclassRandom8_4{
/**
*E8-4使用随机类,种子1000
*通俗说,两者的区别是:
*不带种子的,每次运行生成的都是随机的,没有规律可言。
*/
Randomrd=newRandom(1000);
for(inti=0;
50;
System.out.print(rd.nextInt(100)+"
"
);
//nextInt(n)返回一个伪随机数,它是从此随机数生成器的序列中取出的、在0(包括)和指定值(不包括)之间均匀分布的int值
}
(2)运行截图:
2.课本p238第八章编程练习题8.7(账户类);
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){
请设置您的账户余额:
this.balance=input.nextDouble();
publicdoublegetAnnualInterestRate(){returnannualInterestRate;
publicvoidsetAnnualInterestRate(doubleannualInterestRate){
请输入年利率:
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();
Scannerinput=newScanner(System.in);
inta,b;
Accountaccount1=newAccount();
\n\t\t\t所创建的第一个账户的账户信息:
"
账户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();
月利息为"
+accoun