开始Java编程配资网官方网站
通过本章学习,你能够学会:
1.举例解释什么是Java语句、标识符和注释。
2.编写代码定义8种基本变量。
3.应用赋值语句和算术表达式编写代码。
4.应用字符串编写代码。
5.举例解释数组的特点并应用数组编写代码。
万事开头难,有准备就不难。从基础开始,逐步实现,万里之行,始于足下。只要你跟随这本书的节奏,Java编程不难。通过本章学习,你将能够了解和掌握的是面向对象编程的基础知识和技术。
2.1 一切从基础开始
语句是程序的基本单元。程序是由一行行的语句构成的,语句是组成程序的基础。如果程序是一幢大厦,语句则是建筑材料。首先从语句讲起。
2.1.1 Java语句下面就是一行语句:
float average = sum/5;这个语句告诉编译器首先进行sum/5的除法运算,然后把结果赋值给浮点变量average,并以分号(;)结束。在Java编程中,一个语句可以在编辑行的任何地方开始,可以继续到下一行或数行。Java有各种语句,用来执行各种运算和操作。例如增值、减值语句,分支语句,循环语句,输入、输出语句等。虽然大多数语句以分号结束,但循环语句却是以右花括号(})结束。表2.1列举了Java的常用语句。
表2.1 Java常用语句举例

3W 语句告诉编译器要进行的运算和操作。程序就是由一行行语句构成的。Java语言有各种语句,通常以分号结束。
2.1.2 注释,还是注释
注释用来解释程序的含义,使阅读程序的人、维护人员,包括编写者自己,容易理解程序的意思,目的是增加程序的可读性,便于程序的维护和更新。
Java有两种注释风格。一种是传统的C语言注释形式,后来C++也采用了这种风格。它以“/*”注释标记开始,接着是注释内容;注释内容可以延续到数行,最后以“*/”注释标记结束。例如,单行注释如下:
/* C style comments */
多行注释如下:
/******************************************
Name: Jack Wang
Date: 2019-01-05
Description: 这是一个演示程序;以上是注释块
********************************************/
Java注释的第二种是C++风格,或称为单行注释。它以“//”注释标记为开始,接着是注释,直到本行结尾。如果需要多行注释,每行都必须以“//”开始。表2.2列举了这两种注释风格的常见例子。
注意 注释不是可执行语句。在编译时,被编译器自动忽略。
3W 东西多了要做标签;程序行多了要做注释。注释的目的是增加程序的可读性。
尽可能地使用注释,是Java编程的最重要特征之一,也是Java文档管理的一部分。Java除了提供这两种注释外,还提供一整套文档管理指令,例如应用Eclipse的javadoc产生功能很强的文档管理网页。本书将在第13章详细讨论javadoc。只会编写程序代码而忽略注释,不被认为是一个称职的Java程序设计师。有这样一个例子,在美国硅谷,某个Java开发工程师申请人在面谈时,演示了他编写的Java程序。虽然运行结果没有任何问题,但由于他的源程序几乎没有使用任何注释,因而没有得到他申请的这份工作。
表2.2 Java两种注释风格举例

2.1.3 什么是标识符和怎样使用
标识符是编程人员在程序语句中使用的名称,例如变量名、类名、方法名等。应注意不可以使用Java语言的关键字作为标识符,必须是自己创建的名称。而这个名称必须是合法的标识符,即是Java编译器认可的名称。
Java合法标识符的命名规则如下。
□ 以任何英文字母、下画线“_”,或美元符号“$”开始。
□ 跟随着任何字母、数字、下画线“_”和美元符号“$”。
□ 最多可有255个字符。
□ 不可使用Java关键字。
关键字是Java语言中保留的字,或者是Java语言本身所使用的符号,不允许程序设计人员用来命名标识符。下面是Java语言的53个关键字。

随着本书的介绍,大多数关键字都会被解释并在程序中使用。有些关键字,如const、goto,在Java语言中已不再使用,但仍属关键字。
使用Java关键字命名标识符是非法的,即编译器在编译时会出语法错误信息。根据合法标识符的命名规则,如下标识符是合法的:

