Java编程入门_第1页
Java编程入门_第2页
Java编程入门_第3页
Java编程入门_第4页
Java编程入门_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JJaavvaa 编编程程入入门门理想情况下,在阅读本书前,你应该对 Java 程序语言已经有了相当程度的掌握。但或许你已经很久没有用 Java,或者你只是想通学习 Java 知识来进行手机游戏编程。如果你属于上述情况,那么本教程正是为你准备的。本教程不是要教你 Java 的所有细节,因为已经有大量的优秀书籍在做这些工作。相反,本教程只是想为你提供开发手机游戏程序所需的核心 Java 知识。1.1Hello,World!学习一门语言的最好方法是直截了当地去看看一个真正的程序是如何编写的。与传统介绍性的语言实例一样,这里是一个的 Java 版的经典的“Hello,World”程序。class H

2、elloWorld public static void main(String args) System.out.println(Hello, World!);有必要指出的是,这个程序并不是为了在手机上运行而设计的。记住,本教程是一个一般性的 Java 编程入门,而不是专门针对手机开发的。事实上,本教程所涉及的大部分实例都是在 Java 应用程序的命令行运行的,它们是所有 Java 程序中最简单的。用 Java 编译器(javac)编译 HelloWorld 程序后,你可以在 Java 解释器中运行它了。Java 编译器生成了一个叫做“HelloWorld.class”的可执行文件。这个命名

3、规则可能看上去有点怪,因为事实上大多数程序语言都是用.exe 作为可执行程序的扩展名。Java 偏偏没有这样。按照 Java 面向对象的特性,所有 Java 程序都存储在 Java 类中,它们在 Java 运行环境中作为对象被生成并执行。在命令行中输入“java HelloWorld”,就可以运行 HelloWorld 程序。如果已经安装了 Java 软件开发包( Software Development Kit , SDK ),计算机屏幕上会显示出“Hello,World!”。为了彻底理解在 HelloWorld 中发生的情况,让我们检查程序中的每行代码。首先,必须要明白 Java 非常倚重

4、于类。事实上,HelloWorld 的第一行语句就揭示了 HelloWorld 不仅仅是一个程序,而且是一个类。 通过进一步查看类实体中的语句,你可以看到这个类的名称被定义为HelloWorld。Java 编译器用这个名称作为可执行输出类的名字。HelloWorld 类包括一个成员方法。现在,你可以把这个方法看作一个和类关联的标准程序方法。HelloWorld 中这个唯一的方法叫做 main(),如果你曾经用过 C 或 C+,那么你应该对它很熟悉。类在 Java 解释器中执行时,是从 main()方法开始的。main()方法定义为带有一个 void 返回类型的“public static”。“

5、public”意味着该方法可以在类内和类外任意地方调用。“static”意味 1 Java 编程入门着该方法在这个类的所有实例中都是相同的。返回类型“void”意味着 main()没有返回值。main()方法只有一个参数 String args。args 是一个 String 对象的数组,表示程序执行时所传递的命令行参数。由于 HelloWorld 没有使用任何命令行参数,所以可以忽略 args 参数。在本教程后边,你可以学到更多关于字符串的知识。HelloWorld 类执行时会调用 main()方法。main()只包含一行语句,用来把消息“Hello,World”作为标准输出流打印到屏幕上,

6、如下所示:System.out.println(Hello, World!);由于对象嵌套,这条语句乍看上去有点混乱。为了帮助你把它弄清楚,我们从右向左来分析这句话。首先注意到这条语句的结尾是一个分号,它是从 C/C+借用过来的标准的 Java 语法。再左边可以看到一对括号中的字符串“Hello,World!”,这表明它是一个方法调用所用到的参数。实际上,这个被调用的方法就是 out 对象的 println()方法。println()方法和 C 中的 printf 方法很相似,只不过它是在字符串结尾附加一行新的字符(n)。out 对象是 System 对象的一个成员变量,用来表示标准输出流。最

7、后,System 对象是 Java 环境中封装系统功能的一个全局对象。这基本上就是 HelloWorld 类的全部内容,它是我们的第一个 Java 程序。如果你对 HelloWorld 类的说明还不是很明白,那也没什么关系。我们没有对 Java 语言进行说明就开始介绍 HelloWorld,仅仅是为了让你到实践中去学习 Java 代码。本教程剩下的部分更多是对 Java 语言的基本原理进行结构化的讨论。1.2标记当你提交一个 Java 程序给 Java 编译器时,编译器解析文本并提取每个单独的标记。标记(token)是语言中对于编译器有意义的最小元素,它定义了 Java 语言的结构。Java

