首页 _Java编程入门

_Java编程入门

举报
开通vip

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

_Java编程入门
JJaavvaa 编编程程入入门门 理想情况下,在阅读本书前,你应该对 Java 程序语言已经有了相当程度的掌握。但或许你已 经很久没有用 Java,或者你只是想通学习 Java 知识来进行手机游戏编程。如果你属于上述情况, 那么本教程正是为你准备的。本教程不是要教你 Java 的所有细节,因为已经有大量的优秀书籍在 做这些工作。相反,本教程只是想为你提供开发手机游戏程序所需的核心 Java 知识。 1.1 Hello,World! 学习一门语言的最好方法是直截了当地去看看一个真正的程序是如何编写的。与传统介绍性 的语言实例一样,这里是一个的 Java 版的经典的“Hello,World”程序。 class HelloWorld { public static void main(String args[]) { System.out.println("Hello, World!"); } } 有必要指出的是,这个程序并不是为了在手机上运行而 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 的。记住,本教程是一个一般性 的 Java 编程入门,而不是专门针对手机开发的。事实上,本教程所涉及的大部分实例都是在 Java 应用程序的命令行运行的,它们是所有 Java 程序中最简单的。 用 Java 编译器(javac)编译 HelloWorld 程序后,你可以在 Java 解释器中运行它了。Java 编 译器生成了一个叫做“HelloWorld.class”的可执行文件。这个命名规则可能看上去有点怪,因为 事实上大多数程序语言都是用.exe 作为可执行程序的扩展名。Java 偏偏没有这样。 按照 Java 面向对象的特性,所有 Java 程序都存储在 Java 类中,它们在 Java 运行环境中作为 对象被生成并执行。在命令行中输入“java HelloWorld”,就可以运行 HelloWorld 程序。如果已 经安装了 Java 软件开发包(Software Development Kit,SDK),计算机屏幕上会显示出 “Hello,World!”。 为了彻底理解在 HelloWorld 中发生的情况,让我们检查程序中的每行代码。首先,必须要明 白 Java 非常倚重于类。事实上,HelloWorld 的第一行语句就揭示了 HelloWorld 不仅仅是一个程 序,而且是一个类。通过进一步查看类实体中的语句,你可以看到这个类的名称被定义为 HelloWorld。Java 编译器用这个名称作为可执行输出类的名字。 HelloWorld 类包括一个成员方法。现在,你可以把这个方法看作一个和类关联的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 程序方 法。HelloWorld 中这个唯一的方法叫做 main(),如果你曾经用过 C 或 C++,那么你应该对它很熟 悉。类在 Java 解释器中执行时,是从 main()方法开始的。main()方法定义为带有一个 void 返回类 型的“public static”。“public”意味着该方法可以在类内和类外任意地方调用。“static”意味 – 1 – Java编程入门 着该方法在这个类的所有实例中都是相同的。返回类型“void”意味着 main()没有返回值。 main()方法只有一个参数 String args[]。args 是一个 String 对象的数组,表示程序执行时所传 递的命令行参数。由于 HelloWorld 没有使用任何命令行参数,所以可以忽略 args 参数。在本教程 后边,你可以学到更多关于字符串的知识。 HelloWorld 类执行时会调用 main()方法。main()只包含一行语句,用来把消息“Hello,World” 作为标准输出流打印到屏幕上,如下所示: System.out.println("Hello, World!"); 由于对象嵌套,这条语句乍看上去有点混乱。为了帮助你把它弄清楚,我们从右向左来 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 这句话。首先注意到这条语句的结尾是一个分号,它是从 C/C++借用过来的标准的 Java 语法。再 左边可以看到一对括号中的字符串“Hello,World!”,这表明它是一个方法调用所用到的参数。实 际上,这个被调用的方法就是 out 对象的 println()方法。println()方法和 C 中的 printf 方法很相似, 只不过它是在字符串结尾附加一行新的字符(\n)。out 对象是 System 对象的一个成员变量,用来表 示标准输出流。最后,System 对象是 Java 环境中封装系统功能的一个全局对象。 这基本上就是 HelloWorld 类的全部内容,它是我们的第一个 Java 程序。如果你对 HelloWorld 类的 说明 关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书 还不是很明白,那也没什么关系。我们没有对 Java 语言进行说明就开始介绍 HelloWorld, 仅仅是为了让你到实践中去学习 Java 代码。本教程剩下的部分更多是对 Java 语言的基本原理进 行结构化的讨论。 1.2 标记 当你提交一个 Java程序给 Java编译器时,编译器解析文本并提取每个单独的标记。标记(token) 是语言中对于编译器有意义的最小元素,它定义了 Java 语言的结构。Java 包含的所有标记又叫做 Java 标记集(Java token set)。Java 标记集可以分为 5 类:标识符、关键字、字面量(literals)、运 算符以及分隔符。Java 编译器也可以识别并丢弃注释和空白。 Java 编译器在标记化一个源文件时丢弃了所有注释和空白。得到的结果标记被编译成与机器 无关的 Java 字节码(bytecode),它可以在一个有解释能力的 Java 环境中运行。字节码符合 Java 虚 拟机的要求,Java 虚拟机把处理器间的差异归结成一个虚拟处理器。记住,一个有解释能力的 Java 环境可以是 Java 命令行解释器,也可以是 Java 浏览器,还可以是本书大多数示例所用到的支持 Java 功能的手机。 1.2.1 标识符 标识符是表示名字的标记。这些名字可以指定给变量、方法和类,使得编译器能够唯一地识 别它们。程序员为这些标识符起了一些有含义的名字。HelloWorld 是一个标识符,它分配名称 HelloWorld 给 HelloWorld.java 源文件中的类。 – 2 – 1.2 标记 尽管在 Java 中你可以为标识符起一些有创意性的名称,但是这里还是有些限制。所有 Java 标识符都区分大小写,而且必须以字母、下划线(_)或者$开头。字母包括大写字母和小写字母。 后边的标识符字符可以包括数字 0 到 9。对标识符还有一个限制是,不能使用我们在下一部分列 出的 Java 的关键字。表 A.1 是一个合法和不合法标识符名称的对比表。 表 A.1 合法和不合法的 Java 标识符 合 法 不 合 法 HelloWorld Hello(uses a space) Hi_Mom Hi_Mom!(uses a space and punctuation mark) heyDude3 3heyDude(begins with a numeral) Tall short(this is a Java keyword) poundage #age(does not begin with letter) 除了上述对 Java 标识符命名的限制外,你还应该遵循以下格式规范从而使你的程序更加简 单、更加一致。命名多个单词组成的标识符的时候,除了名字中间的每个单词的首写字母大写外, 其他全部用小写,这是 Java 标准的命名规范。例如,变量 toughGuy 是正确的 Java 格式,而 toughguy、 ToughGuy 和 TOUGHGUY 都不合乎这种格式规则。这种规则不是一成不变的,它只是一种应该 遵循的良好规则,因为大多数的 Java 代码都遵循这个规则。 1.2.2 关键字 关键字是 Java 为了特定的用途而保留的预定义标识符,只能以受限制的、特定的方式使用。 下面列出了 Java 中保留的关键字: abstract double int strictfp boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto protected transient const if public try continue implements return void default import short volatile do instanceof static while 除了这些关键字外,Java 还保留了 null,true 和 false 这几个词,所以它们也是受限的。 – 3 – Java编程入门 1.2.3 字面量 以固定不变的方式使用的程序元素,叫做字面量或常量。字面量可以是数字、字符或字符串。 数字字面量包括整数、浮点数和布尔量。字符型字面量总是指一个 Unicode 字符。包括多个字符 的字符串也看作是字面量,尽管它们在 Java 中以对象的形式实现。 Unicode 字符集是一个 16 位的字符集,它取代了 ASCII 字符集。因为它是 16 位字符集,所以它有足够的条目来表示其他语言中众多的符号和字符。 1.整数型字面量 整数型字面量是 Java 程序中最常用的字面量。整数型字面量主要有三种不同的格式:十进制、 十六进制和八进制。这些格式对应字面量所使用的数字系统的基本类型。十进制字面量的表现形 式就是普通的数字,没有什么特别注意的地方。十六进制数的表现形式是以 0x 或 0X 开头,表现 方法与 C/C++中很相似。八进制数的表现形式是在数字前加 0。例如十进制数是 12 的整型字面量 在 Java 中用十进制表示是 12,用十六进制表示是 0xC,用八进制表示是 014。 整数型字面量缺省存储为 int 型,它是 32 位的有符号值。如果你需要一个很大的数,可以在 数字末尾加上 l 或 L,把整型字面量强制存储为 long 型,如 79L。long 型是 64 位有符号值。 2.浮点型字面量 浮点型字面量指的是像 3.142 这样带小数部分的十进制数。它们可以用标准的或特殊的符号 表示,就是说数字 563.84 也可以写成 5.684e2。 同整型字面量不同,浮点型字面量缺省是 64 位的 double 型。如果你知道 64 位没有必要,也 可以选择使用小一点的 32 位的 float 型。指定为 float 型需要在数字末尾加上 f 或 F,如 5.6384e2f。 如果你是个注意细节的人,你也可以明确指明你想为你的字面量选择 double 型作为存储单元,如 3.142d。但由于浮点数缺省存储已经是 double 型,这个后缀也就没什么必要了。 因为本教程是 Java 编程的入门基础,所以我介绍了浮点数字面量。然而,值 得注意的是在 MIDP(移动信息设备平台,它是手机所用到的 Java 设备平台)中 不支持浮点数据类型和字面量。换句话说,在 Java 手机游戏代码中,不支持 double 型和 float 型。 3.布尔型字面量 如果你使用过 C/C++,那么肯定会非常喜欢布尔型字面量。在 C 中没有 boolean 型,也没有 布尔型字面量,用整数 1 和 0 替代布尔型中的真和假。Java 通过提供 boolean 型解决了这个问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 , boolean 型有两种状态:真或假。无疑,Java 语言中的这两种状态用关键字 true 和 false 表示。 在 Java 编程中,布尔型的字面量和整数型字面量一样常用,因为它们几乎出现在每一种类型 的控制结构中。当你必须表示有两种可能的值的一个条件或状态的时候,boolean 类型总是你所需 – 4 – 1.2 标记 要的类型。在这部分稍后你将了解到更多有关 boolean 类型的知识。现在,只需要记住两个布尔 型字面量:true 和 false。 4.字符型字面量 字符型字面量表示单个的 Unicode 字符,是由一对单引号括起来。特殊字符(控制字符和不 能被打印的字符)用反斜杠(“\”)加字符表示。 特殊字符的一个典型例子就是\n,它在打印输出时强制从新的一行开始。表 A.2 显示了 Java 支持的特殊字符。 表 A.2 Java 支持的特殊字符 描 述 表 示 方 法 反斜杠 \\ 续行符头 \ 退格 \b 回车 \r 换页 \f 水平制表符 \t 换行 \n 单引号 \’ 双引号 \” Unicode 字符 \udddd 八进制数 \ddd 一个 Unicode 字面量的例子就是\u0048,它是字符“H”的十六进制表示。相同字符用八进制 表示就是\110。 如果想了解更多有关 Unicode 字符集的信息,可以浏览 Unicode 的站点 http://www.unicode.org。 5.字符串字面量 字符串字面量表示多个字符,是由一对双引号括起来。不像本教程中介绍的其他字面量,Java 中字符串字面量是通过 String 类来实现的。 Java 中对于字符串字面量,先生成 String 类的实例,然后用双引号括起来的字符指定它的内 容。从实用角度讲,Java 用对象来实现字符串实际上并不重要。这里要提到它的原因是为了说明 Java 正是面向对象的。 – 5 – Java编程入门 1.2.4 操作符 操作符表示的是对数据对象或对象执行的特定赋值或计算。这些操作数可以是字面量,变量 或者有返回值方法。Java 支持以下操作符: + - * / % & | ^ ~ && || ! < > <= >= << >> >>> = ? ++ -- == += -= *= /= %= &= |= ^= != <<= >>= >>>= . [ ] ( ) 仅仅是看看这些操作符,对我们如何使用它们可能帮助不大。不用担心,在本教程后边会了 解到更多关于操作符和它们的使用。 1.2.5 分割符 Java 编译器通过分割符来获知如何对代码进行分组。例如,一个列表中的项目用逗号分割, 就像一条语句中项目列表一样。Java 支持以下分割符: { } ; , : 1.2.6 注释和空白 在本教程前面已经知道 Java 编译器在标记化一个源文件时丢弃了所有注释和空格。你可能想 知道“什么是空白?如何支持注释?”。首先,空白包含空格、制表符和回车。所有空格、制表 符和回车都被 Java 编译器当作注释丢弃。注释有 3 种不同的定义方式,如表 A.3 所示。 表 A.3 Java 支持的注释类型 使 用 类 型 用 法 /* 注释 */ 在/*和*/间的所有字符被忽略掉 // 注释 //后到行结尾的所有字符被忽略掉 /** 注释 */ 和/**/一样,只是 javadoc 工具能够把注释自动生成文档 如果你用 C 语言编写程序,那么你对第一种类型的注释(/* 注释 */)应该很熟悉了。编译 器忽略注释分割符/*和*/间的所有字符。如你果使用过 C++,那么你第二种类型的注释(//注释) 也应该很熟悉了。编译器忽略出现在注释分割符//后到行结尾的所有字符。这两种注释类型是从 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 数据类型 数据类型是任何程序语言都具有的基本概念之一。数据类型定义了有解释信息能力的存储方 法来解释信息。数据类型与内存中的存储变量紧密关联,因为一个变量的数据类型决定了编译器 如何解释内存中的内容。 为了在内存中产生一个变量,必须要为这个变量声明一种类型和提供一个唯一标识变量的标 识符。Java 声明变量的语句如下: Type Identifier [, Identifier]; 声明语句告诉编译器在内存中为一个名称为“Identifier”类型为“Type”的变量分配空间。 中括号中的可选项 identifier 表明可以声明多个相同类型的变量,它们彼此间用逗号隔开。最后, 在所有 Java 语句中,声明语句用分号结束。 Java 数据类型可以分为两类:简单型和复合型。简单数据类型是核心类型,不是从其他类型 派生而来。整型、浮点型、布尔型和字符型都是简单型。另一方面,复合型是以简单型为基础, 包括字符串、数组和通用的接口和类。在本教程后边可以学习到数组相关内容。 1.3.1 整数类型 整数类型用有符号的整数数字表示。共有 4 种整数类型:byte、short、int 和 long。每种类型 在内存中所占用的空间不同,如表 A.4 所示。 表 A.4 Java 整数类型 类 型 占 用 空 间 byte 8 bits short 16 bits int 32 bits long 64 bits 用前面讲过的声明语法来声明整数型的变量。以下是一些整数型变量的声明示例: int i; short rocketFuel; 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 中开发手机游戏时也不 能使用。这并不是太可怕的限制,因为浮点计算效率太差,所以在游戏开发中才 不能使用。 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 firstInitial, lastInitial; 请记住 char 类型只是用来存储单个字符。如果你有 C/C++背景,你可能试图生成一个 char 类型数组来构成字符串。Java 中就没有这个必要了,因为是通过 String 类来处理字符串的。并不 是说你不能生成字符数组,而是说不应该把一个字符数组当作字符串来用。C/C++对字符数组和 字符串没有区分,但在 Java 中则不然。 1.4 代码段和作用域 Java 中源代码用大括号(“{”和“}”)分成段。在大括号中的内容可以作为一个代码段, 或多或少独立于括号外的内容。代码段从逻辑上来讲不重要,但它们是 Java 语言的语法必要组成 部分。如果不用大括号,编译器很难识别一段代码在哪里结束,而另一段代码从哪里开始。从纯 粹的美学角度来讲,如果不用大括号,对于你和其他人来说也很难读懂你的代码和明白这些代码 要完成的使命。 括号用来把有关系的语句组合在一起。你可以把一对括号间的内容当成一条语句来执行。事 实上,对于外层的程序段来说,内层的程序段看上去确实像一条语句。可是,程序段是什么?程 序段简单来说就是一部分的代码。程序段被组织成层级关系,则意味着代码可以划分成独立的程 序段嵌套在其他程序段中。一个程序段可以包含一个或多个子程序段。 用缩进来区分不同的程序段是 Java 语言中的标准形式。每次你输入一个新的程序段,就应该 用一些空格(两个比较合适)来增加代码的缩进量。当你删除一个程序段,就应该减少代码的缩 – 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); } } 第一部分代码通过使用缩进使程序条目很清晰,很显然 if 语句是嵌套在 for 循环中的。而第 二部分代码对于程序段间的关系没有任何看得见的线索。如果不知道 if 语句和 for 循环也不必担 心,在本教程后边会学到很多相关知识。 作用域的概念和程序段关联的很紧密,在 Java 中使用变量的时候它也非常重要。作用域指的 是一段程序如何影响变量的生命周期。程序中声明的每个变量都和作用域相关,也就是说变量只 能在程序的特定部分生效。 作用域由程序段决定。为了更好地理解程序段,我们再回过头来看看前边学过的 HelloWorld。 HelloWorld 类是由两个程序段组成。外层的程序段是定义 HelloWorld 类的程序段。 class HelloWorld { ... } 类程序段在 Java 中非常重要。几乎所有有趣的内容都和类有关或者就属于一个类。例如,定 义在类中的方法就属于类本身。从语法和逻辑上讲,Java 中的每件事情都发生在类中。再回到 HelloWorld,内部的程序段定义了 main()方法,如下: public static void main (String args[]) { ... } 内部程序段被认为是嵌套在外部程序段中的。定义在内部程序段中的所有变量都只属于内部 程序段,对于外部程序段是不可见的。变量的作用域定义在内部程序段中。为了更好的理解作用 域和程序段,来看一个 HowdyWorld 类的例子: class HowdyWorld { public 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 并且打印消息“Howdy,World!”到 标准输出流,就像 HelloWorld 中 main()方法所做的一样。 你可能已经知道 HowdyWorld 的输出结果和 HelloWorld 相同,因为调用 printMessage()方法 的结果是现实一行文本信息。你可能没有注意到在每个方法中所定义的整数类型的作用域。定义 在 main()方法中的整数变量 i 的作用域限制是在 main()方法内。main()方法定义在大括号包含的方 法内(方法程序段)。同样,整数变量 j 的作用域限制是 printMessage()方法内。这两个变量作用 域的重要性体现在当变量在各自的作用域以外是不可见的。HowdyWorld 类程序段对于这两个整 数变量一无所知。而且 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 和 j 的作用域都在 main()中。可是整数 k 的作用域限制在 for 循环中,在这个程序段以 外是不可见的。换句话说,i 和 j 在 for 循环中也是可见的。也就是说作用域的影响是从上到下的, 定义在外部作用域的变量在嵌套作用域内也是可见和可用的,而定义在嵌套作用域内的变量被限 制在那个作用域里。 在声明变量时,注意变量的作用域也很重要,它不仅仅是可见度的问题。决定了变量的可见 度,也就决定了变量的生命周期。也就是说当程序执行离开作用域时,变量实际上被释放了。再 看一下 GoodbyeWorld 这个例子:在程序执行到 main()方法中时,为整数变量 i 和 j 分配了存储空 间。当进入 for 循环程序段时,为整数 k 分配了存储空间。当程序执行完 for 循环程序段时,k 所 占用的内存空间被释放掉,变量也被释放掉。当程序执行完 main()时,在它作用域内的所有变量 (i 和 j)都被释放掉。在涉及到类时,变量的生命周期和作用域的概念甚至会变得更重要。 1.5 数组 数组是为了存储相同类型的一列项目所提供的存储结构。数组项目既可以是简单的也可以是 复杂的数据类型。数组也可以是多维的。Java 数组用中括号来声明:[]。下面就是 Java 中一些数 组声明的例子: int numbers[]; char[] letters; long grid[][]; – 10 – 1.7 表达式和操作符 如果你熟悉其他语言中的数组,你可能会对方括号中没有数字来指定数组项目的数量而感到 困惑。Java 不允许在声明一个变量数组时指定这个空数组的大小。 通常你必须用 new 操作符明确设置数组的大小或在生成数组时指定一列项目。你既可以在变 量类型后,也可以在标识符后放置中括号。 下面是声明变量并设置其大小的两个示例。一个用到了 new 操作符,一个是在数组声明中指 定一列项目。 char alphabet[] = new char[26]; int primes = {7, 11, 13}; Java 中也支持像堆栈和哈希表这样结构更复杂的项目存储列表。与数组不同,Java 中这些结 构像类一样使用。 1.6 字符串 Java 中的字符串是通过调用一个 String 的特殊类来处理的。甚至字面量字符串也是通过一个 实例化的 String 类管理的。一个类的实例化简单讲就是一个基于这个类所生成的对象。以下是 Java 的 String 类的声明: String message; String name = "Mr. Blonde"; 1.7 表达式和操作符 在生成了变量后,你通常都会想要用它们去做点事情。操作符使你能完成对数据对象或对象 的赋值或计算。操作符使变量和字面量能够构成表达式。一个表达式可以被认为是一个程序等式。 更正式地说,一个表达式就是一个或多个数据对象(操作数)和零个或多个操作符产生出一个结 果。下面是一个表达式的例子: x = y / 3; 在这个表达式中,x 和 y 是变量,3 是字面量,=和/是操作符。这个表达式讲述的是变量 y 被 3 用除法操作符(/)除,使用赋值操作符(=)将结果存储到 x。注意表达式是从右到左描述的。 虽然这种从右到左的表达式分析方法在显示赋值操作很有用,但实际上大部分的 Java 表达式都是 从左到右运行的。在下一节你会更好的体会这一点。 1.7.1 运算符的优先级 即使 Java 表达式通常是从左到右运算,但没有其他规则的话,这里仍然会多次出现表达式结 果不确定的情况。下面这个表达式说明了这种情况: x = 2 * 6 + 16 / 4; – 11 – Java编程入门 表达式严格按照从左到右赋值的话,乘法运算符 2*6 首先执行,结果是 12。然后执行加法运 算符 12+16,结果是 28。然后执行除法运算符 28/4,结果是 7。最后执行赋值运算 x=7,变量 x 的值被指定为 7。如果你对其他语言的运算符优先级有经验的话,你可能已经对这个表达式的计 算产生疑惑,你的理由很充分,因为它错了。问题就是表达式使用简单的从左到右运算可能会产 生不确定的结果,因为还有赖于运算符顺序。这个问题的答案和运算符优先级相关,它决定了运 算符运算的先后顺序。每个 Java 运算符都有一个相应的优先级。下面是 Java 中所有运算符按照 优先级从高到低排列的列表。在这个运算符列表中,一个特定行中的所有运算符都有同样的优先 级。每行的优先级水平从上到下递减。这就意味着运算符[]的优级比运算符*的高,但和运算符() 的优先级一样。 . [] () ++ -- ! ~ * / % + - << >> >>> < > <= >= == != & ^ && || ?: = 表达式运算仍然是从左到右,只不过前提是在相同优先级的运算符之间。否则,优先级高的 运算符要在优先级低的运算符之前计算。知道这一点,再来看同样的表达式。 x = 2 * 6 + 16 / 4; 在对表达式使用从左到右计算前,先来看看是否有运算符的优先级不同。确实有不同的 优先级。乘法(*)和除法( /)都是最高的优先级,而接下来是加法(+),然后是赋值运算 符(=)。因为乘法和除法运算符具有相同的优先级,所以从左向右计算。你首先要执行乘法 运算 2*6 结果是 12。然后执行除法运算 16/4,结果是 4。执行完这两步运算后,表达式就像 这样: x = 12 + 4; 因为加法运算符比赋值运算符有更高的优先级,所以接下来执行加法操作 12+4,结果是 16。 最后,执行赋值运算 x=16,结果是数值 16 被赋给变量 x。如你所见,使用操作符优先级在表达 式计算中产生不同的结果。 为了从另一个角度支持这个观点,我们再来看一个使用括号分组运算的表达式: x = 2 * (11 - 7); 没有分组的括号的话,应该先执行乘法运算,再执行减法运算。然而,根据优先级列表,() 运算符在所有其他运算符前。所以先执行减法 11-7,生成 4,接下来的表达式为: x = 2 * 4; 表达式剩余部分是很简单地乘法运算和赋值运算,把生成的 8 赋给变量 x。 – 12 – 1.7 表达式和操作符 1.7.2 整数运算符 整数有三种类型的运算符可以执行:一元运算符、二元运算符和关系运算符。一元运算符只 能对一个整数起作用,二元运算符要对两个运算符生效。一元运算符和二元运算符通常返回整数 结果。关系运算符虽然是对两个运算符起作用,但是返回结果不是整数而是布尔值。 一元和二元整数运算符通常返回 int 类型。对于包括 byte、short 和 int 的所有运算都是 int。 这个规则只有在一个操作数是 long 型时才会例外,这种情况下的运算结果是 long 类型。 1. 一元整数运算符 一元整数运算符只针对单一整数。表 A.5 列出了一元整数运算符。 表 A.5 一元整数运算符 描 述 运 算 符 自增 ++ 自减 -- 负整数 - 按位求补 ~ 自增和自减运算符(++和--)对整数变量加一和减一。这两种运算符既可以用作前缀形式也可以 用作后缀形式。前缀运算符在表达式运算前生效,后缀运算符在表达式运算完成后生效。前缀一 元运算符放在变量前,后缀一元运算符紧跟在变量之后。下面是这两种类型的示例: y = ++x; z = x--; 第一个例子中 x 是自增前缀,也就是说在赋给 y 前 x 要先自增加。第二个例子中的 x 是自减 后缀,也就说在赋给 z 以后 x 才会自减少。后一个例子中,x 在自减少前把值赋给 z。 一元负整数运算符(-)用来改变整数值的符号。这个操作符正像它的名字一样简单,如下例 所示: x = 8; y = -x; 这个例子中,x 指定的字面量值是 8,然后取负,然后赋给 y。结果值就是-8。 Java 中最后一个一元整数运算符是按位求补运算符,它执行一个整数的按位取反。按位取反 就是说数字中的每一位都被反转。换句话说,就是所有二进制数 0 变成 1,所有二进制数 1 变成 0。 看一个与负数运算符非常相似的一个例子: x = 8; y = ~x; 这个例子中 x 再一次被指定字面量的值为 8,但在赋给 y 前对它按位取反。这意味着什么? 好,如果不考虑整数如何在内存中存储的细节的话,它意味着变量 x 的所有位全部取反,生成结 果是十进制数-9。这个结果和这样一个事实有关:负数在内存中通过一种叫做补码的方式存储(参 – 13 – Java编程入门 见下面的开发提示)。 整数数字以一系列的二进制位存储在内存中,这些二进制位的值是 0 或 1。 如果一个数字最高位的值是 1,那么这个数被认为是负数。因为按位取补把一个 数的所有位求反,包括数字的符号位(也就是最高位)。 2.二元整数运算符 二元整数运算符对一对整数生效。表 A.6 列出了二元整数运算符。 表 A.6 二元整数运算符 描 述 运 算 符 加 + 减 – 乘 * 除 / 模除 % 位与 & 位或 | 位异或 ^ 左移 << 右移 >> 用零来填充右移后所留下的空位 >>> 加减乘除(+、-、*和/)做了希望它们做的事情。需要注意的是除法运算,因为你正在处理 的是整数,除法运算符返回的是一个整数约数。万一除法结果中有余数,用模除运算符得到余数。 数学上用 0 作除数,结果是一个无限大的值。因为表示无限大的数字对于计算机来说是个大 问题,所以用 0 作除数来进行除法和模除,结果会报错。更具体的说,运行过程中会抛出异常。 位与、位或和位异或(&、|、^)对一个整数的每一位起作用。在一个整数用来作为一个位域 时这些运算符有时会有用。用一个整数来表示一组二进制标记就是这样一个例子。由于一个 int 类型是 32 位的,所以一个整数可以表示 32 个不同的标记。 左移、右移和右移补零(<<、>>、>>>)运算符对整数中的每一位移动一个指定数量。下面 就是使用这些运算符的例子: x << 3; y >> 7; z >>> 2; 第一个例子中,整数变量 x 的每一位都向左移 3 位。第二个例子,y 的每一位向右移 7 位。 第三个例子显示了 z 向右移动 2 位,用 0 来补充最左边的位置。 这几个例子中,你可能想知道右移和右移补零运算符之间的区别。右移运算符用零来填充最 左边的位,就和右移补零运算符一样了吗?很好,在处理正数时,两个运算符没什么区别,它们 – 14 – 1.7 表达式和操作符 都是用零来填充最高位。在移动负数时就会产生差异。还记得负数的最高位是 1 吧。右移运算符 保留最高位不动,只对剩下的 31 位右移生效。这种行为产生的结果对于负数和整数非常相似。这 样,-8 右移一位的结果是-4。另一方面,右移补零运算符用零来补充右移留下的空位,包括最高 位。当这种移动用在负数时,最高位变成 0,结果变成了正数。 3.关系整数运算符 整数运算符的最后一组是关系运算符,这种运算符的所有操作数是整数但返回类型是布尔型。 表 A.7 列出了关系整数运算符。 表 A.7 关系整数运算符 描 述 运 算 符 小于 < 大于 > 小于等于 <= 大于等于 >= 等于 == 不等于 != 这些运算符在两个整数间使用。 1.7.3 浮点运算符 和整数型运算符相似,浮点数也有 3 种类型的运算符:一元运算符、二元运算符和关系运算 符。一元运算符只对一个浮点数生效,二元运算符对一对浮点数起作用。一元和二元运算符的返 回结果都是浮点值。关系运算符对两个浮点数起作用,但返回结果是布尔值。 如果操作数是 float 类型,那么一元和二元浮点运算符返回一个 float 类型的值。可是如果操 作数中至少一个是 double 类型,那么运算结果就是 double 类型了。由于 MIDP 不支持浮点数据类 型,我们也就不去探讨关于浮点数学习中所遇到的一些细节问题了。只要记住它们和整数运算符 看上去非常相似就足够了。 1.7.4 布尔运算符 布尔运算符对布尔类型数据有效,返回结果是布尔值。布尔运算符如表 A.8 所列: 表 A. 8 布尔运算符 描 述 运 算 符 位与 & 位或 | – 15 – Java编程入门 续表 描 述 运 算 符 位异或 ^ 逻辑与 && 逻辑或 || 非 ! 等于 == 不等于 != 条件 ?: 位运算符(&、|和^)在生成结果前先对表达式两边进行运算。如果不需要进行右边的计算的 话,逻辑运算符(&&和||)可以避免右边的运算。为了更好的理解表达式间的不同,我们来看两 个例子: boolean result = isValid & (Count > 10); boolean result = isValid && (Count > 10); 第一个表达式使用位运算符(&)做赋值。这个例子中,表达式两边都要计算,无论变量的 值是否有效。第二个例子中,用到了逻辑与运算符(&&)。这次先要检查布尔值 isValid。如果 isValid 是假,右边的表达式可以忽略,结论已经得出。这个运算符更有效率,因为表达式左边的 false 值已经能够确定整个表达式的结果是 false。 尽管逻辑运算符比位运算符更加高效,但有时候你可能还是需要位运算符来确保整个表达式 得到运算。下面的代码示意了位与运算符对于完整地计算表达式是必不可少的: while ((++x < 10) & (++y < 15)) { System.out.println(x); System.out.println(y); } 这个例子中,由于是位与运算符,所以第二个表达式(++y < 15)在经过最近一次循环后被计 算。如果使用逻辑与运算符,第二个表达式就不用计算,在最近一次循环后,y 也就不会再增加。 三个布尔运算符(!、=,!=)也能按照我们的意思工作。!运算符对布尔值取反,把原始值为 假的转成真,原始值为真的转成假。=运算符简单地判断两个布尔值是否相等(都是真或都是假)。!= 运算符判断两个操作数是否不等。 条件布尔运算符是布尔运算符中最特别的也是最后介绍的。这个运算符有 3 个部分(一个条 件,两个表达式),所以又被人们称为三元运算符。条件运算符的语法如下: Condition ? Expression1 : Expression2 Condition 是一个布尔值,首先计算判断它是真还是假。如果条件计算出结果是真,就运行 Expression1;如果条件结果是假,就运行 Expression2。 1.7.5 字符串运算符 与其他数据类型相似,字符串中也可使用运算符操作。确切地说,只有一个字符串运算符: – 16 – 1.8 控制结构 串连运算符(+)。字符串串联运算符与数字加法运算符(+)功能很相似,就是把字符串加在 一起。 1.7.6 赋值运算符 最后一个运算符组是赋值运算符。赋值运算符实际上可以适用于各种基础数据类型。表 A.9 列出了赋值运算符。 表 A.9 赋值运算符 描 述 运 算 符 简单赋值 = 加 += 减 -= 乘 *= 除 /= 模除 %= 与 &= 或 != 异或 ^= 除了简单的赋值运算符(=)以外,还有的赋值运算符执行了和它们的非赋值伙伴一样的运 算,只不过它们是把结果值存储在表达式左边的操作数中。看一下示例: x += 6; x *= (y - 3); 第一个例子中,x 和 6 相加,然后把结果存放在 x 中。第二个例子中,y 减去 3 然后把结果和 x 相乘。最终结果存放在 x 中。 1.8 控制结构 虽然执行数据的运算非常有用,但是现在时候把问题重心转到程序流控制上了。程序流分成 两种类型的结构:分支和循环。分支使你选择执行一部分程序而不是另一部分。而循环可以对一 部分程序反复执行。分支和循环为你控制代码的逻辑和执行提供了有效方法。 1.8.1 分支 如果没有分支或循环,Java 代码会按顺序执行,也就是说每行语句会依次执行。但如果不想 让每行语句都执行该怎么办?你可以用分支,它为你的代码流提供了更多选择。分支的概念看上 去不是很起眼,但如果不使用它们而想写出有用的程序却非常困难。Java 提供了两种分支类型: if-else 分支和 switch 分支。 – 17 – Java编程入门 1.if-else 分支 if-else 分支是 Java 程序中最常见的分支结构。它用来有条件地选择两种可能的结果之一。 if-else 语法如下: if (Condition) Statement1 else Statement2 如果布尔值 Condition 的结果为真,执行 Statement1。同样,如果 Condition 的结果为假,执 行 Statement2。下面的例子显示了如何使用 if-else 语句。 如果布尔变量 isTired 是真,那么执行第一条语句,timeToEat 设置为 true。否则,执行第二 条语句,timeToEat 设置为假。你可能注意到了 if-else 分支和条件运算符(?:)工作方式很类似。 事实上,你可以把 if-else 分支当作是条件运算符的一个扩展版本。两者之间的主要不同是在 if-else 语句间可以包含复合语句,而在条件运算符中就不能这么用了。 复合语句是用大括号{}括起来的程序段,对于外层的程序段来说它相当于一 条简单的语句。 如果你只想有条件的执行一条语句,那么可以把分支中的 else 部分省略,如下面的例子: if (isThirsty) pourADrink = true; 换句话说,如果你需要超过两个条件结果,可以把一系列 if-else 分支串在一起,得到预期的 效果。下面这个例子显示了在不同结果间使用多个 if-else 分支做选择。 if (x == 0) y = 5; else if (x == 2) y = 25; else if (x >= 3) y = 125; 这个例子中,做了 3 个不同的比较,每个比较只有在结果为真的时候才会执行各自的语句。 可是需要注意的是,后边的 ifelse 分支内嵌在前面分支中。这就确保了最多只会执行一条语句。 关于 if-else 最后要讲的一个重要话题就是复合语句。正如前面注意中所提到的,复合语句是 用大括号{}括起来的程序段,对于外层的程序段来说它相当于一条简单的语句。下面就是使用 if 分支的一个复合语句的例子: if (performCalc) { x += y * 5; y -= 10; z = (x - 3) / y; } 有时,当 if-else 分支嵌套时,有必要用大括号划分各个语句分支。下例说明了这个问题: if (x != 0) if (y < 10) z = 5; else z = 7; – 18 – 1.8 控制结构 这个例子中,用缩排形式指明 else 分支属于前一个(外层)if。然而,因为没有指定分组,Java 编译器认为 else 和内层的 if 相对应。为了得到想要的结果,必须要如下调整代码: if (x != 0) { if (y < 10) z = 5; } else z = 7; 增加的大括号告诉编译器内层的 if 是复合语句的一部分,更重要的是它省略了内层 if 对应的 else 分支。可以看到内层的 if 代码不能访问作用域之外包括 else 分支的代码。 2.switch 分支 和 if-else 分支很类似,switch 分支被专门设计为在多个结果中进行有条件的选择。switch 语 句的语法是: switch (Expression) { case Constant1: StatementList1 case Constant2: StatementList2 default: DefaultStatementList } switch 分支将 Expression 同所有 case 常量进行计算和对比,然后执行和 case 语句列表相匹配 的程序。如果没有可选常量与 Expression 匹配,如果提供了 DefaultStatementList 的话 (DefaultStatementList 是可选项)那么程序会跳到 DefaultStatementList。你可能想知道什么是语句 列表。语句列表简单的说就是一系列语句。if-else 分支引导程序流到一个简单或复合语句,与之 不同,switch 分支引导程序流到一系列语句。当程序执行移动到一个可选语句列,它会以
本文档为【_Java编程入门】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_799704
暂无简介~
格式:pdf
大小:430KB
软件:PDF阅读器
页数:31
分类:互联网
上传时间:2013-11-13
浏览量:65