因为Java是case-sensitive的语言,所以在命名标识符时,大写字母和小写字母的名称,虽然内容相同,但被视为是不同的标识符。如y和Y是不同的标识符;price和Price也是不同的标识符。注意,有美元符“$”和下画线“_”的标识符只是用在特殊场合,在一般编程中很少使用。
表2.3中列举了一些常见的非法标识符和出错的原因。
表2.3 常见的非法标识符举例

为了提高Java程序的可读性,一个职业的Java编程人员除必须遵守标识符命名规则外,还应遵循标识符的常规约定,或称规范。这些规范指出,一个Java的类名称都以大写字母开始;对象名、方法名以及变量名以小写字母开始;常量名以大写字母命名;命名时应使用一目了然、有清楚含义的标识符。这些常规约定不是Java标识符的语法规则,你不遵守它,也不是语法错误,编译器不会发出错误信息。但为了便于和其他编程人员交流,提高职业化水平,在Java软件开发领域,大家都应遵循这些规范。在本书后续章节中,作者将根据自身的经历和经验分享这方面的常规约定。
3W 变量名、常量名、类名、对象名、方法名,凡是你自己在程序中使用的文字,就是标识符。遵循Java规定的命名规则创建的标识符,就是合法标识符;而同时遵循职业软件工程师们提倡的命名规范和约定,则是鼓励和可取的。
更多信息 如果把一个Java应用程序比作一幢大厦,语句好比构成这幢大厦的建筑材料;每个房间好比对象;而房间的设计蓝图好比类。
2.2 Java基本数据
在Java中,数据包括数字、字符,以及布尔值true或false。除直接在程序中使用这些数据外,我们经常用变量来代表数据。这些数据称为基本数据,代表这些数据的变量称为基本数据类型变量,或简称基本变量。常量是变量的特殊形式。本节将讨论Java提供的8种基本变量和常量的定义、赋值以及应用。Java还提供了多种类库进行数据的各种运算和操作,例如包装类(Wrapperclass)、数学类(Mathclass)和BigDecimal类。后续章节将详细讨论有关数据运算和操作的类及其所提供的各种方法。
2.2.1 8种基本数据类型
用来储存基本数据的变量称作基本变量。表2.4列出了Java的8种基本数据类型及其取值范围。
表2.4 Java的8种基本数据类型

整型变量,如byte、short、int和long,只能存储整数。单精度浮点型变量float简称单精度型变量,可具有7位有效数值(不包括小数点);而双精度浮点型变量double简称双精度型变量,则可具有16位有效数值。Java对较大或较小的单精度或双精度数值,用科学记数法E表示。如28600000.0,则表示为2.86E7;而.000123为1.23E-4。
在字符变量char中,Java使用Unicode作为其字符代码,而Unicode要求每个字符占用两个字节。这样做的目的是可以将Java支持的字符扩展到65 536个,而传统的ASCII代码只有256个。为了兼容和转换方便,Unicode中的前256个代码与ASCII相同,所不同的是Unicode的每个字符要求两个字节。
布尔型在Java语言中成为正式的数据类型,而在C/C++中只能用0或1来模拟。注意,它的值true(真)或false(假)必须是小写字母。
字符串类型不属于基本数据类型。在Java语言中,字符串类型被定义为类。从它的关键字String可以看出,它是以大写字母开始的。回顾一下Java命名规范,类都以大写字母开头。由于字符串是常用的数据类型,为了使用方便,Java对字符串应用提供了特殊操作,即直接引用。
例如:
String str = "This is a string"; //referencing
就是直接引用,或简称引用的例子。字符串直接引用和定义基本数据类型似乎相同,但有本质的区别。我们将在以后章节详细讨论字符串概念和各种操作。从实际应用角度,我们通常把字符串引用也称为定义字符串变量,并在本章进行讨论。
2.2.2 如何定义变量
在下面的例子中将定义了一个名为num的双精度型变量:
double num; //定义一个名为num的双精度型变量顾名思义,变量不但可以储存某个数据的值,还可以修改这个值。
因为Java提供了8种不同类型的数据,所以可以定义8种不同的变量。定义一个变量的语法格式为:
datatype variableName;dataType为8种数据类型之一,variableName必须是合法标识符,并要求遵守命名规范。例如:

也可以同时定义多个相同类型的变量,每个变量名之间用逗号分开,如:

因为白色空格(包括空格、Tab键,以及回车键)在编译时都被忽略,所以,如下对变量的定义和上面的例子完全等同:

综上所述,定义变量的广义语法格式为:
datatype varName1[, varName2…];
其中,方括号中的内容为选择项。如果省略,则成为定义一个变量的形式;如果有多个变量,每个变量间用逗号分隔,但最后一个变量以分号结束。
更多信息 定义变量时要遵守Java所命名规范,即使用一目了然、清楚表达变量含义的标识符作为变量名。变量名首字母为小写。
2.2.3 什么是变量初始化
变量初始化是指一个变量定义后第一次赋予的值,即初始值。常见的变量初始化是由赋值语句完成的,例如:

它们完全等同于:
注意,一个数值型变量的初始值不一定是0;一个字符型变量的初始值不一定是' ',即空字符;一个布尔型变量的初始值不一定是true,可以是任何合法值。
也可以同时定义多个同一类型的变量,并赋予初始值,例如:

因为在Unicode中,字母'A'的代码为65,所以first_letter和letter_A具有相同的值'A'。表2.5列出了更多定义变量和初始化的例子。
3W 变量名实际上代表存储器的地址,可以储存变化的数据。变量初始化就是第一次赋予变量数据。
表2.5 定义变量和变量初始化例子

2.2.4 变量与存储器有什么关系
变量和存储器有直接关系。定义一个变量就是要求编译器分配所要求的内存空间。编译器在分配存储空间时,必须知道空间的大小,如多少字节。这个信息是通过我们所定义的变量类型来确定的。例如:
double price = 25.08;
根据这个语句,编译器知道我们需要8个字节的内存空间来存储一个名为price的双精度变量。并把数值25.08存入这个空间。那么,变量名和内存又有什么关系呢?
变量名实际上代表所分配存储空间的地址。每个字节的存储空间都有地址,而变量名代表其开始地址。这样CPU才可以访问该存储空间。
但是用存储器的地址来代表变量,很不方便,这又回到机器编码时代了。用变量名代表存储器的地址是高级编程语言的特点。变量和存储器的这种关系可以用图2.1表示。

从图2.1可以看出,变量名price代表一个双精度数值25.08的存储地址。更确切地说,它代表8个字节存储器的开始地址,即89200。
在编译时对变量进行存储空间的分配称为静态绑定(staticbinding)。与之相对应的是动态绑定(dynamic binding),即在程序运行时才进行内存空间的分配操作。后续章节将专门讨论静态绑定和动态绑定问题。
3W 变量,包括常量,代表向编译器请求的存储空间。Java提供对存储空间或者存储器进行自动管理的功能,因而更可靠。
2.2.5 常量必须初始化
顾名思义,常量就是不变的量。常量也需要编译器分配存储空间,不过在这个存储器中的数据,一旦被存入,就不能再改变了。在Java中,用关键字final来表示所定义的是常量。常量在定义时必须同时赋予值,或者对其初始化。这也是Java的规定,否则便是语法错误。命名规范中要求常量用大写字母表示。下面是定义常量的典型例子:

常量定义的语法格式为:
final dataType CONSTANT_NAME = value;
3W 常量是不可变的量。即常量一旦赋值,就不可再变更,否则将产生编译错误。常量是变量的特殊情况。
2.3 赋值语句
前面在对变量初始化时已经使用过简单的赋值语句,例如:

注意在赋值语句中,等号的含义不是左右两边相等的意思,而是赋值操作符。即把右边的值赋予左边的变量。所以,以下的语句是错误的:
这是初学编程的朋友常犯的错误,应该注意。
赋值操作符的右边通常是表达式。用来做算术运算的则称为算术表达式,例如:
2.3.1 算术表达式
算术表达式由操作数和算术操作符组成。例如下面的例子:100 + 26就是一个简单的算术表达式。100和26为操作数,算术操作符为加号(+),即进行加法运算。
表2.6列出了Java语言的算术操作符及其含义。
表2.6 Java算术操作符