8、包含的所有标记又叫做 Java 标记集(Java token set)。Java 标记集可以分为 5 类:标识符、关键字、字面量(literals)、运算符以及分隔符。Java 编译器也可以识别并丢弃注释和空白。Java 编译器在标记化一个源文件时丢弃了所有注释和空白。得到的结果标记被编译成与机器无关的 Java 字节码(bytecode),它可以在一个有解释能力的 Java 环境中运行。字节码符合 Java 虚拟机的要求,Java 虚拟机把处理器间的差异归结成一个虚拟处理器。记住,一个有解释能力的 Java 环境可以是 Java 命令行解释器,也可以是 Java 浏览器,还可以是本书大多数示

9、例所用到的支持 Java 功能的手机。1.2.1标识符标识符是表示名字的标记。这些名字可以指定给变量、方法和类,使得编译器能够唯一地识别它们。程序员为这些标识符起了一些有含义的名字。HelloWorld 是一个标识符,它分配名称 HelloWorld 给 HelloWorld.java 源文件中的类。 2 1.2标记尽管在 Java 中你可以为标识符起一些有创意性的名称,但是这里还是有些限制。所有 Java 标识符都区分大小写,而且必须以字母、下划线(_)或者$开头。字母包括大写字母和小写字母。后边的标识符字符可以包括数字 0 到 9。对标识符还有一个限制是,不能使用我们在下一部分列出的 Ja

10、va 的关键字。表 A.1 是一个合法和不合法标识符名称的对比表。表 A.1合法和不合法的 Java 标识符合法不合法HelloWorldHello(uses a space)Hi_MomHi_Mom!(uses a space and punctuation mark)heyDude33heyDude(begins with a numeral)Tallshort(this is a Java keyword)poundage#age(does not begin with letter)除了上述对 Java 标识符命名的限制外,你还应该遵循以下格式规范从而使你的程序更加简单、更加一致。命名

11、多个单词组成的标识符的时候,除了名字中间的每个单词的首写字母大写外,其他全部用小写,这是 Java 标准的命名规范。例如,变量 toughGuy 是正确的 Java 格式,而 toughguy、 ToughGuy 和 TOUGHGUY 都不合乎这种格式规则。这种规则不是一成不变的,它只是一种应该遵循的良好规则,因为大多数的 Java 代码都遵循这个规则。1.2.2关键字关键字是 Java 为了特定的用途而保留的预定义标识符,只能以受限制的、特定的方式使用。下面列出了 Java 中保留的关键字:abstractdoubleintstrictfpbooleanelseinterfacesuperb

12、reakextendslongswitchbytefinalnativesynchronizedcasefinallynewthiscatchfloatpackagethrowcharforprivatethrowsclassgotoprotectedtransientconstifpublictrycontinueimplementsreturnvoiddefaultimportshortvolatiledoinstanceofstaticwhile除了这些关键字外,Java 还保留了 null,true 和 false 这几个词,所以它们也是受限的。 3 Java 编程入门1.2.3字面量

13、以固定不变的方式使用的程序元素,叫做字面量或常量。字面量可以是数字、字符或字符串。数字字面量包括整数、浮点数和布尔量。字符型字面量总是指一个 Unicode 字符。包括多个字符的字符串也看作是字面量,尽管它们在 Java 中以对象的形式实现。Unicode 字符集是一个 16 位的字符集,它取代了 ASCII 字符集。因为它是 16 位字符集,所以它有足够的条目来表示其他语言中众多的符号和字符。1整数型字面量整数型字面量是 Java 程序中最常用的字面量。整数型字面量主要有三种不同的格式:十进制、十六进制和八进制。这些格式对应字面量所使用的数字系统的基本类型。十进制字面量的表现形式就是普通的数

14、字,没有什么特别注意的地方。十六进制数的表现形式是以 0x 或 0X 开头,表现方法与 C/C+中很相似。八进制数的表现形式是在数字前加 0。例如十进制数是 12 的整型字面量在 Java 中用十进制表示是 12,用十六进制表示是 0xC,用八进制表示是 014。整数型字面量缺省存储为 int 型,它是 32 位的有符号值。如果你需要一个很大的数,可以在数字末尾加上 l 或 L,把整型字面量强制存储为 long 型,如 79L。long 型是 64 位有符号值。2浮点型字面量浮点型字面量指的是像 3.142 这样带小数部分的十进制数。它们可以用标准的或特殊的符号表示,就是说数字 563.84

