Java入门(5) JAVA语言基本语法
摘要
本章中主要通过详尽的实例,配以合理的练习,让读者了解、掌握Java语言的基本语法。通过本章的学习,读者应能学会:Java程序的结构、变量、方法、运算符、表达式等,以便今后编写Java程序时更加得心应手。
(2002-08-29 14:09:18)
--------------------------------------------------------------------------------
By Wing, 出处:fjxufeng
本章目标:
本章中主要通过详尽的实例,配以合理的练习,让读者了解、掌握Java语言的基本语法。通过本章的学习,读者应能学会:Java程序的结构、变量、方法、运算符、表达式等,以便今后编写Java程序时更加得心应手。
5.1 JAVA程序结构
传授新知
在上一章中,我们就已经看到了两个使用Java语言编写的程序实例,不仅编译、运行了它,而且还对这两个程序使用“逐层解析法”做了详细的分析,相信各种应该对Java编写的程序有了一定的了解。
在本小节中,我们就更系统地说说Java程序的结构。下面我们再来看一个Java程序。
源程序:TheTestApplet.java
import java.applet.Applet;
public class TheTestApplet extends Applet
{
String programOut;
// This section will run in browse initialization
public void init ()
{
programOut=”This is a test!”;
displayMessage();
}
/* This is displayMessage function */
public void displayMessage()
{
System.out .println(programOut);
}
}
这是一个十分有代表性的一个程序,下图直观地标出了这个Java程序的结构:
图5-1 Java程序结构示意图
也就是说,通常一个Java程序可以分成五个部分:
1."import"部分
也就是输入语句部分,它相当于C/C++语言中的include语句。在Java语言中,import语句是用来通知Java编译器,在这个程序中正在使用当前类外部的其它类。
在本程序中,我们定义的是一个叫TheTestApplet的类,它是一个小应用程序类,因此必须通知编译器我们的类是在已定义的Applet(小应用程序类)的基础上定义的。(也就是TheTestApplet类是Applet类的子类,Applet类是TheTestApplet类的超类。
这一个部分应在程序的最开始部分。
注意:
import语句在功能上与C/C++语言中的include语句相同,但请大家注意它们之间有两大不同:
1) C/C++语言中用include是包含外部文件,所以include后面应是文件名,而import是输入外部类,所以import后面应是类名;
2) 与include不同,import语句后面应该跟上“;”,否则会出错。
2. "class define"部分
也就是类定义部分。它用于给类命名(如下粗体字部分所示):
public class The TestApplet extends Applet
另外,如果你的类是建立在另一个类的基础上(也就是子类),那么就必须在类定义时告诉Java编译器。(如下粗体字部分所示):
public class TheTestApplet extends Applet
注:extends,扩展。说明TheTestApplet是Applet类的扩展。
一些提示:
Applet类是所有小应用程序的基础,也就是说,Applet是它们的超类;所有的小应用程序都是Applet类的子类。
3. "field"部分
这个部分也叫做域,它是用于定义类属于类的数据(变量,具体将在下一小节说明)。这些数据是用来描述对象的状态,方法就是对这个数据进行操作的。
一些提示:
请不要直接从“filed”字面上去理解,大家只要记住它就是类的数据,就是类中的变量就行了。
4. "comment"部分
做为一个好的程序员,就应该知道在程序中适当地加上注释语句是十分重要的。请你一定要养成给自己的程序加注释的习惯,这样有助于别人看懂你的程序,也有助于“年代久远”之后自己阅读自己的程序。
一些提示:
也许有些读者会不以为然,但请您一定要记住:能方便地读懂的程序才谈得上可维护性,而可维护性对于一个程序的生命是至关重要的因素之一。
在Java中加入注释语句很简单,与C++相同,它支持两种格式:
1) 在注释的前面加上“//”;
2) 在注释的前面加上“/*”,结束加上“*/”。
注意:
如果使用“/*”、“*/”来加注释,请一定记住,不能嵌套使用它们!如:
/* this is comment1 /* this comment is in comment */ comment over */
对于这个注释语句,编译器将理解成为:
/* this is comment1 /* this comment is in comment */ 至此注释结束
comment over */成了合法的程序,这样就会出问题了。请大家一定注意。
5. "methods"部分
这部分就是方法部分,用为为类定义它的“骨血”---方法,方法指引类进行具体的活动和操作。关于方法的更多内容,我们将在本章的后面几个小节中详细说明。
自测练习
练习一:阅读本节中的源程序TheTestApplet.java,回答以下问题:
1) TheTestApplet.java是java __________。
a.应用程序 b.小应用
2) 要运行这个程序需要如何做?(请详细说明)
3) 这个程序的输出是什么?
练习二:修改TheTestApplet.java程序,使其满中以下要求:
1) 使程序输出“Haha,I can modify java program!”。
2) 将TheTestApplet类的名字改为AnotherApplet类。
练习三:阅读以下源程序,并回答问题:
import java.applet.Applet
import java.awt.Graphics
public class HelloWorldApplet extends Applet
{
String programOut;
public void paint(Graphics g)
{
programOut=”Haha,I can modify java program!”;
g.drawString(programOut,0,50);
}
}
1) 这段程序中有两处错误,请指出:
2) 这段程序中,属于“field”部分的语句有:
3) 属于“methods”部分的语句是:
练习答案
练习一:
1)a 这段程序是Java小应用程序(Java Applet)。
2)首先,创建TheTestApplet.java文件,将程序输入;
接着,执行javac TheTestApplet.java,编译它;
再次,编辑一个HTML文件,使其包含以下内容:
最后,使用AppletViewer或IE查看这个HTML文件。
3) 这个程序输出如下图所示:
图5-2 程序输出示意图
练习二:
1) 只需将programOut=”This is a test!”;这一行改为:
programOut=”Haha,I can modify java program!”;
2) 先将public class TheTestApplet extends Applet这一行改为:
public class AnotherApplet extends Applet
然后将存储这个程序的文件名改为AnotherApplet.java就行了。
练习三:
1) 错误在于,下面两句后面未加分号:
import java.applet.Applet
import java.awt.Graphics
2) 属于“field”部分的语句是:
String programOut;
3) 属于“methods”部分的语句是:
public void paint(Graphics g)
{
programOut=”Haha,I can modify java program!”;
g.drawString(programOut,0,50);
}
5.2 变量
传授新知
刚才,我们系统地了解了Java程序的结构,现在我们一起来学习新的老概念----变量。之所以说新,是针对我们这本书来说;而它又是广泛出现在各种程序设计语言教材中的一个术语,所以可谓之旧。
如果有程序设计经验的人,应该不需要我再多说,都能够很清楚什么叫变量。在Java语言中,对象就是由数据及对这些数据的操作组成的。
5.2.1 什么是变量
变量就是这些数据的容器,在Java语言中,它也被称为域。我们都知道,在计算机中所有的数据都是存储在内存中的,形象地说,变量就是在内存中预分配一个空间,这个空间里可以根据需要存放不同的数据。下面我们通过几张图简单地说明一下这个问题:
1) 定义变量:
定义变量,就象在内存中拿到一块空间,然后标上自己的名字(在下图中是A),这个名字就是变量名。
图5-3 定义变量示意图
2) 给变量赋值:
给变量赋值,就象将一个数、或一个字符(在下图是一个数:5),放到刚才分配的空间中去。以后访问A就可以得到5这个数。
图5-4 给变量赋值示意图
3) 修改变量的值
修改变量赋值,与给变量赋值类似,只过是这个变量里本身就存在一个值,新的一个值是取而代之。
图5-5 修改变量的值示意图
5.2.2 定义变量
在Java语言中,使用变量之前,必须先定义变量的类型和名字。定义变量也可以称为“声明变量”。在本章中的第一个程序里,我们就看到过了一个定义变量语句:
String programOut;
变量声明的格式是:
变量类型 变量名
也就是说,String programOut语句定义了一个String型的变量,(关于变量类型,我们将在下一章中详细说明)这个变量的名字叫做programOut。
注意:
请别忘了在变量声明的后面一定要加上“;”,表示一句结束,否则将出错。
知道了变量声明的格式之后,就只剩下两个问题了:
1. 变量名的取名规则:
变量名是不是可以随便取呢?不,虽然在Java语言中关于变量名的限制并不多,但也并意味着可以随便取。
1) 变量名可以由字母字符、数字、标点组成;
2) 变量名必须以字母字符、“$”(美元符号)、“_”(下划线)开头;
3) 变量名不能与Java语言的保留字重名;
一些说明:
保留字是指被Java使用掉的字母组合,由于在程序中有特殊的意义,所以不能用作变量名。如Applet就不能做为变量名。
注意:
有两个问题要特别强调一下:
1) Java语言的变量是区分大小写的,progarmOut与ProgramOut两个变量名是不同的,请一定注意;
2)以$符开始的变量是合法的,但是不鼓励的。
2. 应该在什么地定义变量:
在Java语言中,只要在同一个代码段没有同名的变量,就可以在程序中的任何一个地方定义变量。一个代码块就是两个相对的“{”、“}”之间的部分。
不过,做为一个良好的编程习惯,您应该在使用变量的代码块的开始处定义变量。这样利用程序的维护。这一点,当您看了“变量的作用范围”小节就会深有体会的。
5.2.3 为变量赋值
定义了变量之后,当然就要使用,也就是为变量赋值。在Java语言中,与所有的程序设计语言一样,提供了很简单的手段为变量赋值:
变量名 = 值
下面就是几个为变量赋值的例子:
String programOut;
int _weight;
char $ch;
programOut=”This is a test”;
_weight=220;
$ch=’A’;
在Java语言中,也允许你在一个语句中完成变量的定义与赋值:
变量类型 变量名 = 值
这样,上面的示例就可以改为:
String programOut=”This is a test”;
int _weight t=220;
char $ch=’A’;
5.2.4 变量的作用范围
变量的定义、赋值都比较简单,而在变量这一概念中,有一个十分重要的知识点,也是最难理解的知识点,那就是“变量的作用范围”。
一个变量的“影响力”是有限的,它的“影响力”取决于这个变量在什么位置被定义。在它的“影响力”到达的地方,程序就可访问它;而在它“影响力”无法到达的地方,它就像不存在一样。
我们把变量的“影响力”称为作用范围。那么如何判断一个变量的作用范围呢?请你记住一句话:每个变量只在定义它的代码块中(包括这个代码块包含的代码块)生效。(一个代码块就是两个相对的“{”、“}”之间的部分)
一些提示:
一个变量的作用范围外可以有一个与它同名的变量名存在,它们虽然同名,同在一个程序,却可以相安无事的共存。
下面,我们通过一个实践来体会一下变量的作用范围。
实例说明
首先,我们输入以下源程序,编译后运行它,然后观察输出结果。
源程序:VariableScope.java
import java.applet.Applet;
public class VariableScope extends Applet
{
String preString=”Good Luck! “;
public void init ()
{
printOne();
printTwo();
}
public void printOne()
{
String printaddString=”NO.1”;
System.out .println(preString+printaddString);
}
public void printTwo()
{
String printaddString=”NO.2”;
System.out .println(preString+printaddString);
}
}
这个程序结果如下图所示:
图5-6 VariableScop类执行结果
在这个程序中,我们一共定义了三个变量:
1) preString:它所在的代码段是整个VariableScope类;
2) printaddString:第一个printaddString所在的代码段是printOne方法中;
3) printaddString:第二个printaddString所在的代码段是printTwo方法中;
一些提示:
在printOne方法与printTwo方法中都定义了一个变量printaddString,但它们并未冲突,工作得好好的。
你记得吗,我们曾经说过,为了程序更好维护,应把变量定义放在块的最前面,这样利于大家分清这个变量所在的块,就不容易看错。
自测练习
1) 请说明下面变量名是否合法,不合法的说明理由:
Xing ___________________________________________
@Ming _________________________________________
__________________________________________
_AGE __________________________________________
3fox ___________________________________________
$weight _________________________________________
2) 写出定义一个类型的int的变量Age,并赋值9的程序段:
如果只有一行代码,该如何写:
3) 在Java语言中,变量也叫做 __________。
a.方法 b.函数 c.状态数据 d.域
4) 以下关于变量作用范围的叙述,正确的是____________。
a. 是指变量可存数据的最大数量; b.是指变量中可存储数据的最大范围;
c.变量范围是包含这个变量定义的最近的一对大括号之间的代码段。
5) 本节实践说明部分的那段程序中,有三个变量,请分别标注出它们的变量作用范围。
练习答案
1) Xing:合法; @Ming:不合法,变量名不能以“@”开头;
:不合法,变量名不能以“<”开头; _ AGE:合法;
3fox:不合法,变量名不能以数字开头; $weight:合法
2) 使用标准的方法,应该为:
int Age;
Age = 9;
也可以使用一行来表示:int Age = 9;
3) d 变量也叫做域;
4) c 变量的作用范围是指它能够生效的范围;
5) 如下图所示:
图5-7 变量作用范围
5.3方法
传授新知
说完了变量,现在讲一个“旧酒新瓶”的概念---方法。它是“面向对象”引入的术语,它与其它非面向对象语言的函数(function)十分接近,但又有不同。下面我们就一起来学习一下。
5.3.1 什么是方法
方法是Java程序的灵魂,在Java中,方法就像C、C++、Pascal等程序设计语言里的函数一样,小应用程序、应用程序中的所有操作都是由方法来完成的。
使用一个形象的比喻,变量与方法就象是构建Java程序这一伟大建筑所使用的砖和瓦,是它们最终构成了Java的程序。
方法包含两个部分:
1) 声明:用来说明方法的相关信息;
2) 体:方法的实际内容。
5.3.2 定义一个方法
在前面的Java程序中,我们其实已经见过方法的定义了。下面我们就以本章第一个示例程序TheTestApplet中的displayMessage方法的定义为例,观察一下“方法定义”的语法结构与组成成分。
图5-8 “方法”的结构示意图
在这里,我们不讨论方法体,而主要分析方法的声明,让大家明白如何定义的一个方法、更加明白和更解Java语言程序。
现在我们一起来认真分析一下方法的声明部分:
public void displayMessage()
方法声明的格式是:
访问说明符 [修饰符] 返回值类型 方法名 ([参数列表])
注:其中用“[]”括起来的部分是可选的。
下面,我们就逐个地做一简单的说明:
1.访问说明符
在方法的定义中,第一个部分是“访问说明符”。顾名思义,它就是用来定义谁能够访问这个方法。在Java语言中提供了四种访问说明符:
1) public
“public”这个单词的意思是:公众的、公用的。顾名思义,如果一个方法将其访问说明符定义为public,那么这个方法能够被所有的外部类访问。
一些说明:
在此,外部类指的是这个方法所在类以外的类。
2) protected
“protected”这个单词的意思是:受保护。顾名思义,如果一个方法将其访问说明符定义为protected,那么就不是所有的外部类都能够访问这个方法,因为这个方法是受保护的,只有外部类是这个方法所在类的子类才能访问它。
3) private
“private”这个单词的意思是:私人的、私有的。如果一个方法的访问说明符选用了private的话,那么所有的外部类都无法能够访问这个方法。这是最严格的保护。
4) default
这是最特殊的一种访问说明,如果一个类与该方法所在类同属一个包,那么就可以访问这个方法。
最后,我们通过一幅图来说明:
图5-9 访问说明符示意图
在我们前面的例子中,dispalyMessage方法使用了public这个访问说明符,说明它可以让任何外部类访问。
2.修饰符
修饰符在方法的定义中是可选项,用来为方法设置一些特珠的属性,由于它比较抽象,而且在初学Java时并不常遇到它们,所在在此我们暂时跳过。
在前面的例子中,并没有定义修饰符。
3.返回值类型
当一个方法被调用时,它可以返回一个值给该方法的调用者。我们可以通过定义方法的“返回值类型”来规定它返回的值的数据类型。这个数据类型可以是任何一个有效的Java数据类型(关于数据类型,请参见下一章),或者void。
如果象本例中一样,返回值类型为void,则说明这个方法调用后不返回任何值。
4.方法名
就象要为类定义类名,要为变量定义变量名一样,我们也需要为方法命名。象本例中,方法名是:displayMessage。
方法名的起名规则与变量名一样:
1) 方法名可以由字母字符、数字、标点组成;
2)方法名必须以字母字符、“$”(美元符号)、“_”(下划线)开头;
3)方法名不能与Java语言的保留字重名。
有一点需要提醒您注意,为了使你的程序更容易维护,请取一个容易通过名字猜出作用的方法名,或者在方法定义的前面加上适当的注释。
一些说明:
在Java语言中,允许许多方法共用一个名字,我们将在遇到这种情况时做详细的说明。大家现在只要有这样的印象就可以了。
5.参数列表
参数列表在方法的定义中也是可选项,它的作用与函数的参数类似。您可以通过参数列表将一些数据传递给方法。具体的用法与功能,我们会在以后的章节中详细说明。
一些说明:
对于一个方法,还有一个特殊的定义,那就是“签名”,它是由给定方法的名字和参数组成的。如本例中的dispalyMessage方法的签名就是:
public void displayMessage()
其实,就是将方法体、分隔符去掉,就可以得到一个方法的“签名”了。就象人们使用人的签名确定一个人一样,一个方法的签名也就确定了一个方法。
5.3.3方法的类型
根据“方法”完成的工作性质,通常可以分为三类:
1)“转换”型:调用这种方法,将修改内部变量的值;
2)“访问”型:调用这种方法,将返回内部变量的值;
3)“效果”型:调用这种方法,通常不返回任何值,而是执行了某个动作,例如向屏幕打印一些信息。
那么,大家以为刚才我们举的这个例子:displayMessage是哪一种类型的方法呢?对,它是“效果”型的方法,它并未修改什么变量,而是完成“向屏幕输出字符”这一动作。
自测练习
1) 方法定义中不包含 ___________ 部分。
a. 方法名 b. 访问说明符 c. 方法类型 d. 参数列表
2) 在Java中,方法同名可以吗?__________。
a. 可以 b. 不可以
3) 如果想让一个方法只能够被子类访问,应该使用访问说明符 ___________定义。
a. public b. private c. default d. protected
4) 如果想让一个方法不能被任何外部类访问,应使用访问说明符 ___________定义。
a. public b. private c. default d. protected
5) 下面这一个方法,它是_________型的方法。
public void printOne()
{
String printaddString=”NO.1”;
System.out .println(preString+printaddString);
}
a. 转换型 b. 效果型 c. 访问型
6) 阅读第5题的源代码,回答以下问题:
① 这个方法的访问说明符是什么? ____________________________________
② 这个方法的返回值类型是什么? ____________________________________
③ 这个方法的方法名是什么?________________________________________
④ 这个方法是否有参数列表?________________________________________
⑤ 请写出这个方法的“签名” _______________________________________
练习答案
1)c 方法类型并不在方法定义时指出;
2)a 在Java中是允许这样的情况出现,但有一些特殊的要求;
3)d 定义其为ptotected,这样就只有子类才能访问它了;
4)b 使用private,使这个方法成为私有的,这样别的类就无法访问了;
5)b 这个方法实现的是执行一个动作,属于效果型的。
6)① 访问说明符是:public
② 返回值类型是:void
③ 方法名是:printOne
④ 它没有参数列表;
⑤ 它的“签名”是:public void printOne()
5.4 运算符
传授新知
运算符是用来表示某一种运算的符号。在程序设计中,我们经常要进行各种运算,从而达到改变变量的值的目的。要实现运算,就要使用运算符,在本节中,我们就一起关注一下Java语言所提供的运算符。
5.4.1算术运算符
顾名思义,算术运算符就是那些用来进行算术运算的符号。这类运算符是最基本、最常见的,它包括:
运算符 说 明 示 例
+ 执行加法运算 5+5 (等于10)
- 执行减法运算 6-2 (等于4)
* 执行乘法运算 5*7 (等于35)
/ 执行除法运算 8/2 (等于4)
% 执行模运算(就是求余数) 7%2 (等于1)
表5-1 算术运算符
一些说明:
%:模运算,就是求余数。7/2=3…1,所以7%2=1。
5.4.2赋值运算符
赋值运算符就是用来为变量赋值的。最基本的赋值运算符就是等号“=”。我们在变量那一个小节就已经使用过了:“变量名=值”,这里的“=”就是赋值运算符。
在Java语言中,还提供了一种叫算术赋值运算符:
运算符 实例 说明
+= X += 5 等价于 X = X+5
-= X -= 5 等价于 X = X-5
*= X *= 5 等价于 X = X*5
/= X /= 5 等价于 X = X/5
%= X %= 5 等价于 X = X%5
表5-2 赋值运算符
5.4.3自增/减运算符
如果对C/C++有一些了解的话,你一定记得++、--两个运算符吧,它们经常出现在程序中,这两个运算符是一元运算符。“++”就是自增运算符,而自减运算符就是“--”。
自增运算符的作用是使变量加1,而自减运算符的作用则是使变量减1。
也就是说:
X ++ 等价于 X+=1、X=X+1;
X-- 等价于 X-=1、X=X-1;
自增/减运算符放在变量的左边或者右边将使得到值完全不同,完成的功能也完成不同。为了更好地理解它,下面我们来看一个例子。
实例说明
1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。
c:javastudy> notepad test01.java
在写字板中,输入下面的程序代码,然后存盘退出。
源程序:test01.java
public class test01
{
public static void main(String args[])
{
int x=5;
int y=x++;
int x1=5;
int y1=++x1;
System.out.println("x="+x);
System.out.println("y="+y);
System.out.println("x1="+x1);
System.out.println("y1="+y1);
}
}
2.编译程序,输入命令:
c:javastudy> javac test01.java
3.编译完成后,执行这个程序了。输入命令:
c:javastudy> java test01
这个程序的结果如下图所示:
图5-10 test01的输出
传授新知
从上面的练习,可以看出:
int x=5;
int y=x++;
的作用是:首先令x=5,接着y=x++,x就变成了6,然而y的值是多少呢?y=x,那到底是6还是5,程序的输出告诉我们,是5。那么,程序段
int x1=5;
int y1=++x1;
的作用是:首先令x1=5,接着y1= ++x1,x1就变成了6,然而y1的值是多少呢?y1=x1,那到底是6还是5,程序的输出告诉我们,是6。
通过比较这两个程序,我们可以发现,它们的区别就在于++在什么地方:变量的前面,还是变量的后面。
如果在变量的后面,则是执行了这个语句之后,再使自己加1。
如果在变量的前面,则是先使自己加1,然后再执行这个语句。
5.4.4关系运算符
我们在现实生活中经常遇到比较,而在使用Java语言进行程序设计时,也常常需要对两个对象进行比较,例如:比较两个对象是否相低,或者哪个对象更大些…。
Java语言提供了 种关系运算符:
1)“= =”:比较两个对象是否相等;
例如:a = = b
在这个表达式中,如果a等于b的话,表达式的值为“真”,否则为“假”。
2)“>”:大于
例如:a>b
在这个表达式中,如果a大于b的话,表达式的值为“真”,否则为“假”。
3)“<”:小于
例如:a
在这个表达式中,如果a小于b的话,表达式的值为“真”,否则为“假”。
4)“>=”:大于等于
例如:a>=b
在这个表达式中,如果a大于或者等于b的话,表达式的值为“真”,否则为“假”。
5)“<=”:小于等于
例如:a<=b
在这个表达式中,如果a小于或者等于b的话,表达式的值为“真”,否则为“假”。
5.4.5逻辑运算符
逻辑运算符又称为布尔运算符,是用来处理一些逻辑关系的运算符,它最经常应用于流程控制(关于流程控制的内容,我们将在第7章详细说明)。在Java语言中提供了四种逻辑运算符:
1) 与运算符:“&&”
2) 或运算符:“||”
3) 非运算符:“!”
4) 异或运算符:“^”
在逻辑运算世界中,只有两种值:真(true)、假(false)。所以不管是参与运算的变量,还是运算的结果都只有这两种可能的取值。
下面,我们就逐一对它们做一简单的说明。
1.与运算符“&&”
与运算符,可以理解为“而且”。例如:(yuwen > 85)&&(shuxue > 90)就可以理解成为语文成绩(yuwen)大于85分而且数学成绩(shuxue)大于90分。这样只要以下两个命题之一是假的,整句话说明的事情也就是假的。
1) 语文成绩大于85分;
2) 数学成绩大于90分;
如果我们使用X来代表第一个命题,Y来代表第二个命题,我们就可以得到下面这一张与运算表:
X Y X&&Y;
true(真) true(真) true(真)
true(真) false(假) false(假)
false(假) true(真) false(假)
false(假) false(假) false(假)
表5-3 与运算表
一些提示:
我们举个例子来说明,假如一个学生它的成绩是双科88,那么“语文成绩大于85”就是真的,而“数学成绩大于90”就是假的。这时如果我们说他“语文成绩大于85,而且数学成绩大于90”就是假的。
2.或运算符“||”
或运算符,则可以理解为“或者”。例如:(yuwen > 85)||(shuxue > 90)就可以理解成为语文成绩(yuwen)大于85分或者数学成绩(shuxue)大于90分。这样只要以下两个命题之一是真的,整句话说明的事情也就是真的。
1) 语文成绩大于85分;
2) 数学成绩大于90分;
如果我们使用X来代表第一个命题,Y来代表第二个命题,我们就可以得到下面这一张与运算表:
X Y X||Y
true(真) true(真) true(真)
true(真) false(假) true(真)
false(假) true(真) true(真)
false(假) false(假) false(假)
表5-4 或运算表
一些提示:
我们再用上面那个例子来说明,如果我们说“语文成绩大于85,或者数学成绩大于90”,则这句话就是真的。
3.非运算符“!”
非运算符,可以理解为“不是”、“非”。例如:!(yuwen > 85)就可以理解为语文成绩不大于85分。这时,如果语文成绩大于85,则!(yuwen > 85)就是假的;如果语文成绩不大于85分,!(yuwen > 85)就是真的。
我们可以通过一张表来说明:
X !X
true(真) false(假)
false(假) true(真)
表5-5 非运算表
4.异或运算符“^”
最后一种逻辑运算符在现实生活中不常见,大家掌握起来就需要更费力一些了。这就是“异或”运算。
我们可以通过下表来理解这个逻辑运算:
X Y X^Y
true(真) true(真) false(假)
true(真) false(假) true(真)
false(假) true(真) true(真)
false(假) false(假) false(假)
表5-6 或运算表
从这张表,我们可以看出,异或运算的结果与或运算极为类似,只有当X与Y都是真(true)值时不同。我们可以通过一句话来记住它:“两个值不同,值为真;两个值相同,值为假”。(这不,因此我们称之为“异”。异者,不同也,也就是说两个值不能相同)
自测练习
1) Java语言中提供了_______个算术运算符。
a.6个 b.5个 c.4个
2) 70%20=________。
a.3.5 b.50 c.10
3) 阅读这个程序,写出这个程序的输出:
public class lianxi01
{
public static void main(String args[])
{
int x=5;
int y=--x;
System.out.println("x="+x);
System.out.println("y="+y);
}
}
4) 在Java语言中,或运算符是____________。
a.| b.|| c.& d.!!
5) true ^ true =___________
a.true b.false
6) 阅读以下程序,写出这个程序的输出,然后再运行一下这个程序检验一下是否正确:
public class lianxi02
{
public static void main(String args[])
{
int x=5;
System.out.println(x==5);
System.out.println(x>5);
System.out.println(x>=5);
System.out.println(x<5);
System.out.println(x<=5);
}
}
练习答案
1)b Java语言提供了“+”、“-”、“*”、“/”、“%”5个算术运算符;
2)c “%”是模运算符,也就求70/20的余数,因为70/20=3…10,余数为10;
3)该程序的输出如下图所示:
图5-11 lianxi01的输出
在这个程序中,首先将变量x赋值为5,然后执行y=--x时,先将x做一个自减运算(因为自减运算符--位于变量的前面,所以在赋值前先自减),再赋值给y,这样x就变成了4,最后将4赋给y。
4)b 在Java语言,或运算符是||。
5)b 异或运算是最奇怪的一种逻辑运算,只有两个值不相同时才返回真值。而在本题中,做异或运算的两个值都是true,所以返回假值。
6)该程序的输出如下图所示:
图5-12 lianxi02程序的输出
我们一起来看一下,由于x=5,所以:
1) 表达式x= =5:因为x是等于5,所以表达式的值为true;
2) 表达式x>5:因为x等于5,而不是大于5,所以表达式的值为false;
3) 表达式x>=5:因为x等于5,也就大于等于5,所以表达式的值为true;
4) 表达式x<5:因为x等于5,而不是小于5,所以表达式的值为false;
5) 表达式x<=5:因为x等于5,也就小于等于5,所以表达式的值为true;
5.5 表达式
传授新知
表达式是运算符与操作数的结合,它是Java语言重要的组成部分。其实在前面的章节中,我们就看到过了表达式,例如:
y=--x
这是一个极为简单的表达式。其实一个表达式是可以由多个运算符构成的,它就象我们在儿时就学到过的“四则计算”一样。例如:
y=x-z*5/2
我们需要通过表达式来执行各种复杂的计算及其它操作,所以我们必须搞懂如何计算表达式。其实掌握Java语言中表达式的计算方法并不难,大家只要借助当年对付“四则运算”的经验就可以轻松进行。
大家应该还能记得如何计算一个四则运算题吧!就如:
3*(2+6/3)
在这个例子中,我们最先计算括号中的表达式2+6/3,而在这个表达式中,应先计算除法,再计算加法,因此得到4,最后,我们再计算3*4,得到12。这种计算思路可以归纳成两点:
1) 有括号先算括号内的,有乘除先乘除,最后算加减;
2) 存在多个加减,或多个乘除,则从左到右进行;
:-P,好象在复习小学知识了!其实这种思路可以归纳成一句严谨的话:
按从左到右进行计算,先算优先级高的,再算优先级低的计算。
在以前的数学中,运算符的优先级可分为三级:
1) 最高级:( )
2) 第二级:*、/;
3) 最低级:+、-
而在Java语言中,运算符可就多了,那其实也一样,根据其优先级来逐步计算,直到运算结束。以下就是各种运算符的优先级表:
描述 运算符
最高优先级 [ ] ( )
一元运算符 ++ -- !
算术运算符1 * / %
算术运算符2 + /
关系运算符 < <= >= >
等于运算符 = = !=
逻辑运算符 && ´ ´ ^
赋值运算符 = += -= *= /= %=
表5-7 Java运算符优先级表
注意:
在这里仅列出了最常见的运算符,还不包括所有的运算符。关于一些特殊的运算符,我们会在遇到时再作说明。
5.6 包
传授新知
在Java语言中,包的使用是它的一大特色。使用Java提供的大量包,程序员可以轻松、方便地编写出复杂的、功能强大的应用程序。这些包就是Java应用程序编程界面,即Java API。它是为用户开发自己的类、小应用程序和应用程序而设计。
5.6.1 Java核心API
在Java语言,最基本的包就是Java语言核心API,它包括:
java.lang
java.lang.reflect
java.bean
java.rmi、java.rmi.registry和java.rmi.server
java.security、java.security.acl和java.security.interfaces
java.io
java.util
java.util.zip
java.net
java.awt
java.awt.image
java.awt.peer
java.awt.datatransfer
java.awt.event
java.applet
java.sql
java.text
下面,我们就对它们做一个简单的描述,以帮助大家能够更好的理解它们,方便大家在需要时使用。
1)java.lang
它是Java语言中最核心的包,它提供了最基本的数据类型,编程框架。
2)java.io
io,就是input/output的缩写,它是Java语言的标准输入/输出库。
3)java.util
它是由几个基本的实用类组成的,如日期类。
4)java.net
这是使Java具备网络处理功能的类,使用这个包就可轻松地创建、连接套接字(socket)、可以编写出自己的telnet、FTP等程序。
5)java.awt.*
代表java.awt以及java.awt.image等其它包。这些包就是通常说的Java Abstract Window Toolkit(抽象窗口工具包,简称AWT)。它是由一些能够为用户的小应用程序创建丰富、有吸引力的、实用的界面资源组成的。它是使用Java开发图形界面程序时必不可少的一个包。使用它就可创建出美丽的图形世界。
6)java.applet
大家应该还能够记得applet是什么吧?对,小应用程序。这个Java API中最小的包是编写Java小应用程序的基础。大家应该注意到,在我们前面的所有关于小应用程序的例子中,都包含了这样一句:
import java.applet
过去是这样,今后也是这样。要写Applet程序就要使用它!
7)java.sql
在这个包中,包含了JDBC(Java DataBase Connect,Java数据库连接),使用它可以开发出数据库应用程序。
5.6.2 JDK 1.2新增API
JDK 1.2版的发布,大大提高了Java语言的功能,它增加了许多包来完成,它们包括:
1)Java Enterprise API
在这个API中,提供对企业数据库的连接的支持。使用这个API可以构造出分布式的客户机/服务器方式的Java小应用程序和应用程序。这些程序可以运行在企业内部任何操作和硬件平台之上。
2)Java Commerce API
这个API主要是为网上购买和财政管理提供安全保障。
3)Java Server API
它是一个可扩展框架,它使用户能够开发互联网上的和企业网上的服务器端应用 程序。它提供了对服务器和管理信息资源统一和一致的访问。
4)Java Media API
它使得开发网页上的交互媒体成为现实。
5)Java Security API
它提供了一个保证小应用程序和应用程序安全功能的框架。
自测练习
1) Java API中最基本的包是:__________。
a. Java 核心API b.Java基本API c. Java Server API
2) 写一个小应用程序必须使用___________包。
a. java.awt b.java.applet c.java.application
3) 要使用Java语言开发socket程序,需要使用___________包。
a.java.net b.java.io c.java.awt
4) 而提供了图形界面开发支持的,是__________包。
a.java.io b.java.awt c.java.applet
5) 如果要使用JDBC,应该包含____________包。
a.java.io b.java.sql c.java.applet
6) 在JDK1.1中包含Java Server API吗?___________。
a.是的 b.不包含
7) Java Enterprise API最大的特点是支持了_____________程序的开发。
a.企业应用 b.集中式 c.分布式
8) 在JDK1.2版中,提供了一个同步的播放声音、视频的媒体播放器,你认为它属于___________包。
a.Java Enterprise API b.Java Commerce API c.Java Media API
9) 以下_____________包是为网上购买提供安全保证的。
a.Java Enterprise API b.Java Commerce API c.Java Security API
练习答案
1)a Java语言最基本的API称为核心API。
2)b 在java.applet包中包含了所有开发小应用程序所需要的类。
3)a 在java.net包中包含了对套接字程序的支持。
4)b 在java.awt包中提供了一套抽象窗口工具包,以供开发GUI之用。
5)b 所有与数据库操作有关的类,包含在java.sql中。
6)b Java Enterprise API是在JDK1.2中发布的。
7)c 它支持的是分布式C/S结构的程序开发。
8)c 提供这方面的,当然是Java Media API。
9)b Java Security API是提供安全,而不网上购买安全。
摘要
本章中主要通过详尽的实例,配以合理的练习,让读者了解、掌握Java语言的基本语法。通过本章的学习,读者应能学会:Java程序的结构、变量、方法、运算符、表达式等,以便今后编写Java程序时更加得心应手。
(2002-08-29 14:09:18)
--------------------------------------------------------------------------------
By Wing, 出处:fjxufeng
本章目标:
本章中主要通过详尽的实例,配以合理的练习,让读者了解、掌握Java语言的基本语法。通过本章的学习,读者应能学会:Java程序的结构、变量、方法、运算符、表达式等,以便今后编写Java程序时更加得心应手。
5.1 JAVA程序结构
传授新知
在上一章中,我们就已经看到了两个使用Java语言编写的程序实例,不仅编译、运行了它,而且还对这两个程序使用“逐层解析法”做了详细的分析,相信各种应该对Java编写的程序有了一定的了解。
在本小节中,我们就更系统地说说Java程序的结构。下面我们再来看一个Java程序。
源程序:TheTestApplet.java
import java.applet.Applet;
public class TheTestApplet extends Applet
{
String programOut;
// This section will run in browse initialization
public void init ()
{
programOut=”This is a test!”;
displayMessage();
}
/* This is displayMessage function */
public void displayMessage()
{
System.out .println(programOut);
}
}
这是一个十分有代表性的一个程序,下图直观地标出了这个Java程序的结构:
图5-1 Java程序结构示意图
也就是说,通常一个Java程序可以分成五个部分:
1."import"部分
也就是输入语句部分,它相当于C/C++语言中的include语句。在Java语言中,import语句是用来通知Java编译器,在这个程序中正在使用当前类外部的其它类。
在本程序中,我们定义的是一个叫TheTestApplet的类,它是一个小应用程序类,因此必须通知编译器我们的类是在已定义的Applet(小应用程序类)的基础上定义的。(也就是TheTestApplet类是Applet类的子类,Applet类是TheTestApplet类的超类。
这一个部分应在程序的最开始部分。
注意:
import语句在功能上与C/C++语言中的include语句相同,但请大家注意它们之间有两大不同:
1) C/C++语言中用include是包含外部文件,所以include后面应是文件名,而import是输入外部类,所以import后面应是类名;
2) 与include不同,import语句后面应该跟上“;”,否则会出错。
2. "class define"部分
也就是类定义部分。它用于给类命名(如下粗体字部分所示):
public class The TestApplet extends Applet
另外,如果你的类是建立在另一个类的基础上(也就是子类),那么就必须在类定义时告诉Java编译器。(如下粗体字部分所示):
public class TheTestApplet extends Applet
注:extends,扩展。说明TheTestApplet是Applet类的扩展。
一些提示:
Applet类是所有小应用程序的基础,也就是说,Applet是它们的超类;所有的小应用程序都是Applet类的子类。
3. "field"部分
这个部分也叫做域,它是用于定义类属于类的数据(变量,具体将在下一小节说明)。这些数据是用来描述对象的状态,方法就是对这个数据进行操作的。
一些提示:
请不要直接从“filed”字面上去理解,大家只要记住它就是类的数据,就是类中的变量就行了。
4. "comment"部分
做为一个好的程序员,就应该知道在程序中适当地加上注释语句是十分重要的。请你一定要养成给自己的程序加注释的习惯,这样有助于别人看懂你的程序,也有助于“年代久远”之后自己阅读自己的程序。
一些提示:
也许有些读者会不以为然,但请您一定要记住:能方便地读懂的程序才谈得上可维护性,而可维护性对于一个程序的生命是至关重要的因素之一。
在Java中加入注释语句很简单,与C++相同,它支持两种格式:
1) 在注释的前面加上“//”;
2) 在注释的前面加上“/*”,结束加上“*/”。
注意:
如果使用“/*”、“*/”来加注释,请一定记住,不能嵌套使用它们!如:
/* this is comment1 /* this comment is in comment */ comment over */
对于这个注释语句,编译器将理解成为:
/* this is comment1 /* this comment is in comment */ 至此注释结束
comment over */成了合法的程序,这样就会出问题了。请大家一定注意。
5. "methods"部分
这部分就是方法部分,用为为类定义它的“骨血”---方法,方法指引类进行具体的活动和操作。关于方法的更多内容,我们将在本章的后面几个小节中详细说明。
自测练习
练习一:阅读本节中的源程序TheTestApplet.java,回答以下问题:
1) TheTestApplet.java是java __________。
a.应用程序 b.小应用
2) 要运行这个程序需要如何做?(请详细说明)
3) 这个程序的输出是什么?
练习二:修改TheTestApplet.java程序,使其满中以下要求:
1) 使程序输出“Haha,I can modify java program!”。
2) 将TheTestApplet类的名字改为AnotherApplet类。
练习三:阅读以下源程序,并回答问题:
import java.applet.Applet
import java.awt.Graphics
public class HelloWorldApplet extends Applet
{
String programOut;
public void paint(Graphics g)
{
programOut=”Haha,I can modify java program!”;
g.drawString(programOut,0,50);
}
}
1) 这段程序中有两处错误,请指出:
2) 这段程序中,属于“field”部分的语句有:
3) 属于“methods”部分的语句是:
练习答案
练习一:
1)a 这段程序是Java小应用程序(Java Applet)。
2)首先,创建TheTestApplet.java文件,将程序输入;
接着,执行javac TheTestApplet.java,编译它;
再次,编辑一个HTML文件,使其包含以下内容:
最后,使用AppletViewer或IE查看这个HTML文件。
3) 这个程序输出如下图所示:
图5-2 程序输出示意图
练习二:
1) 只需将programOut=”This is a test!”;这一行改为:
programOut=”Haha,I can modify java program!”;
2) 先将public class TheTestApplet extends Applet这一行改为:
public class AnotherApplet extends Applet
然后将存储这个程序的文件名改为AnotherApplet.java就行了。
练习三:
1) 错误在于,下面两句后面未加分号:
import java.applet.Applet
import java.awt.Graphics
2) 属于“field”部分的语句是:
String programOut;
3) 属于“methods”部分的语句是:
public void paint(Graphics g)
{
programOut=”Haha,I can modify java program!”;
g.drawString(programOut,0,50);
}
5.2 变量
传授新知
刚才,我们系统地了解了Java程序的结构,现在我们一起来学习新的老概念----变量。之所以说新,是针对我们这本书来说;而它又是广泛出现在各种程序设计语言教材中的一个术语,所以可谓之旧。
如果有程序设计经验的人,应该不需要我再多说,都能够很清楚什么叫变量。在Java语言中,对象就是由数据及对这些数据的操作组成的。
5.2.1 什么是变量
变量就是这些数据的容器,在Java语言中,它也被称为域。我们都知道,在计算机中所有的数据都是存储在内存中的,形象地说,变量就是在内存中预分配一个空间,这个空间里可以根据需要存放不同的数据。下面我们通过几张图简单地说明一下这个问题:
1) 定义变量:
定义变量,就象在内存中拿到一块空间,然后标上自己的名字(在下图中是A),这个名字就是变量名。
图5-3 定义变量示意图
2) 给变量赋值:
给变量赋值,就象将一个数、或一个字符(在下图是一个数:5),放到刚才分配的空间中去。以后访问A就可以得到5这个数。
图5-4 给变量赋值示意图
3) 修改变量的值
修改变量赋值,与给变量赋值类似,只过是这个变量里本身就存在一个值,新的一个值是取而代之。
图5-5 修改变量的值示意图
5.2.2 定义变量
在Java语言中,使用变量之前,必须先定义变量的类型和名字。定义变量也可以称为“声明变量”。在本章中的第一个程序里,我们就看到过了一个定义变量语句:
String programOut;
变量声明的格式是:
变量类型 变量名
也就是说,String programOut语句定义了一个String型的变量,(关于变量类型,我们将在下一章中详细说明)这个变量的名字叫做programOut。
注意:
请别忘了在变量声明的后面一定要加上“;”,表示一句结束,否则将出错。
知道了变量声明的格式之后,就只剩下两个问题了:
1. 变量名的取名规则:
变量名是不是可以随便取呢?不,虽然在Java语言中关于变量名的限制并不多,但也并意味着可以随便取。
1) 变量名可以由字母字符、数字、标点组成;
2) 变量名必须以字母字符、“$”(美元符号)、“_”(下划线)开头;
3) 变量名不能与Java语言的保留字重名;
一些说明:
保留字是指被Java使用掉的字母组合,由于在程序中有特殊的意义,所以不能用作变量名。如Applet就不能做为变量名。
注意:
有两个问题要特别强调一下:
1) Java语言的变量是区分大小写的,progarmOut与ProgramOut两个变量名是不同的,请一定注意;
2)以$符开始的变量是合法的,但是不鼓励的。
2. 应该在什么地定义变量:
在Java语言中,只要在同一个代码段没有同名的变量,就可以在程序中的任何一个地方定义变量。一个代码块就是两个相对的“{”、“}”之间的部分。
不过,做为一个良好的编程习惯,您应该在使用变量的代码块的开始处定义变量。这样利用程序的维护。这一点,当您看了“变量的作用范围”小节就会深有体会的。
5.2.3 为变量赋值
定义了变量之后,当然就要使用,也就是为变量赋值。在Java语言中,与所有的程序设计语言一样,提供了很简单的手段为变量赋值:
变量名 = 值
下面就是几个为变量赋值的例子:
String programOut;
int _weight;
char $ch;
programOut=”This is a test”;
_weight=220;
$ch=’A’;
在Java语言中,也允许你在一个语句中完成变量的定义与赋值:
变量类型 变量名 = 值
这样,上面的示例就可以改为:
String programOut=”This is a test”;
int _weight t=220;
char $ch=’A’;
5.2.4 变量的作用范围
变量的定义、赋值都比较简单,而在变量这一概念中,有一个十分重要的知识点,也是最难理解的知识点,那就是“变量的作用范围”。
一个变量的“影响力”是有限的,它的“影响力”取决于这个变量在什么位置被定义。在它的“影响力”到达的地方,程序就可访问它;而在它“影响力”无法到达的地方,它就像不存在一样。
我们把变量的“影响力”称为作用范围。那么如何判断一个变量的作用范围呢?请你记住一句话:每个变量只在定义它的代码块中(包括这个代码块包含的代码块)生效。(一个代码块就是两个相对的“{”、“}”之间的部分)
一些提示:
一个变量的作用范围外可以有一个与它同名的变量名存在,它们虽然同名,同在一个程序,却可以相安无事的共存。
下面,我们通过一个实践来体会一下变量的作用范围。
实例说明
首先,我们输入以下源程序,编译后运行它,然后观察输出结果。
源程序:VariableScope.java
import java.applet.Applet;
public class VariableScope extends Applet
{
String preString=”Good Luck! “;
public void init ()
{
printOne();
printTwo();
}
public void printOne()
{
String printaddString=”NO.1”;
System.out .println(preString+printaddString);
}
public void printTwo()
{
String printaddString=”NO.2”;
System.out .println(preString+printaddString);
}
}
这个程序结果如下图所示:
图5-6 VariableScop类执行结果
在这个程序中,我们一共定义了三个变量:
1) preString:它所在的代码段是整个VariableScope类;
2) printaddString:第一个printaddString所在的代码段是printOne方法中;
3) printaddString:第二个printaddString所在的代码段是printTwo方法中;
一些提示:
在printOne方法与printTwo方法中都定义了一个变量printaddString,但它们并未冲突,工作得好好的。
你记得吗,我们曾经说过,为了程序更好维护,应把变量定义放在块的最前面,这样利于大家分清这个变量所在的块,就不容易看错。
自测练习
1) 请说明下面变量名是否合法,不合法的说明理由:
Xing ___________________________________________
@Ming _________________________________________
__________________________________________
_AGE __________________________________________
3fox ___________________________________________
$weight _________________________________________
2) 写出定义一个类型的int的变量Age,并赋值9的程序段:
如果只有一行代码,该如何写:
3) 在Java语言中,变量也叫做 __________。
a.方法 b.函数 c.状态数据 d.域
4) 以下关于变量作用范围的叙述,正确的是____________。
a. 是指变量可存数据的最大数量; b.是指变量中可存储数据的最大范围;
c.变量范围是包含这个变量定义的最近的一对大括号之间的代码段。
5) 本节实践说明部分的那段程序中,有三个变量,请分别标注出它们的变量作用范围。
练习答案
1) Xing:合法; @Ming:不合法,变量名不能以“@”开头;
:不合法,变量名不能以“<”开头; _ AGE:合法;
3fox:不合法,变量名不能以数字开头; $weight:合法
2) 使用标准的方法,应该为:
int Age;
Age = 9;
也可以使用一行来表示:int Age = 9;
3) d 变量也叫做域;
4) c 变量的作用范围是指它能够生效的范围;
5) 如下图所示:
图5-7 变量作用范围
5.3方法
传授新知
说完了变量,现在讲一个“旧酒新瓶”的概念---方法。它是“面向对象”引入的术语,它与其它非面向对象语言的函数(function)十分接近,但又有不同。下面我们就一起来学习一下。
5.3.1 什么是方法
方法是Java程序的灵魂,在Java中,方法就像C、C++、Pascal等程序设计语言里的函数一样,小应用程序、应用程序中的所有操作都是由方法来完成的。
使用一个形象的比喻,变量与方法就象是构建Java程序这一伟大建筑所使用的砖和瓦,是它们最终构成了Java的程序。
方法包含两个部分:
1) 声明:用来说明方法的相关信息;
2) 体:方法的实际内容。
5.3.2 定义一个方法
在前面的Java程序中,我们其实已经见过方法的定义了。下面我们就以本章第一个示例程序TheTestApplet中的displayMessage方法的定义为例,观察一下“方法定义”的语法结构与组成成分。
图5-8 “方法”的结构示意图
在这里,我们不讨论方法体,而主要分析方法的声明,让大家明白如何定义的一个方法、更加明白和更解Java语言程序。
现在我们一起来认真分析一下方法的声明部分:
public void displayMessage()
方法声明的格式是:
访问说明符 [修饰符] 返回值类型 方法名 ([参数列表])
注:其中用“[]”括起来的部分是可选的。
下面,我们就逐个地做一简单的说明:
1.访问说明符
在方法的定义中,第一个部分是“访问说明符”。顾名思义,它就是用来定义谁能够访问这个方法。在Java语言中提供了四种访问说明符:
1) public
“public”这个单词的意思是:公众的、公用的。顾名思义,如果一个方法将其访问说明符定义为public,那么这个方法能够被所有的外部类访问。
一些说明:
在此,外部类指的是这个方法所在类以外的类。
2) protected
“protected”这个单词的意思是:受保护。顾名思义,如果一个方法将其访问说明符定义为protected,那么就不是所有的外部类都能够访问这个方法,因为这个方法是受保护的,只有外部类是这个方法所在类的子类才能访问它。
3) private
“private”这个单词的意思是:私人的、私有的。如果一个方法的访问说明符选用了private的话,那么所有的外部类都无法能够访问这个方法。这是最严格的保护。
4) default
这是最特殊的一种访问说明,如果一个类与该方法所在类同属一个包,那么就可以访问这个方法。
最后,我们通过一幅图来说明:
图5-9 访问说明符示意图
在我们前面的例子中,dispalyMessage方法使用了public这个访问说明符,说明它可以让任何外部类访问。
2.修饰符
修饰符在方法的定义中是可选项,用来为方法设置一些特珠的属性,由于它比较抽象,而且在初学Java时并不常遇到它们,所在在此我们暂时跳过。
在前面的例子中,并没有定义修饰符。
3.返回值类型
当一个方法被调用时,它可以返回一个值给该方法的调用者。我们可以通过定义方法的“返回值类型”来规定它返回的值的数据类型。这个数据类型可以是任何一个有效的Java数据类型(关于数据类型,请参见下一章),或者void。
如果象本例中一样,返回值类型为void,则说明这个方法调用后不返回任何值。
4.方法名
就象要为类定义类名,要为变量定义变量名一样,我们也需要为方法命名。象本例中,方法名是:displayMessage。
方法名的起名规则与变量名一样:
1) 方法名可以由字母字符、数字、标点组成;
2)方法名必须以字母字符、“$”(美元符号)、“_”(下划线)开头;
3)方法名不能与Java语言的保留字重名。
有一点需要提醒您注意,为了使你的程序更容易维护,请取一个容易通过名字猜出作用的方法名,或者在方法定义的前面加上适当的注释。
一些说明:
在Java语言中,允许许多方法共用一个名字,我们将在遇到这种情况时做详细的说明。大家现在只要有这样的印象就可以了。
5.参数列表
参数列表在方法的定义中也是可选项,它的作用与函数的参数类似。您可以通过参数列表将一些数据传递给方法。具体的用法与功能,我们会在以后的章节中详细说明。
一些说明:
对于一个方法,还有一个特殊的定义,那就是“签名”,它是由给定方法的名字和参数组成的。如本例中的dispalyMessage方法的签名就是:
public void displayMessage()
其实,就是将方法体、分隔符去掉,就可以得到一个方法的“签名”了。就象人们使用人的签名确定一个人一样,一个方法的签名也就确定了一个方法。
5.3.3方法的类型
根据“方法”完成的工作性质,通常可以分为三类:
1)“转换”型:调用这种方法,将修改内部变量的值;
2)“访问”型:调用这种方法,将返回内部变量的值;
3)“效果”型:调用这种方法,通常不返回任何值,而是执行了某个动作,例如向屏幕打印一些信息。
那么,大家以为刚才我们举的这个例子:displayMessage是哪一种类型的方法呢?对,它是“效果”型的方法,它并未修改什么变量,而是完成“向屏幕输出字符”这一动作。
自测练习
1) 方法定义中不包含 ___________ 部分。
a. 方法名 b. 访问说明符 c. 方法类型 d. 参数列表
2) 在Java中,方法同名可以吗?__________。
a. 可以 b. 不可以
3) 如果想让一个方法只能够被子类访问,应该使用访问说明符 ___________定义。
a. public b. private c. default d. protected
4) 如果想让一个方法不能被任何外部类访问,应使用访问说明符 ___________定义。
a. public b. private c. default d. protected
5) 下面这一个方法,它是_________型的方法。
public void printOne()
{
String printaddString=”NO.1”;
System.out .println(preString+printaddString);
}
a. 转换型 b. 效果型 c. 访问型
6) 阅读第5题的源代码,回答以下问题:
① 这个方法的访问说明符是什么? ____________________________________
② 这个方法的返回值类型是什么? ____________________________________
③ 这个方法的方法名是什么?________________________________________
④ 这个方法是否有参数列表?________________________________________
⑤ 请写出这个方法的“签名” _______________________________________
练习答案
1)c 方法类型并不在方法定义时指出;
2)a 在Java中是允许这样的情况出现,但有一些特殊的要求;
3)d 定义其为ptotected,这样就只有子类才能访问它了;
4)b 使用private,使这个方法成为私有的,这样别的类就无法访问了;
5)b 这个方法实现的是执行一个动作,属于效果型的。
6)① 访问说明符是:public
② 返回值类型是:void
③ 方法名是:printOne
④ 它没有参数列表;
⑤ 它的“签名”是:public void printOne()
5.4 运算符
传授新知
运算符是用来表示某一种运算的符号。在程序设计中,我们经常要进行各种运算,从而达到改变变量的值的目的。要实现运算,就要使用运算符,在本节中,我们就一起关注一下Java语言所提供的运算符。
5.4.1算术运算符
顾名思义,算术运算符就是那些用来进行算术运算的符号。这类运算符是最基本、最常见的,它包括:
运算符 说 明 示 例
+ 执行加法运算 5+5 (等于10)
- 执行减法运算 6-2 (等于4)
* 执行乘法运算 5*7 (等于35)
/ 执行除法运算 8/2 (等于4)
% 执行模运算(就是求余数) 7%2 (等于1)
表5-1 算术运算符
一些说明:
%:模运算,就是求余数。7/2=3…1,所以7%2=1。
5.4.2赋值运算符
赋值运算符就是用来为变量赋值的。最基本的赋值运算符就是等号“=”。我们在变量那一个小节就已经使用过了:“变量名=值”,这里的“=”就是赋值运算符。
在Java语言中,还提供了一种叫算术赋值运算符:
运算符 实例 说明
+= X += 5 等价于 X = X+5
-= X -= 5 等价于 X = X-5
*= X *= 5 等价于 X = X*5
/= X /= 5 等价于 X = X/5
%= X %= 5 等价于 X = X%5
表5-2 赋值运算符
5.4.3自增/减运算符
如果对C/C++有一些了解的话,你一定记得++、--两个运算符吧,它们经常出现在程序中,这两个运算符是一元运算符。“++”就是自增运算符,而自减运算符就是“--”。
自增运算符的作用是使变量加1,而自减运算符的作用则是使变量减1。
也就是说:
X ++ 等价于 X+=1、X=X+1;
X-- 等价于 X-=1、X=X-1;
自增/减运算符放在变量的左边或者右边将使得到值完全不同,完成的功能也完成不同。为了更好地理解它,下面我们来看一个例子。
实例说明
1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。
c:javastudy> notepad test01.java
在写字板中,输入下面的程序代码,然后存盘退出。
源程序:test01.java
public class test01
{
public static void main(String args[])
{
int x=5;
int y=x++;
int x1=5;
int y1=++x1;
System.out.println("x="+x);
System.out.println("y="+y);
System.out.println("x1="+x1);
System.out.println("y1="+y1);
}
}
2.编译程序,输入命令:
c:javastudy> javac test01.java
3.编译完成后,执行这个程序了。输入命令:
c:javastudy> java test01
这个程序的结果如下图所示:
图5-10 test01的输出
传授新知
从上面的练习,可以看出:
int x=5;
int y=x++;
的作用是:首先令x=5,接着y=x++,x就变成了6,然而y的值是多少呢?y=x,那到底是6还是5,程序的输出告诉我们,是5。那么,程序段
int x1=5;
int y1=++x1;
的作用是:首先令x1=5,接着y1= ++x1,x1就变成了6,然而y1的值是多少呢?y1=x1,那到底是6还是5,程序的输出告诉我们,是6。
通过比较这两个程序,我们可以发现,它们的区别就在于++在什么地方:变量的前面,还是变量的后面。
如果在变量的后面,则是执行了这个语句之后,再使自己加1。
如果在变量的前面,则是先使自己加1,然后再执行这个语句。
5.4.4关系运算符
我们在现实生活中经常遇到比较,而在使用Java语言进行程序设计时,也常常需要对两个对象进行比较,例如:比较两个对象是否相低,或者哪个对象更大些…。
Java语言提供了 种关系运算符:
1)“= =”:比较两个对象是否相等;
例如:a = = b
在这个表达式中,如果a等于b的话,表达式的值为“真”,否则为“假”。
2)“>”:大于
例如:a>b
在这个表达式中,如果a大于b的话,表达式的值为“真”,否则为“假”。
3)“<”:小于
例如:a
在这个表达式中,如果a小于b的话,表达式的值为“真”,否则为“假”。
4)“>=”:大于等于
例如:a>=b
在这个表达式中,如果a大于或者等于b的话,表达式的值为“真”,否则为“假”。
5)“<=”:小于等于
例如:a<=b
在这个表达式中,如果a小于或者等于b的话,表达式的值为“真”,否则为“假”。
5.4.5逻辑运算符
逻辑运算符又称为布尔运算符,是用来处理一些逻辑关系的运算符,它最经常应用于流程控制(关于流程控制的内容,我们将在第7章详细说明)。在Java语言中提供了四种逻辑运算符:
1) 与运算符:“&&”
2) 或运算符:“||”
3) 非运算符:“!”
4) 异或运算符:“^”
在逻辑运算世界中,只有两种值:真(true)、假(false)。所以不管是参与运算的变量,还是运算的结果都只有这两种可能的取值。
下面,我们就逐一对它们做一简单的说明。
1.与运算符“&&”
与运算符,可以理解为“而且”。例如:(yuwen > 85)&&(shuxue > 90)就可以理解成为语文成绩(yuwen)大于85分而且数学成绩(shuxue)大于90分。这样只要以下两个命题之一是假的,整句话说明的事情也就是假的。
1) 语文成绩大于85分;
2) 数学成绩大于90分;
如果我们使用X来代表第一个命题,Y来代表第二个命题,我们就可以得到下面这一张与运算表:
X Y X&&Y;
true(真) true(真) true(真)
true(真) false(假) false(假)
false(假) true(真) false(假)
false(假) false(假) false(假)
表5-3 与运算表
一些提示:
我们举个例子来说明,假如一个学生它的成绩是双科88,那么“语文成绩大于85”就是真的,而“数学成绩大于90”就是假的。这时如果我们说他“语文成绩大于85,而且数学成绩大于90”就是假的。
2.或运算符“||”
或运算符,则可以理解为“或者”。例如:(yuwen > 85)||(shuxue > 90)就可以理解成为语文成绩(yuwen)大于85分或者数学成绩(shuxue)大于90分。这样只要以下两个命题之一是真的,整句话说明的事情也就是真的。
1) 语文成绩大于85分;
2) 数学成绩大于90分;
如果我们使用X来代表第一个命题,Y来代表第二个命题,我们就可以得到下面这一张与运算表:
X Y X||Y
true(真) true(真) true(真)
true(真) false(假) true(真)
false(假) true(真) true(真)
false(假) false(假) false(假)
表5-4 或运算表
一些提示:
我们再用上面那个例子来说明,如果我们说“语文成绩大于85,或者数学成绩大于90”,则这句话就是真的。
3.非运算符“!”
非运算符,可以理解为“不是”、“非”。例如:!(yuwen > 85)就可以理解为语文成绩不大于85分。这时,如果语文成绩大于85,则!(yuwen > 85)就是假的;如果语文成绩不大于85分,!(yuwen > 85)就是真的。
我们可以通过一张表来说明:
X !X
true(真) false(假)
false(假) true(真)
表5-5 非运算表
4.异或运算符“^”
最后一种逻辑运算符在现实生活中不常见,大家掌握起来就需要更费力一些了。这就是“异或”运算。
我们可以通过下表来理解这个逻辑运算:
X Y X^Y
true(真) true(真) false(假)
true(真) false(假) true(真)
false(假) true(真) true(真)
false(假) false(假) false(假)
表5-6 或运算表
从这张表,我们可以看出,异或运算的结果与或运算极为类似,只有当X与Y都是真(true)值时不同。我们可以通过一句话来记住它:“两个值不同,值为真;两个值相同,值为假”。(这不,因此我们称之为“异”。异者,不同也,也就是说两个值不能相同)
自测练习
1) Java语言中提供了_______个算术运算符。
a.6个 b.5个 c.4个
2) 70%20=________。
a.3.5 b.50 c.10
3) 阅读这个程序,写出这个程序的输出:
public class lianxi01
{
public static void main(String args[])
{
int x=5;
int y=--x;
System.out.println("x="+x);
System.out.println("y="+y);
}
}
4) 在Java语言中,或运算符是____________。
a.| b.|| c.& d.!!
5) true ^ true =___________
a.true b.false
6) 阅读以下程序,写出这个程序的输出,然后再运行一下这个程序检验一下是否正确:
public class lianxi02
{
public static void main(String args[])
{
int x=5;
System.out.println(x==5);
System.out.println(x>5);
System.out.println(x>=5);
System.out.println(x<5);
System.out.println(x<=5);
}
}
练习答案
1)b Java语言提供了“+”、“-”、“*”、“/”、“%”5个算术运算符;
2)c “%”是模运算符,也就求70/20的余数,因为70/20=3…10,余数为10;
3)该程序的输出如下图所示:
图5-11 lianxi01的输出
在这个程序中,首先将变量x赋值为5,然后执行y=--x时,先将x做一个自减运算(因为自减运算符--位于变量的前面,所以在赋值前先自减),再赋值给y,这样x就变成了4,最后将4赋给y。
4)b 在Java语言,或运算符是||。
5)b 异或运算是最奇怪的一种逻辑运算,只有两个值不相同时才返回真值。而在本题中,做异或运算的两个值都是true,所以返回假值。
6)该程序的输出如下图所示:
图5-12 lianxi02程序的输出
我们一起来看一下,由于x=5,所以:
1) 表达式x= =5:因为x是等于5,所以表达式的值为true;
2) 表达式x>5:因为x等于5,而不是大于5,所以表达式的值为false;
3) 表达式x>=5:因为x等于5,也就大于等于5,所以表达式的值为true;
4) 表达式x<5:因为x等于5,而不是小于5,所以表达式的值为false;
5) 表达式x<=5:因为x等于5,也就小于等于5,所以表达式的值为true;
5.5 表达式
传授新知
表达式是运算符与操作数的结合,它是Java语言重要的组成部分。其实在前面的章节中,我们就看到过了表达式,例如:
y=--x
这是一个极为简单的表达式。其实一个表达式是可以由多个运算符构成的,它就象我们在儿时就学到过的“四则计算”一样。例如:
y=x-z*5/2
我们需要通过表达式来执行各种复杂的计算及其它操作,所以我们必须搞懂如何计算表达式。其实掌握Java语言中表达式的计算方法并不难,大家只要借助当年对付“四则运算”的经验就可以轻松进行。
大家应该还能记得如何计算一个四则运算题吧!就如:
3*(2+6/3)
在这个例子中,我们最先计算括号中的表达式2+6/3,而在这个表达式中,应先计算除法,再计算加法,因此得到4,最后,我们再计算3*4,得到12。这种计算思路可以归纳成两点:
1) 有括号先算括号内的,有乘除先乘除,最后算加减;
2) 存在多个加减,或多个乘除,则从左到右进行;
:-P,好象在复习小学知识了!其实这种思路可以归纳成一句严谨的话:
按从左到右进行计算,先算优先级高的,再算优先级低的计算。
在以前的数学中,运算符的优先级可分为三级:
1) 最高级:( )
2) 第二级:*、/;
3) 最低级:+、-
而在Java语言中,运算符可就多了,那其实也一样,根据其优先级来逐步计算,直到运算结束。以下就是各种运算符的优先级表:
描述 运算符
最高优先级 [ ] ( )
一元运算符 ++ -- !
算术运算符1 * / %
算术运算符2 + /
关系运算符 < <= >= >
等于运算符 = = !=
逻辑运算符 && ´ ´ ^
赋值运算符 = += -= *= /= %=
表5-7 Java运算符优先级表
注意:
在这里仅列出了最常见的运算符,还不包括所有的运算符。关于一些特殊的运算符,我们会在遇到时再作说明。
5.6 包
传授新知
在Java语言中,包的使用是它的一大特色。使用Java提供的大量包,程序员可以轻松、方便地编写出复杂的、功能强大的应用程序。这些包就是Java应用程序编程界面,即Java API。它是为用户开发自己的类、小应用程序和应用程序而设计。
5.6.1 Java核心API
在Java语言,最基本的包就是Java语言核心API,它包括:
java.lang
java.lang.reflect
java.bean
java.rmi、java.rmi.registry和java.rmi.server
java.security、java.security.acl和java.security.interfaces
java.io
java.util
java.util.zip
java.net
java.awt
java.awt.image
java.awt.peer
java.awt.datatransfer
java.awt.event
java.applet
java.sql
java.text
下面,我们就对它们做一个简单的描述,以帮助大家能够更好的理解它们,方便大家在需要时使用。
1)java.lang
它是Java语言中最核心的包,它提供了最基本的数据类型,编程框架。
2)java.io
io,就是input/output的缩写,它是Java语言的标准输入/输出库。
3)java.util
它是由几个基本的实用类组成的,如日期类。
4)java.net
这是使Java具备网络处理功能的类,使用这个包就可轻松地创建、连接套接字(socket)、可以编写出自己的telnet、FTP等程序。
5)java.awt.*
代表java.awt以及java.awt.image等其它包。这些包就是通常说的Java Abstract Window Toolkit(抽象窗口工具包,简称AWT)。它是由一些能够为用户的小应用程序创建丰富、有吸引力的、实用的界面资源组成的。它是使用Java开发图形界面程序时必不可少的一个包。使用它就可创建出美丽的图形世界。
6)java.applet
大家应该还能够记得applet是什么吧?对,小应用程序。这个Java API中最小的包是编写Java小应用程序的基础。大家应该注意到,在我们前面的所有关于小应用程序的例子中,都包含了这样一句:
import java.applet
过去是这样,今后也是这样。要写Applet程序就要使用它!
7)java.sql
在这个包中,包含了JDBC(Java DataBase Connect,Java数据库连接),使用它可以开发出数据库应用程序。
5.6.2 JDK 1.2新增API
JDK 1.2版的发布,大大提高了Java语言的功能,它增加了许多包来完成,它们包括:
1)Java Enterprise API
在这个API中,提供对企业数据库的连接的支持。使用这个API可以构造出分布式的客户机/服务器方式的Java小应用程序和应用程序。这些程序可以运行在企业内部任何操作和硬件平台之上。
2)Java Commerce API
这个API主要是为网上购买和财政管理提供安全保障。
3)Java Server API
它是一个可扩展框架,它使用户能够开发互联网上的和企业网上的服务器端应用 程序。它提供了对服务器和管理信息资源统一和一致的访问。
4)Java Media API
它使得开发网页上的交互媒体成为现实。
5)Java Security API
它提供了一个保证小应用程序和应用程序安全功能的框架。
自测练习
1) Java API中最基本的包是:__________。
a. Java 核心API b.Java基本API c. Java Server API
2) 写一个小应用程序必须使用___________包。
a. java.awt b.java.applet c.java.application
3) 要使用Java语言开发socket程序,需要使用___________包。
a.java.net b.java.io c.java.awt
4) 而提供了图形界面开发支持的,是__________包。
a.java.io b.java.awt c.java.applet
5) 如果要使用JDBC,应该包含____________包。
a.java.io b.java.sql c.java.applet
6) 在JDK1.1中包含Java Server API吗?___________。
a.是的 b.不包含
7) Java Enterprise API最大的特点是支持了_____________程序的开发。
a.企业应用 b.集中式 c.分布式
8) 在JDK1.2版中,提供了一个同步的播放声音、视频的媒体播放器,你认为它属于___________包。
a.Java Enterprise API b.Java Commerce API c.Java Media API
9) 以下_____________包是为网上购买提供安全保证的。
a.Java Enterprise API b.Java Commerce API c.Java Security API
练习答案
1)a Java语言最基本的API称为核心API。
2)b 在java.applet包中包含了所有开发小应用程序所需要的类。
3)a 在java.net包中包含了对套接字程序的支持。
4)b 在java.awt包中提供了一套抽象窗口工具包,以供开发GUI之用。
5)b 所有与数据库操作有关的类,包含在java.sql中。
6)b Java Enterprise API是在JDK1.2中发布的。
7)c 它支持的是分布式C/S结构的程序开发。
8)c 提供这方面的,当然是Java Media API。
9)b Java Security API是提供安全,而不网上购买安全。