算术表达式和赋值语句的常用例子如下:

在最后两个例子中使用了增1和减1的运算。它们分别相当于:

以及

我们称这种增值或减值运算为前缀增1或前缀减1运算,因为操作符放在操作数的前面。
把增1或减1操作符放在操作数后面的运算称为后缀增值或后缀减值运算。顾名思义,在这种运算中,首先进行其他算术运算,或赋值操作,最后才进行增1或减1的运算。例如:

在上面的第一个例子中,由于x++是后缀增1运算,所以首先进行赋值操作,result9 = 10,然后再对x加1。在第二个例子中,y--是后缀减1运算,即首先进行y + 5的运算,将结果8赋予result10后,再进行对y减1的运算。这个例子和下面的举例是等同的:

不难看出,如果增1的运算是独立的,即不涉及任何其他运算或赋值操作,则前缀增1和后缀增1没有什么不同,例如:
++x;
和
x++;
被视为相同的增1运算。请思考一下原因。另外,这种情况同样适用于减1的运算吗?
注意,在Java语言中,算术表达式只允许圆括号,而不能使用方括号以及花括号。其运算优先权和算术规定一样:括号里面的优先;乘、除优先于加减;运算等级相同时,从左到右进行。表2.7列出了更多算术表达式及其注释。
表2.7 算术表达式举例

注意,Java编译器将对下面的算术表达式给出编译错误信息:
{x – [y + (z – 2)]} X 100
因为它使用了非法括号和乘法操作符。应该改写为:
(x – (y + (z – 2))) * 100
警告 Java表达式中,不允许使用方括号和花括号。乘法不允许使用“×”,除法不允许使用“÷”。
另外注意,在算术表达式中使用的变量必须是定义过的变量,否则Java编译器将给出语法错误信息。
2.3.2 快捷赋值操作符
上面讨论过的增1和减1操作,实际上就是快捷算术操作符。使用快捷操作符的目的是简化程序的编写,增加程序的可读性。但要适当应用,否则会适得其反。例如:
int result = x++ + ++y - --x + 1;
就是一个典型滥用快捷算术操作符的例子。它不但没有起到简化程序编写的目的,反而使得程序更加难懂,减弱了程序的可读性。
下面介绍更多快捷操作符,主要是快捷赋值操作符。表2.8列出了Java语言的快捷赋值操作符及其含义。
表2.8 Java语言的快捷赋值操作符

用快捷相加操作符做个总结,它的语法格式为:
varName += value;
相当于:
varName = varName + value;
这里,varName是已经定义的变量名;value是该变量的一个合法数据值。试想:你可以总结一下其他快捷操作符的语法格式吗?
不难看到,对一个变量加1运算,可以有如下4种方法:

它们的运算结果完全一样。
2.4 初识字符串
我们在编程时经常使用字符串。在Java中,字符串实际上是对象,由字符串类String来创建。但为了使用方便,也为了和在C语言中使用字符串的概念一致,Java对字符串操作,尤其是对字符串的定义,提供了一套和基本类型变量相同的方法,例如:
String greeting = "Welcome to Java world! ";
与定义一个整型变量相比,例如:
int x = 100;
在形式上没有什么语法差异。我们把Java提供的这种将字符串当作普通变量应用的方式称为直接引用referencing。既然字符串是对象,那么它一定有方法可以调用。是的,例如:
greeting.length
就是调用字符串的方法length,它将返回greeting这个字符串的长度。
我们将在以后的章节专门详细讨论字符串和它的应用。下面让我们首先了解字符串引用的基本概念和功能。
2.4.1 菜鸟理解字符串
在Java中,字符串由一个或多个字符组成。和字符型变量char相同,这些字符可以是Unicode中的任何字符,因此每个字符占据两个字节长度的存储空间。但与字符型变量不同的是,字符串的值由双引号括起;而字符型变量的值由单引号括起来,并只能是一个字符。两者的比较如下:

尽管它们的值相同,但这两个变量有着本质的不同。一个是基本字符型变量;而另一个是对字符串对象的直接引用,或简称为定义一个字符串变量并赋值。
下面是定义字符串变量的更多例子:

从上面的例子可以看出,空格字符也可以是字符串的值,或字符串值的一部分。str2的值为空,即它的引用已经确定,但在其引用的地址中还没有任何Unicode的字符值。而message的赋值为null,其含义只是登录一个字符串,实际上还没有产生引用,即这个字符串的引用地址还没有确定。
2.4.2 什么是字符串引用
正如2.2.3小节中讨论过的,变量、变量的值、存储器以及存储器地址之间有着密切关系一样,字符串变量、字符串值、引用和存储器以及存储器地址之间也有着密切的关系。这种关系可以由图2.2来表示。

从图2.2中可以看出,当一个字符串被定义并赋值时,编译器将创建一个字符串对象,同时创建一个由这个字符串对象所引用的地址,这个地址是一段存储器空间的开始地址,这段存储空间的大小由具体的赋值内容来确定。例如:
String name = "Java";
其赋值内容是"Java",共4个字符,要求8个字节的存储空间。而String str2 = "";其赋值内容为空,虽然已经产生引用,但内存空间大小还没有确定。最后在String message = null;
中,只是在编译器中登录一个叫message的字符串,但编译器并没有产
生字符串对象来引用它。直到在程序的某个代码行,有如下对该字符串
的赋值语句时:
message = "Create a referencing. ";
才建立一个字符串对象并对message进行引用。注意,字符串对象本身也占用一段存储器,用来存储其实例变量和方法的装载地址。
2.4.3 如何实现字符串连接
连接,或称“join”,是指对两个字符串进行连接操作,即将一个字符串加到另一个字符串的结尾,产生一个扩充的新字符串。Java中使用操作符“+”对字符串进行连接操作。我们也可以把一个非字符串型的变量和字符串进行连接操作,这时,Java编译器将自动把这个非字符串型变量转换成字符串,然后进行连接。具体例子如下:

在连接后,字符串fullName的值是“王 Xinhua”。注意,名字中间的空格是由一个空格字符串常量" "加上去的。
另外一个例子:
double total = 199.89;
String string_total = "total: "+ total;
由于变量total是双精度浮点变量,在对这段代码编译时,编译器首先把变量total的数值199.89转换成字符串“199.89”,然后进行连接操作。
所以,字符串string_total的值是“total:199.89”。
以下例子也是合法的join操作:
String message = 199.89 + " is my total price. ";
相同的道理,连接操作后字符串message的内容为“199.89 is my totalprice.”。
也可以使用快捷操作符“+=”进行字符串连接。例如:

这种利用快捷操作符进行字符串连接的方法在Java编程中经常被使用。
以下例子将产生语法错误:
因为在连接中,其中一个操作数必须是字符串。
在以上例子中是否只要有一个操作数不是字符串,Java编译器都自动首先对其进行转型操作,然后做连接呢?是的。这是一个具有普遍性的原理,即不同类型的操作数不能直接进行算术运算,也不能直接进行字符串连接操作。操作符将要求编译器把要求内存少的操作数转换成和另一个操作数相同的数据类型,然后进行算术运算或连接。这种转型操作叫作编译器自动转型操作,或简称自动转型。
再回到字符串连接的例子。在:
199.89 + " is my total price. "
中,第一个操作数是双精度浮点数,第二个操作数是字符串。字符串在这里是对象引用,要求更多的内存空间,所以连接操作符(+)要求编译器首先将199.89转换成字符串:
然后进行连接操作。
下面的例子也应用相同的道理:int bonus = 25;
double payment = 800.77 + bonus;
在这个加法运算中,bonus是整型变量,要求4个字节存储空间,而800.77是双精度浮点数,要求8个字节存储空间。所以编译器首先将bonus转换成双精度型浮点数据,即25.0,然后进行加法运算。
这些转型过程对我们来说似乎是多余的。有些朋友也许会说,计算机语言真够矫情的,或说得好听些,“一丝不苟”的。是的,正是由于计算机语言或者计算机的这种矫情或“一丝不苟”,才使得它有了这样精确的运行结果。
言归正传,字符串连接操作符(+)是操作符重载的典型例子。什么是操作符重载呢?即相同的操作符在不同的运算或操作时有不同的语法含义。就“+”来说,它在一个数字前面表示该数值是正的;在两个数据型操作数之间表示加法运算;在字符串操作中表示连接。它被赋予多重重任,即重载操作。还可以列举出其他操作符重载的例子。你可以尝试完成。
为什么要重载?道理很简单,增加Java语言在编写代码时的灵活性。试想一下,如果没有操作符重载,我们是否要使用至少3种不同的操作符来进行表示正数、加法,以及字符串连接的操作呢?
重载不仅仅体现在操作符中。后续章节中将讨论更多的重载应用,如构造方法重载和方法重载。在本书的引导下,你一定能掌握更多重载的知识和编程技术,并且利用重载编写程序代码。
注意,在字符串连接操作中,其中一个操作数必须是字符串,否则编译器将产生语法错误信息。
3W 字符串引用简称字符串变量,是为了使用方便,把对对象的操作简化成和基本变量相同的操作。字符串变量代表一个由字符串对象引用的内存地址,其内容就是存储在这段地址中的字符串。
2.4.4 如何处理特殊字符——转义符
表2.9列出了特殊字符,或称转义符。使用它们时必须使用前缀斜线(\),告诉编译器后面的字符是特殊引用的字符。表中前3个字符是控制光标位置的操作。第4个字符为双引号的使用。由于双引号已经被用来表示引用字符串的内容,若在字符串里使用双引号作为其内容,必须在双引号前加“\”,即“\”。最后一个特殊字符是斜线“\”。由于斜线也被用来作为常量特殊字符的标示符,若要把它作为字符串的内容,必须在斜线前再加一个斜线,即“\\”。第一个斜线告诉编译器在它后面的字符才是真正引用的字符。

表2.9中的第一个例子中,“\n”为回车,而第二个n为正常字符串值。最后一个例子中,4个斜线可以分为两组,即两组“\\”,告诉编译器使用两个斜线。
如果斜线后面跟随的不是表中列举的字符,编译器将产生语法错误信息。例如:
String something = "\y"; //字符串值非法定义
以下是使用特殊字符的更多例子:String content = "Java\tC++\tC";
如果使用如下输出语句显示这个字符串内容时:
System.out.println(content);
其输出结果为:
Java C++ C
即Java、C++和C被跳格所隔开。注意,在使用JOptionPane.showMessageDialog作为输出时,跳格“\t”和到本行开始“\r”不工作。第3章中将专门讨论API类JOptionPane的应用。
2.5 初识数组
以上讨论的各种变量类型只能适合处理单个变量。但在实际应用中,经常会遇到大量数据处理问题。如银行向所有客户发送账户信息。
我们不可能在程序中创建成千上万个变量或者对象。数组可以很好地解决对大量数据处理的问题。本节简单讨论数组,本书将在以后章节中更深入地讨论数组及其应用。
2.5.1 菜鸟理解数组
数组实际上是许多变量存储在一个变量名下,用变量的下标表示不同的变量成员,例如:
int array[] = {5, 3, 4, 1}; //定义有四个变量的整型数组以上语句定义了一个名为array的整型变量并对其赋值。注意数组类型变量是用方括号作为标记的。赋值时这个数组中的每个变量值都必须是整数。这个语句实际上定义了一个具有4个成员变量或元素的数组,即:
array[0] = 5;
array[1] = 3;
array[2] = 4;
array[3] = 1;
注意,可以利用方括号中的不同下标来表示它的4个元素。下标值从0开始,直到该数组的元素数-1 = 3。你可以用这种简单方法创建数组:
//创建具有三个元素的双精度数组并赋予每个元素初始值
double myArray[] = {0.50, 015, 0,1259};
//创建具有两个元素的字符串型数组并赋予初始值
String names[] = {"Joe Wang", "Smith Liu" };…
2.5.2 一个例子教会你使用数组
以下是上面例子的测试程序:

运行结果为:
array[0]: 5
names[1]: Smith Liu
由于数组涉及循环、创建对象等操作配资网官方网站,我们将在以后章节进一步讨论数组的应用。
怀远配资提示:文章来自网络,不代表本站观点。