15、也可以写成 5.684e2。同整型字面量不同,浮点型字面量缺省是 64 位的 double 型。如果你知道 64 位没有必要,也可以选择使用小一点的 32 位的 float 型。指定为 float 型需要在数字末尾加上 f 或 F,如 5.6384e2f。如果你是个注意细节的人,你也可以明确指明你想为你的字面量选择 double 型作为存储单元,如3.142d。但由于浮点数缺省存储已经是 double 型,这个后缀也就没什么必要了。因为本教程是 Java 编程的入门基础,所以我介绍了浮点数字面量。然而,值得注意的是在 MIDP(移动信息设备平台,它是手机所用到的 Java 设备平台)中不支持浮

16、点数据类型和字面量。换句话说,在 Java 手机游戏代码中,不支持 double 型和 float 型。3布尔型字面量如果你使用过 C/C+,那么肯定会非常喜欢布尔型字面量。在 C 中没有 boolean 型,也没有布尔型字面量,用整数 1 和 0 替代布尔型中的真和假。Java 通过提供 boolean 型解决了这个问题, boolean 型有两种状态:真或假。无疑,Java 语言中的这两种状态用关键字 true 和 false 表示。在 Java 编程中,布尔型的字面量和整数型字面量一样常用,因为它们几乎出现在每一种类型的控制结构中。当你必须表示有两种可能的值的一个条件或状态的时候,boo

17、lean 类型总是你所需 4 1.2标记要的类型。在这部分稍后你将了解到更多有关 boolean 类型的知识。现在,只需要记住两个布尔型字面量:true 和 false。4字符型字面量字符型字面量表示单个的 Unicode 字符,是由一对单引号括起来。特殊字符(控制字符和不能被打印的字符)用反斜杠(“”)加字符表示。特殊字符的一个典型例子就是n,它在打印输出时强制从新的一行开始。表 A.2 显示了 Java 支持的特殊字符。表 A.2Java 支持的特殊字符描述表 示 方 法反斜杠续行符头退格b回车r换页f水平制表符t换行n单引号双引号”Unicode 字符udddd八进制数ddd一个 Uni

18、code 字面量的例子就是u0048,它是字符“H”的十六进制表示。相同字符用八进制表示就是110。如果想了解更多有关 Unicode 字符集的信息,可以浏览 Unicode 的站点。5字符串字面量字符串字面量表示多个字符,是由一对双引号括起来。不像本教程中介绍的其他字面量,Java中字符串字面量是通过 String 类来实现的。Java 中对于字符串字面量,先生成 String 类的实例,然后用双引号括起来的字符指定它的内容。从实用角度讲,Java 用对象来实现字符串实际上并不重要。这里要提到它的原因是为了说明 Java 正是面向对象的。 5 Jav

19、a 编程入门1.2.4操作符操作符表示的是对数据对象或对象执行的特定赋值或计算。这些操作数可以是字面量,变量或者有返回值方法。Java 支持以下操作符:+-*/ %&|& | != ?=+ - = += -= *= /= %= &= |= = != = . ( )仅仅是看看这些操作符,对我们如何使用它们可能帮助不大。不用担心,在本教程后边会了解到更多关于操作符和它们的使用。1.2.5分割符Java 编译器通过分割符来获知如何对代码进行分组。例如,一个列表中的项目用逗号分割,就像一条语句中项目列表一样。Java 支持以下分割符: ; , :1.2.6注释和空白在本教程前面已经知道 Java 编译

20、器在标记化一个源文件时丢弃了所有注释和空格。你可能想知道“什么是空白?如何支持注释?”。首先,空白包含空格、制表符和回车。所有空格、制表符和回车都被 Java 编译器当作注释丢弃。注释有 3 种不同的定义方式,如表 A.3 所示。表 A.3Java 支持的注释类型使 用 类 型用 法/* 注释 */在/*和*/间的所有字符被忽略掉/ 注释/后到行结尾的所有字符被忽略掉/* 注释 */和/*/一样,只是 javadoc 工具能够把注释自动生成文档如果你用 C 语言编写程序,那么你对第一种类型的注释(/* 注释 */)应该很熟悉了。编译器忽略注释分割符/*和*/间的所有字符。如你果使用过 C+,那

