System.out.print(""+one[i][j]);
System.out.println();
}
}
}
调试结果:
P75页2-5分析下列程序段有何错误,改正后上机验证。
(1)inti=5;
do
{
System.out.println(i);
i--;
}
while(i=2);
调试结果:
改正后:
publicclassTest1
{
publicstaticvoidmain(Stringargs[])
{
inti=5;
do
{
System.out.println(i);
i--;
}
while(i>2);
}
}
调试结果:
原因:
在java语言中=意思是赋值,while(i=2)不成立。
如果要使用该循环,while语句里面必须是判断语句。
(2)intsum=0;
for(inti=10;i<0;i--)
sum+=i;
调试结果:
改正后:
classTest2
{
publicstaticvoidmain(Stringargs[])
{
intsum=0;
for(inti=10;i>0;i--)
sum+=i;
System.out.println(sum);
}
}
调试结果:
原因:
在for循环中i的初始值并不符合for循环中的判断条件,该循环并不会执行。
(3)
classTest3
{
publicstaticvoidmain(Stringargs[])
{
intfac=1;
for(inti=1;i<4;i++)
{
while(i>1)
fac*=i--;
System.out.println(fac);
}
调试结果:
改正后:
classTest3
{
publicstaticvoidmain(Stringargs[])
{
intfac=1;
for(inti=1;i<4;i++)
{
if(i>=1)
fac*=i;
}
System.out.println(fac);
}
}
调试结果:
原因:
程序中的while语句会在i>2的情况下多次执行,从而将i的值变得更小,不符合期望。
(4)
classTest4
{
publicstaticvoidmain(Stringargs[])
{
inta=3,b=5;
switch(b-a)
{
case2:
System.out.println(“2”);break;
case1:
System.out.print(“1”);break;
casea+b:
System.out.println(“a+b”);break;
casea:
System.out.println(“a”);
}
调试结果:
改正后:
classTest4
{
publicstaticvoidmain(Stringargs[])
{
inta=3,b=5;
switch(b-a)
{
case2:
System.out.println("2");break;
case1:
System.out.print("1");break;
case8:
System.out.println("a+b");break;
case3:
System.out.println("a");
}
}
}
调试结果:
原因:
case中只能使用常量,不能使用变量。
(5)
classTest5
{
publicstaticvoidmain(Stringargs[])
{
longd=0;
for(inti=10;i>=1;i++)
d*=i;
System.out.println(d);
}
}
这是求10!
的程序段。
调试结果:
改正后:
classTest5
{
publicstaticvoidmain(Stringargs[])
{
longd=1;
for(inti=1;i<=10;i++)
d*=i;
System.out.println(d);
}
}
调试结果:
原因:
原循环中i=10,本身大于等于1,循环结束后再对i进行递增,该循环就变成永远执行。
例3-2列举一个关于不同变量的例子。
通过分析Exam3_2.java程序,回答所提出的问题。
程序Exam3_2.java
classvar
{
staticinta;
intb;
publicvoidintprint()
{
intc=0;
++a;
++b;
++c;
System.out.print(“a=”+a);
System.out.print(“b=”+b);
System.out.println(“c=”+c);
}
publicvoidallprint()
{
intprint();
intprint();
}
}
publicclassExam3_2
{
publicstaticvoidmain(Stringargs[])
{
varv1=newvar();
varv2=newvar();
v1.allprint();
v2.allprint();
}
}
通过分析该程序,回答如下4个问题:
1类var中定义了两个变量a和b。
这两个变量有什么不同?
答:
a属于静态整形变量,b属于整形变量
2类var中变量b和方法intprint()中变量c有何不同?
答:
变量b的作用于var整个类中,c仅作用于print()这个函数内
3类var的访问控制权限如何?
如果加上访问控制符private,会出现什么结果?
答:
具有包访问性,。
可被同一个包的其他类访问,加上private,则编译出错
4分析输出结果。
分析如下:
当程序进入到varv1=newvar();时,执行++a,b++,c++,此时a=1b=1并输出a=1b=1c=1;
当程序进入到varv2=newvar();由于a是静态变量所以a由1增加到2,b的由1到2(仍属于var类,创建另一个对象v2),c的值仍是++c,等于1;
当程序进入到v1.allprint();调用var类中的allprint()方法输入v1对象的值a=3,b=1c=1
当程序进入到v2.allprint();调用var类中的allprint()方法输入v2对象的值a=4,b=2c=1
例3-7分析Exam3_7.java程序的输出结果。
熟悉程序关于静态变量和静态方法的定义和使用。
程序Exam3_7.java:
classA
{
inta;
staticintb;
voidseta(inti)
{
a=i;
b=i+1;
}
intgeta()
{
returna;
}
staticvoidsetb(inti)
{
b+=i;
}
staticintgetb()
{
returnb;
}
}
publicclassExam3_7
{
publicstaticvoidmain(Stringargs[])
{
Ax=newA();
Ay=newA();
x.seta(5);
y.seta(10);
System.out.println("x.a="+x.geta()+",y.a="+y.geta());
x.setb(-5);
y.setb(-10);
System.out.println("x.b="+x.getb()+",y.b="+y.getb());
}
}
调试结果:
通过分析该程序,回答如下3个问题:
(1)如何在程序中定义静态变量和静态方法?
答:
静态变量的定义格式:
static<类型><变量名>;
静态方法只能用来处理静态变量或调用静态方法。
它不能用来处理对象变量或对象方法。
在创建对象时,由于非静态方法是属于对象的,因此在对象占用的内存中有该方法的代码。
而静态方法是属于整个类的,因此在对象占用的内存中没有该方法。
静态方法在内存中的代码是随着类的定义而进行分配的,它不被某个对象所占用。
调用静态方法通常使用类名,也可以使用某个对象名。
(2)在静态方法中是否可以引用非静态变量?
在非静态方法中是否可以引用静态变量?
答:
都不能。
因为程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
(3)如何将该程序中使用对象引用静态方法修改可使用类名引用静态方法?
并上机调试。
答:
在该类的静态方法中额外添加一个参数,参数类型便为该类。
然后使用参数类型对该类的对象进行操作。
例3-17分析Exam3_17.java程序的输出结果,了解子类和父类对象之间的相互转换。
程序Exam3_17.java:
classA
{
Stringa="classA";
}
classBextendsA
{
Stringb="classB";
}
classExam3_17
{
publicstaticvoidmain(Stringargs[])
{
Aa1,a2=newA();
Bb1,b2=newB();
a1=b2;
b1=(B)a1;
System.out.println(a1.a);
System.out.println(b1.b);
}
}
调试结果:
思考上述问题,上机验证。
将main()方法中,a1=b2;语句改为a1=(A)b2;并且将b1=(B)a1;改为b1=a1;是否可以?
为什么?
答:
不可以。
因为java语言允许父类和子类对象之间相互转换。
但规定:
子类对象可以直接赋值给父类对象;父类对象给子类对象赋值时,必须要强制类型转换。
P150页3-1已知如下一个类:
classA
{
inta1,a2;
A(inti,intj)
{
a1=I;a2=j;
}
}
要求编一个方法swap()用来交换A类的两个对象的成员变量的值。
答:
问题分析:
由题知,首先创建A类的对象obj1,obj2,
然后分别初始化obj1,obj2;
在编写swap()程序,交换俩对象的成员变量
即是将将obj1中的a1和a2与obj2中的a1和a2互换
代码:
classA
{
inta1,a2;
publicA(inta1,inta2){
this.a1=a1;
this.a2=a2;
}
publicstaticvoidmain(Stringargs[])
{
Aobj1,obj2;
obj1=newA(4,5);
System.out.println("obj1的值分别是"+obj1.a1+"和"+obj1.a2);
obj2=newA(2,3);
System.out.println("obj2的值分别是"+obj2.a1+"和"+obj2.a2);
swap(obj1,obj2);
System.out.println("obj1的值分别是"+obj1.a1+"和"+obj1.a2);
System.out.println("obj2的值分别是"+obj2.a1+"和"+obj2.a2);
}
staticvoidswap(Aobj1,Aobj2)
{
inta,b;
a=obj1.a1;
b=obj1.a2;
obj1.a1=obj2.a1;
obj1.a2=obj2.a2;
obj2.a1=a;
obj2.a2=b;
}
}
调试结果:
3-2已知一个类如下所示:
classS
{
Doubler
}
编写S类的一个子类,改子类中包含一个计算圆面积的方法area()和一个使用super()初始化S类成员的构造方法。
程序分析:
1,编写一个classCircle继承S,
2,class类中包含:
计算area()和super()初始化S类成员的构造方法
代码:
classS{doubler;}
publicclassCircleextendsS{
privatefinaldoublePI=3.14;
publicCircle(doubler){
super();
super.r=r;
}
publicvoidarea(){
System.out.println(r*r*PI);
}
publicstaticvoidmain(String[]args){
Circlec=newCircle(2.5);
c.area();
}
}
调试结果:
3-4定义一个复数类complex,内有两个成员变量:
实部和虚部,还有两个方法:
求两个复数和以及求两个复数差。
编程验证该程序的复数加减运算是正确的。
程序分析:
在程序中新建一个类,该类代表复数,类中有两个变量,分别代表着复数的实部和虚部。
在进行加减运行时只需该类中的实部和虚部相加减便可达到所要效果。
代码:
importjava.io.*;
importjava.util.Scanner;
publicclassComplex
{
privateintshibu;
privateintxubu;
Complex()
{
}
Complex(intm,intn)
{
shibu=m;
xubu=n;}
publicComplexplus(Complexc)
{
Complexresult