Java讲义范例.docx
《Java讲义范例.docx》由会员分享,可在线阅读,更多相关《Java讲义范例.docx(67页珍藏版)》请在冰豆网上搜索。
![Java讲义范例.docx](https://file1.bdocx.com/fileroot1/2023-2/8/e9a001de-a326-407d-8122-f3a78c2a7830/e9a001de-a326-407d-8122-f3a78c2a78301.gif)
Java讲义范例
程序运行过程:
javac编译,java运行
例1-1FirstProgram.java
classTest{
publicstaticvoidmain(){
System.out.println("Hello,myfirstjavaprogram!
");
}
}
编译:
javacFirstProgram.java
错误:
FirstProgram.java:
1:
classTestispublic,shouldbedeclaredinafilenamedTest.java
原因:
如果文件中只有一个类,则文件名必须与类名相同。
修改:
Test改为FirstProgram
编译:
javacFirstProgram.java
运行:
javaFirstProgram
错误:
Exceptioninthread"main"java.lang.NoSuchMethodError:
main
原因:
程序的入口函数声明必须为publicstaticvoidmain(Stringargs[])。
修改:
第二行改为publicstaticvoidmain(Stringargs[]){
编译:
javacFirstProgram.java
运行:
javaFirstProgram
结果:
Hello,myfirstjavaprogram!
例1-2Another.java
修改FirstProgram.java的代码为:
classFirstProgram{
publicstaticvoidmain(Stringargs[]){
Anotheranother=newAnother();
another.say();
}
}
publicclassAnother{
publicvoidsay(){
System.out.println("Anotherone.");
}
}
编译:
javacFirstProgram.java
错误:
FirstProgram.java:
7:
classAnotherispublic,shouldbedeclaredinafilenamed
Another.java
publicclassAnother{
^
1error
原因:
文件中如果有两个以上的类,则类名必须与其中的public类的类名一致。
在没有public类时,则必须与其中任意一个类名一致。
修改:
文件名改为Another.java(或删除public)
编译:
javacAnother.java
运行:
javaAnother
错误:
Exceptioninthread"main"java.lang.NoSuchMethodError:
main
原因:
javaAnother的含义为,程序从Another类的main方法开始运行,但程序的Another类中并没有main方法。
运行:
javaFirstProgram
结果:
Anotherone.
例1-3FirstAppliet.javaFirstApplet.html
publicclassFirstApplet{
publicvoidpaint(Graphicsg){
g.setColor(Color.blue);
g.drawString("Java是一门很优秀的语言",12,30);
g.setColor(Color.red);
g.drawString("我一定认真学习Java",22,56);
}
}
编译:
javacFirstApplet.java
错误:
FirstApplet.java:
2:
cannotfindsymbol
symbol:
classGraphics
location:
classFirstApplet
publicvoidpaint(Graphicsg){
……
原因:
无法识别Graphics类,没有引入相关的类包。
修改:
添加importjava.applet.*;
importjava.awt.*;
编译:
javacFirstApplet.java
运行:
appletviewerFirstApplet.html
错误:
java.lang.ClassCastException:
FirstApplet
atsun.applet.AppletPanel.createApplet(AppletPanel.java:
710)
atsun.applet.AppletPanel.runLoader(AppletPanel.java:
639)
atsun.applet.AppletPanel.run(AppletPanel.java:
319)
atjava.lang.Thread.run(Thread.java:
595)
原因:
该类不是一个Applet,没有声明为Applet的子类。
修改:
将类声明修改为publicclassFirstAppletextendsApplet
编译:
javacFirstApplet.java
运行:
appletviewerFirstApplet.html
结果:
关键字:
abstractbooleanbreakbytecasecatchcharclasscontinuedefault
dodoubleelseenumextendsfinalfinallyfloatforifimplements
importinstanceofintinterfacelongnativenewpackageprivateprotected
publicreturnshortstaticsuperswitchsynchronizedthisthrowthrows
transienttryvoidvolatilewhile
例2-1InputTest.java
importjava.util.*;
classInputTest{
publicstaticvoidmain(Stringargs[]){
Scannerreader=newScanner(System.in);
intn;
n=reader.nextInt();
System.out.println("n="+n);
}
}
编译:
javacInputTest.java
运行:
javaInputTest
输入:
455k
错误:
Exceptioninthread"main"java.util.InputMismatchException
atjava.util.Scanner.throwFor(Scanner.java:
909)
……
原因:
输入了不正确的数据,程序不够健壮
修改:
在语句n=reader.nextInt();前添加代码
while(!
reader.hasNextInt())
……
修改后的代码:
importjava.util.*;
classInputTest{
publicstaticvoidmain(Stringargs[]){
Scannerreader=newScanner(System.in);
intn;
System.out.println("请输入一个整数:
");
while(!
reader.hasNextInt()){
reader.nextLine();
System.out.println("输入格式错误,请重新输入:
");
}
n=reader.nextInt();
System.out.println("输入的整数为:
"+n);
}
}
例2-2Division.java
importjava.util.*;
classDivision{
publicstaticvoidmain(Stringargs[]){
Scannerreader=newScanner(System.in);
inta,b;
doubleq;
System.out.println("请输入被除数:
");
if(reader.hasNextInt())
a=reader.nextInt();
System.out.println("请输入除数:
");
if(reader.hasNextInt())
b=reader.nextInt();
q=a/b;
System.out.printf("除法算式及运算结果:
\n%10d/%d=%10.2f",a,b,q);
}
}
编译:
javacDivision.java
错误:
Division.java:
13:
错误:
可能尚未初始化变量a
q=a/b;
^
……
原因:
a、b只在分支语句的一个分支中获得初值,所以有可能并未被初始化
修改:
在定义变量a、b时便给出初值,或者在使用a、b变量之前的所有分支中都给a、b赋值
修改后的代码;
importjava.util.*;
classDivision{
publicstaticvoidmain(Stringargs[]){
inta,b;
doubleq;
System.out.println("请输入被除数:
");
a=input();
System.out.println("请输入除数:
");
b=input();
if(b==0){
System.out.println("被0除,非法运算!
");
return;
}
q=a/b;
System.out.printf("除法算式即运算结果:
\n%10d/%d=%10.2f",a,b,q);
}
privatestaticintinput(){
Scannerreader=newScanner(System.in);
while(!
reader.hasNextInt()){
reader.nextLine();
System.out.println("输入格式错误,请重新输入:
");
}
returnreader.nextInt();
}
}
依然存在的问题:
小数部分始终为0
原因:
整数的除法实现的是整除
修改:
将被除数a或除数b进行强制类型转换(q=(double)a/b;)
例2-3ArrayTest.java
classArrayTest{
publicstaticvoidmain(Stringargs[]){
System.out.println(b);
for(inti=0;i<=3;i++)
System.out.println(a[i]);
b=a;//b原来指向的内存空间将被回收
System.out.println(b.length);
}
}
编译:
javacArrayTest.java
错误:
ArrayTest.java:
5:
错误:
可能尚未初始化变量b
System.out.println(b);
^
原因:
引用变量必须使其指向一个对象或显示声明为null
修改:
添加语句b=newint[4];(或b=null)
运行:
javaArrayTest
错误:
Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:
3
atArrayTest.main(ArrayTest.java:
6)
原因:
数组越界
修改:
修改循环判断条件
注意:
b=a;执行后,b原来指向的内存空间将无任何引用变量指向它,JVM将会自动回收该内存空间;此外,此语句执行后,引用变量b与a相等,并且指向了相同的内存空间
例2-4Schedule.java
importjava.util.*;
classSchedule{
publicstaticvoidmain(Stringargs[]){
boolean[][]table=newboolean[7][5];
inti,j;
while(true){
System.out.println("请输入星期:
(1-7分别代表周一至周日)");
i=input();
System.out.println("请输入节次:
(1-5分别代表1、2节至9、10节各个时
间段)");
j=input();
if(i>0&&i<8&&j>0&&j<6){
table[i-1][j-1]=true;
}else
break;
}
System.out.println();
System.out.println("周一周二周三周四周五周六周日");
System.out.println();
for(i=0;i<10;i++){
System.out.printf("%2d",(i+1));
for(j=0;j<7;j++){
if(table[j][i/2])
System.out.print("Java");
else
System.out.print("");
}
System.out.println();
if(i%4==3)
System.out.println();
}
}
privatestaticintinput(){
Scannerreader=newScanner(System.in);
while(!
reader.hasNextInt()){
reader.nextLine();
System.out.println("输入格式错误,请重新输入:
");
}
returnreader.nextInt();
}
}
优先级:
postfix
expr++expr--
unary
++expr--expr+expr-expr~!
multiplicative
*/%
additive
+-
shift
<<>>>>>
relational
<><=>=instanceof
equality
==!
=
bitwiseAND
&
bitwiseexclusiveOR
^
bitwiseinclusiveOR
|
logicalAND
&&
logicalOR
||
ternary
?
:
assignment
=+=-=*=/=%=&=^=|=<<=>>=>>>=
例3-1OperatorTest.java
classOperatorTest{
publicstaticvoidmain(Stringargs[]){
inta=3,b=4,c=5,d=6,m=7,n=8;
intx=64,arr[]=newint[8];
longy=-0x1000000000L,z=4;
booleanflag;
flag=a>3&&b-->4;
flag=++c>5||++d>6;
flag=m==7|++n==8;
x>>=33;
y>>=33;
z>>=65;
System.out.printf("a=%d,b=%d;c=%d,d=%d,m=%d,n=%d\n",a,b,c,d,m,n);
System.out.printf("x=%d,y=%d,z=%d,x^z=%d\n",x,y,z,x^z);
System.out.println(arrinstanceofint[]);
}
}
例3-2ControlTest.java
importjava.util.*;
publicclassControlTest{
publicstaticvoidmain(Stringargs[]){
System.out.println("请输入一个整数:
");
intn=input();
for(inti=0;iif(i%2==0)
continue;
if(i%n==6)//(替换6为7)
break;
System.out.println("i="+i);
}
}
privatestaticintinput(){
Scannerreader=newScanner(System.in);
while(!
reader.hasNextInt()){
reader.nextLine();
System.out.println("输入格式错误,请重新输入:
");
}
returnreader.nextInt();
}
}
例4-1Circle.java
finalstaticdoublePI;
classCircle{
PI=3.14;
doubler;
doublecircumference(){
return2*PI*r;//实例方法可以访问类变量
}
doublearea(){
returnPI*r*r;
}
}
编译错误:
Circle.java:
1:
需要为class、interface或enum
finalstaticdoublePI;
^
Circle.java:
3:
需要<标识符>
PI=3.14;
^
原因:
类定义之外不能有任何语句;类体内,方法体外不允许有除成员变量定义外的任何语句;
修改:
classCircle{
finalstaticdoublePI=3.14;
……
例4-2CircleTest.java
classCircleTest{
publicstaticvoidmain(Stringargs[]){
Circlec=newCircle();
System.out.printf("AreaoftheCircleis:
%8.4f",c.area());
}
}
编译运行正确:
原因:
类的成员变量可不初始化——Circle类的r变量
类有默认的构造方法(不带任何参数)——Circlec=newCircle();
Ø为Circle添加构造方法:
Circle(doubler){
this.r=r;//形参r与成员变量r重名,必须使用this访问
}
运行错误:
Exceptioninthread"main"java.lang.NoSuchMethodError:
Circle:
method()V
notfoundatCircleTest.main(CircleTest.java:
3)
原因:
添加新的构造方法后,则默认的构造方法失效
修改:
Circlec=newCircle(3);
Ø在CircleTest类的main方法中添加以下代码:
Circlec1=null;
System.out.printf("PIis:
%8.4f",c1.PI);//或Circle.PI
编译运行正确:
原因:
类变量的初始化不需要该类的任何实例存在
Ø在Circle类中添加方法:
staticvoidsetPI(doublepi){
PI=pi;
}
编译错误:
Circle.java:
19:
无法为最终变量PI指定值
PI=pi;
^
Circle.java:
23:
无法从静态上下文中引用非静态变量this
this.r=r;
^
原因:
final常量的值无法更改,静态方法不能访问实例变量。
修改:
删除PI的final定义以及setPI方法的static定义
Ø修改CircleTest类的main方法:
Circlec1=null;
System.out.printf("PIis:
%8.4f\n",c1.PI);
c1.setPI(3.1415926);
Circlec=newCircle(3);
System.out.printf("AreaoftheCircleis:
%8.4f\n",c.area());
运行结果:
PIis:
3.1400
AreaoftheCircleis:
28.2743
原因:
Circle类的类变量PI已经发生改变,改变对所有Circle实例均有效
例4-3SomeThing.java
classSomeThing{
intx;
inty;
voidmove(intx,inty){
this.x=x;
this.y=y;
}
}
以下那些形式的重载有效?
booleanmove(intx,inty){
booleanflag=(this.x==x)&&(this.y==y);
this.x=x;
this.y=y;
returnflag;
}//错误,仅返回值不同
voidmove(intwidth,intheight){
x+=width;
y+=height;
}//错误,仅变量名不同
voidmove(intdistance,booleandirection){
if(direction)
x+=distance;
else
y+=distance;
}//正确,参数类型不同
例4-4Card.java
classCard{
intid;
doublebalance;
Card(intid,doublebalance){
this.id=id;
this.balance=b