21、么你第二种类型的注释(/注释)也应该很熟悉了。编译器忽略出现在注释分割符/后到行结尾的所有字符。这两种注释类型是从 C 和 C+中借鉴的。最后一种注释类型(/* 注释 */)和 C 的注释风格一样,只是它能被 Java 文档生成工具 Javadoc 使用,从源码中自动生成文档。下面是使用各类型注释的一些示例:/* This is a C style comment. */ This is a C+ style comment./* This is a javadoc style comment. */ 6 1.3数据类型1.3数据类型数据类型是任何程序语言都具有的基本概念之一。数据类型定义了有

22、解释信息能力的存储方法来解释信息。数据类型与内存中的存储变量紧密关联,因为一个变量的数据类型决定了编译器如何解释内存中的内容。为了在内存中产生一个变量,必须要为这个变量声明一种类型和提供一个唯一标识变量的标识符。Java 声明变量的语句如下:Type Identifier , Identifier;声明语句告诉编译器在内存中为一个名称为“Identifier”类型为“Type”的变量分配空间。中括号中的可选项 identifier 表明可以声明多个相同类型的变量,它们彼此间用逗号隔开。最后,在所有 Java 语句中,声明语句用分号结束。Java 数据类型可以分为两类:简单型和复合型。简单数据类

23、型是核心类型,不是从其他类型派生而来。整型、浮点型、布尔型和字符型都是简单型。另一方面,复合型是以简单型为基础,包括字符串、数组和通用的接口和类。在本教程后边可以学习到数组相关内容。1.3.1整数类型整数类型用有符号的整数数字表示。共有 4 种整数类型:byte、short、int 和 long。每种类型在内存中所占用的空间不同,如表 A.4 所示。表 A.4Java 整数类型类型占 用 空 间byte8 bitsshort16 bitsint32 bitslong64 bits用前面讲过的声明语法来声明整数型的变量。以下是一些整数型变量的声明示例:int i;short rocketFuel

24、;long angle, magnitude;byte red, green, blue;1.3.2浮点类型浮点数类型用带小数部分的数字表示。这里有两种浮点类型:float 和 double。float 类型存储 32 位单精度数字,double 型存储 64 位双精度数字。浮点型变量的声明和整数型变量的声明非常相似。以下是一些浮点型变量的声明示例: 7 Java 编程入门float temperature;double windSpeed, barometricPressure;在 MIDP 中不支持 double 型和 float 型,所以在 Java 中开发手机游戏时也不能使用。这并不是

25、太可怕的限制,因为浮点计算效率太差,所以在游戏开发中才不能使用。1.3.3布尔型布尔型(boolean)用于存储两种状态之一:真或假。你可以把 boolean 型当作一位的整数(因为 1 位可以表示两个可能的值:1 或 0)。然而,不是用 1 和 0 表示,而是用 Java 中的关键字 true和 false 表示。用 boolean 型声明布尔值:boolean gameOver;1.3.4字符类型字符数据类型用于存储一个 Unicode 字符。因为 Unicode 字符集是由 16 位值组成,所以 char 类型被存储为 16 位无符号整数。生成 char 类型变量的方法如下所示:char

26、 firstInitial, lastInitial;请记住 char 类型只是用来存储单个字符。如果你有 C/C+背景,你可能试图生成一个 char 类型数组来构成字符串。Java 中就没有这个必要了,因为是通过 String 类来处理字符串的。并不是说你不能生成字符数组,而是说不应该把一个字符数组当作字符串来用。C/C+对字符数组和字符串没有区分,但在 Java 中则不然。1.4代码段和作用域Java 中源代码用大括号(“”和“”)分成段。在大括号中的内容可以作为一个代码段,或多或少独立于括号外的内容。代码段从逻辑上来讲不重要,但它们是 Java 语言的语法必要组成部分。如果不用大括号,编

27、译器很难识别一段代码在哪里结束,而另一段代码从哪里开始。从纯粹的美学角度来讲,如果不用大括号,对于你和其他人来说也很难读懂你的代码和明白这些代码要完成的使命。括号用来把有关系的语句组合在一起。你可以把一对括号间的内容当成一条语句来执行。事实上,对于外层的程序段来说,内层的程序段看上去确实像一条语句。可是,程序段是什么?程序段简单来说就是一部分的代码。程序段被组织成层级关系,则意味着代码可以划分成独立的程序段嵌套在其他程序段中。一个程序段可以包含一个或多个子程序段。用缩进来区分不同的程序段是 Java 语言中的标准形式。每次你输入一个新的程序段,就应该用一些空格(两个比较合适)来增加代码的缩进量

28、。当你删除一个程序段,就应该减少代码的缩 8 1.4代码段和作用域进量(退两格)。这是许多程序语言已形成的习惯。然而,缩进只是形式上的问题,与语言的技术无关。即使你没有做任何的缩进,编译器还是能够产生正确的输出。缩进只是为了程序员使用,与编译器无关,它只是使代码看上去更加简单易懂。以下就是 Java 中一个正确的缩进程序段。for (int i = 0; i 5; i+) if (i 3) System.out.println(i);以下是没有缩进的相同代码:for (int i = 0; i 5; i+) if (i 3) System.out.println(i);第一部分代码通过使用缩进

29、使程序条目很清晰,很显然 if 语句是嵌套在 for 循环中的。而第二部分代码对于程序段间的关系没有任何看得见的线索。如果不知道 if 语句和 for 循环也不必担心,在本教程后边会学到很多相关知识。作用域的概念和程序段关联的很紧密,在 Java 中使用变量的时候它也非常重要。作用域指的是一段程序如何影响变量的生命周期。程序中声明的每个变量都和作用域相关,也就是说变量只能在程序的特定部分生效。作用域由程序段决定。为了更好地理解程序段,我们再回过头来看看前边学过的 HelloWorld。HelloWorld 类是由两个程序段组成。外层的程序段是定义 HelloWorld 类的程序段。class

30、HelloWorld .类程序段在 Java 中非常重要。几乎所有有趣的内容都和类有关或者就属于一个类。例如,定义在类中的方法就属于类本身。从语法和逻辑上讲,Java 中的每件事情都发生在类中。再回到HelloWorld,内部的程序段定义了 main()方法,如下:public static void main (String args) .内部程序段被认为是嵌套在外部程序段中的。定义在内部程序段中的所有变量都只属于内部程序段,对于外部程序段是不可见的。变量的作用域定义在内部程序段中。为了更好的理解作用域和程序段,来看一个 HowdyWorld 类的例子:class HowdyWorld pu

31、blic static void main (String args) int i;printMessage();public static void printMessage () int j;System.out.println(Howdy, World!);HowdyWorld 类包含两个方法:main()和 printMessage()。通过 HelloWorld 类,我们应该很熟 9 Java 编程入门悉 main()方法了。但本例中稍有不同,它定义了一个整数类型 i 并调用了 printMessage()方法。printMessage()是一个新的方法,它声明了一个整数型变量 j

32、并且打印消息“Howdy,World!”到标准输出流,就像 HelloWorld 中 main()方法所做的一样。你可能已经知道 HowdyWorld 的输出结果和 HelloWorld 相同,因为调用 printMessage()方法的结果是现实一行文本信息。你可能没有注意到在每个方法中所定义的整数类型的作用域。定义在 main()方法中的整数变量 i 的作用域限制是在 main()方法内。main()方法定义在大括号包含的方法内(方法程序段)。同样,整数变量 j 的作用域限制是 printMessage()方法内。这两个变量作用域的重要性体现在当变量在各自的作用域以外是不可见的。Howdy

33、World 类程序段对于这两个整数变量一无所知。而且 main()不知道 j 的任何情况,而 printMessage()也不知道 i 的任何情况。在其他程序段代码中嵌套程序段代码时,作用域就变得更加重要。下面的 GoodbyeWorld 类就是变量嵌套在不同作用域的一个很好的示例:class GoodbyeWorld public static void main (String args) int i, j;System.out.println(Goodbye, World!);for (i = 0; i 5; i+) int k;System.out.println(Bye!);整数 i

34、 和 j 的作用域都在 main()中。可是整数 k 的作用域限制在 for 循环中,在这个程序段以外是不可见的。换句话说,i 和 j 在 for 循环中也是可见的。也就是说作用域的影响是从上到下的,定义在外部作用域的变量在嵌套作用域内也是可见和可用的,而定义在嵌套作用域内的变量被限制在那个作用域里。在声明变量时,注意变量的作用域也很重要,它不仅仅是可见度的问题。决定了变量的可见度,也就决定了变量的生命周期。也就是说当程序执行离开作用域时,变量实际上被释放了。再看一下 GoodbyeWorld 这个例子:在程序执行到 main()方法中时,为整数变量 i 和 j 分配了存储空间。当进入 for

35、 循环程序段时,为整数 k 分配了存储空间。当程序执行完 for 循环程序段时,k 所占用的内存空间被释放掉,变量也被释放掉。当程序执行完 main()时,在它作用域内的所有变量 (i 和 j)都被释放掉。在涉及到类时,变量的生命周期和作用域的概念甚至会变得更重要。1.5数组数组是为了存储相同类型的一列项目所提供的存储结构。数组项目既可以是简单的也可以是复杂的数据类型。数组也可以是多维的。Java 数组用中括号来声明:。下面就是 Java 中一些数组声明的例子:int numbers;char letters;long grid; 10 1.7表达式和操作符如果你熟悉其他语言中的数组,你可能会

36、对方括号中没有数字来指定数组项目的数量而感到困惑。Java 不允许在声明一个变量数组时指定这个空数组的大小。通常你必须用 new 操作符明确设置数组的大小或在生成数组时指定一列项目。你既可以在变量类型后,也可以在标识符后放置中括号。下面是声明变量并设置其大小的两个示例。一个用到了 new 操作符,一个是在数组声明中指定一列项目。char alphabet = new char26;int primes = 7, 11, 13;Java 中也支持像堆栈和哈希表这样结构更复杂的项目存储列表。与数组不同,Java 中这些结构像类一样使用。1.6字符串Java 中的字符串是通过调用一个 String

37、的特殊类来处理的。甚至字面量字符串也是通过一个实例化的 String 类管理的。一个类的实例化简单讲就是一个基于这个类所生成的对象。以下是 Java的 String 类的声明:String message;String name = Mr. Blonde;1.7表达式和操作符在生成了变量后,你通常都会想要用它们去做点事情。操作符使你能完成对数据对象或对象的赋值或计算。操作符使变量和字面量能够构成表达式。一个表达式可以被认为是一个程序等式。更正式地说,一个表达式就是一个或多个数据对象(操作数)和零个或多个操作符产生出一个结果。下面是一个表达式的例子:x = y / 3;在这个表达式中,x 和 y

38、 是变量,3 是字面量,=和/是操作符。这个表达式讲述的是变量 y 被3 用除法操作符(/)除,使用赋值操作符(=)将结果存储到 x。注意表达式是从右到左描述的。虽然这种从右到左的表达式分析方法在显示赋值操作很有用,但实际上大部分的 Java 表达式都是从左到右运行的。在下一节你会更好的体会这一点。1.7.1运算符的优先级即使 Java 表达式通常是从左到右运算,但没有其他规则的话,这里仍然会多次出现表达式结果不确定的情况。下面这个表达式说明了这种情况:x = 2 * 6 + 16 / 4; 11 Java 编程入门表达式严格按照从左到右赋值的话,乘法运算符 2*6 首先执行,结果是 12。然

39、后执行加法运算符 12+16,结果是 28。然后执行除法运算符 28/4,结果是 7。最后执行赋值运算 x=7,变量 x 的值被指定为 7。如果你对其他语言的运算符优先级有经验的话,你可能已经对这个表达式的计算产生疑惑,你的理由很充分,因为它错了。问题就是表达式使用简单的从左到右运算可能会产生不确定的结果,因为还有赖于运算符顺序。这个问题的答案和运算符优先级相关,它决定了运算符运算的先后顺序。每个 Java 运算符都有一个相应的优先级。下面是 Java 中所有运算符按照优先级从高到低排列的列表。在这个运算符列表中,一个特定行中的所有运算符都有同样的优先级。每行的优先级水平从上到下递减。这就意味

40、着运算符的优级比运算符*的高,但和运算符()的优先级一样。. ()+ - ! * / % + - = = !=&|?:=表达式运算仍然是从左到右,只不过前提是在相同优先级的运算符之间。否则,优先级高的运算符要在优先级低的运算符之前计算。知道这一点,再来看同样的表达式。x = 2 * 6 + 16 / 4;在对表达式使用从左到右计算前,先来看看是否有运算符的优先级不同。 确实有不同的优先级 。 乘法(*)和除法(/)都是最高的优先级,而接下来是加法(+),然后是赋值运算符(=)。因为乘法和除法运算符具有相同的优先级,所以从左向右计算。你首先要执行乘法运算 2*6 结果是 12。 然后执行除法运算

41、 16/4,结果是 4。 执行完这两步运算后,表达式就像这样:x = 12 + 4;因为加法运算符比赋值运算符有更高的优先级,所以接下来执行加法操作 12+4,结果是 16。最后,执行赋值运算 x=16,结果是数值 16 被赋给变量 x。如你所见,使用操作符优先级在表达式计算中产生不同的结果。为了从另一个角度支持这个观点,我们再来看一个使用括号分组运算的表达式:x = 2 * (11 - 7);没有分组的括号的话,应该先执行乘法运算,再执行减法运算。然而,根据优先级列表,()运算符在所有其他运算符前。所以先执行减法 11-7,生成 4,接下来的表达式为:x = 2 * 4;表达式剩余部分是很简

42、单地乘法运算和赋值运算,把生成的 8 赋给变量 x。 12 1.7表达式和操作符1.7.2整数运算符整数有三种类型的运算符可以执行:一元运算符、二元运算符和关系运算符。一元运算符只能对一个整数起作用,二元运算符要对两个运算符生效。一元运算符和二元运算符通常返回整数结果。关系运算符虽然是对两个运算符起作用,但是返回结果不是整数而是布尔值。一元和二元整数运算符通常返回 int 类型。对于包括 byte、short 和 int 的所有运算都是 int。这个规则只有在一个操作数是 long 型时才会例外,这种情况下的运算结果是 long 类型。1. 一元整数运算符一元整数运算符只针对单一整数。表 A.

43、5 列出了一元整数运算符。表 A.5一元整数运算符描述运算符自增+自减-负整数-按位求补自增和自减运算符(+和-)对整数变量加一和减一。这两种运算符既可以用作前缀形式也可以用作后缀形式。前缀运算符在表达式运算前生效,后缀运算符在表达式运算完成后生效。前缀一元运算符放在变量前,后缀一元运算符紧跟在变量之后。下面是这两种类型的示例:y = +x;z = x-;第一个例子中 x 是自增前缀,也就是说在赋给 y 前 x 要先自增加。第二个例子中的 x 是自减后缀,也就说在赋给 z 以后 x 才会自减少。后一个例子中,x 在自减少前把值赋给 z。一元负整数运算符(-)用来改变整数值的符号。这个操作符正像

44、它的名字一样简单,如下例所示:x = 8;y = -x;这个例子中,x 指定的字面量值是 8,然后取负,然后赋给 y。结果值就是-8。Java 中最后一个一元整数运算符是按位求补运算符,它执行一个整数的按位取反。按位取反就是说数字中的每一位都被反转。换句话说,就是所有二进制数 0 变成 1,所有二进制数 1 变成 0。看一个与负数运算符非常相似的一个例子:x = 8;y = x;这个例子中 x 再一次被指定字面量的值为 8,但在赋给 y 前对它按位取反。这意味着什么?好,如果不考虑整数如何在内存中存储的细节的话,它意味着变量 x 的所有位全部取反,生成结果是十进制数-9。这个结果和这样一个事实

45、有关:负数在内存中通过一种叫做补码的方式存储(参 13 Java 编程入门见下面的开发提示)。整数数字以一系列的二进制位存储在内存中,这些二进制位的值是 0 或 1。如果一个数字最高位的值是 1,那么这个数被认为是负数。因为按位取补把一个数的所有位求反,包括数字的符号位(也就是最高位)。2二元整数运算符二元整数运算符对一对整数生效。表 A.6 列出了二元整数运算符。表 A.6二元整数运算符描述运算符加+减乘*除/模除%位与&位或|位异或左移用零来填充右移后所留下的空位加减乘除(+、-、*和/)做了希望它们做的事情。需要注意的是除法运算,因为你正在处理的是整数,除法运算符返回的是一个整数约数。万一除法结果中有余数,用模除运算符得到余数。数学上用 0 作除数,结果是一个无限大的值。因为表示无限大的数字对于计算机来说是个大问题,所以用 0 作除数来进行除法和模除,结果会报错。更具体的说,运行过程中会抛出异常。位与、位或和位异或(&、|、)对一个整数的每一位起作用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论