就像人与人之间交流使用的语言需要遵循一定的语法规则一样,Java语言也离不开特定语法的支持,如基本语法、数据类型、变量、常量、运算符与表达式、类型转换和输入输出等,只不过这些语法要比日常生活中语言的语法更加严谨。本章我们先来学习这些基本语法,为后续学习打下扎实的根基。
2.1 Java基本语法
作为一门流行的编程语言,Java有着它自己特定的语法格式,要想使用Java语言开发出一款功能完善的软件产品,就必须熟练掌握这些基本语法。当然,这些基本语法都是简单易懂的,包括基本格式、关键字、标识符、注释、编程风格等。
2.1.1 Java语言的基本格式
学习任意一门编程语言,首先都要掌握其基本格式,Java语言的基本格式如下:
• 语句:语句是程序执行的基本单位。Java程序由两种语句组成,一种是结构定义语句,用于声明一个类或者方法;另一种是功能执行语句,用于实现具体的功能,以分号(;)结束。
• 语句块:一对大括号{}包含的一系列语句称为语句块(代码块),语句块可以嵌套,即语句块内可以嵌套子语句块。
• 空格:在Java程序中,为了增加程序的可读性,允许在程序元素之间增加任意数量的空格,编译器会自动忽略多余的空格。在Java程序中,回车键及换行符都可以表示一行的结束,可以被看作是空格,空格键、Tab键也是空格。
• 区分大小写:Java语言严格区分大小写。例如,在Java程序中,age和Age是意义完全不同的两个符号。
• 换行:当一个表达式无法容纳在一行内时,可以依据如下一般规则断开:在一个逗号后面断开;在一个操作符前面断开;宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开;新的一行应该与上一行同一级别表达式的开头处对齐;如果以上规则导致代码混乱或者使代码都堆挤在右边,那就代之以缩进8个空格。
• 其他:Java程序中,一句连续的字符串不能分开在两行中书写,例如下面的代码是错误的:
System.out.println("hello
Java编程讲义");
为了便于阅读,需要将一个比较长的字符串分在两行中书写,可以先将一个长字符串分成两个字符串,再用加号(+)连接起来,在(+)处断行,例如:
System.out.println("hello" +
"Java编程讲义");
2.1.2 Java关键字
关键字也称保留字,是编程语言里事先定义好并赋予特殊含义的英文单词,在程序设计中不能再将它定义成别的用途。在开发工具中(IDEA)中,关键字会以特殊颜色(默认蓝色)显示,用于提示其为关键字,避免被误用。Java中保留了许多关键字,这些关键字的所有字母都是小写的,具体如表2.1所示。
表2.1 Java关键字
abstract |
assert |
boolean |
break |
byte |
case |
catch |
char |
class |
const |
continue |
default |
do |
double |
else |
enum |
extends |
final |
finally |
float |
for |
goto |
if |
implements |
import |
instanceof |
int |
interface |
long |
native |
new |
package |
private |
protected |
public |
return |
strictfp |
short |
static |
super |
switch |
synchronized |
this |
throw |
throws |
transient |
try |
void |
volatile |
while |
在上面列举的关键字中,每个关键字都有他自己特殊的作用。例如,package关键字用于包的声明,import关键字用于引入包,class关键字用于类的声明。在本书后面的章节中,将会逐步对使用到的关键字进行讲解,所以大家不需要现在就将所有的关键字全部记住,只需要了解即可。
2.1.3 Java标识符
在编程过程中,我们经常需要在程序中定义一些符号来标记一些名称,比如编程中用到的变量名、包名、类名以及方法名、参数名等,这些符号被称为标识符。在Java语言中,标识符可以由编程人员自由指定,但是需要遵循如下规定:
• 标识符可以由任意顺序的大小写字母、数字、下划线和美元符号($)组成。
• 标识符不能以数字开头。
• 标识符不能是Java中的关键字。
• 标识符区分大小写,且长度没有限制。
在Java程序中,定义的标识符必须严格遵守上面列出的规范,否则程序无法完成编译。下面的这些标识符都是合法的:
Test
Demo123
aaa_zhang
userName
$Demo
下面的这些标识符都是不合法的:
123Demo // 不能以数字开头
package // 不能是关键字
Hello year // 不能包含空格特殊字符
在实际使用标识符时,应该使标识符能够在一定程度上反映它所表示的变量、常量、对象或类的含义,达到“见名知意”的效果,这样程序的可读性更好。
注意:Java的标识符可以使用中文,但是习惯上以英文为主;标识符内可以包含关键字,但不能与关键字完全一样,例如,“thisTea”是一个合法的标识符,但“this”是关键字,不能用作标识符。
2.1.4 Java注释
真正开发一个应用程序,大多情况下都是团队合作,所以在编写程序时,为了使代码更易于阅读,通常会在实现功能的同时为代码加一些注释。注释是对程序的某个功能模块或者某行代码的解释说明,以便其他人能轻松地阅读代码,了解其意图。Java程序同样需要添加必要的注释,以增强可读性,这些注释只Java源文件中有效,在编译程序时,编译器会自动忽略这些注释信息,不会将其编译到class字节码文件中去。另外,注释还可以屏蔽一些暂时不用的语句,等需要时直接将此语句的注释取消即可。例如,在调试代码的时候彻底删除代码可能会误删,造成程序彻底瘫痪,这时候使用注释就显得异常轻松了。根据功能的不同,Java语言提供了如下3种注释方式:
• 单行注释:用于对程序的某一行代码进行解释。在注释内容前面加双斜杠“//”,Java编译器会忽略掉这一行双斜杠以后的信息,并且不会对其他代码造成影响,使用比较灵活。单行注释一般用来对声明的变量、一行程序作用进行简要说明。具体示例如下:
String tea_year = nul1; // 定义一个String字符串,并为其赋值
• 多行注释:用于注释内容有多行的情况。在注释内容前面以单斜杠加一个星号“/*”开头,并在注释内容末尾以一个星号加单斜杠“*/”结束,常用于注释掉暂时不用的代码、说明方法的功能等。具体示例如下:
public class JavaaMultiline{// 定义一个类
int age;// 定义一个变量
/**
* 主方法,程序的入口地址
*/
public static void main(String[]args){
System.out.println("多行注释");
}
}
• 文档注释:用于对程序的结构、方法和属性等进行说明,以单斜杠加两个星号“/**”开头,并以一个星号加单斜杠“*/”结束。在实际开发中,开发人员可以使用javadoc命令将文档注释内容提取生成正式的HTML格式的帮助文档。对于初学者而言,文档注释并不是很重要,了解即可。文档的具体格式如下:
/**
*作者:张晨光
*公司:AAA软件教育
*功能:文档注释讲解
*/
public class JavaDoc{// 定义一个类
int age;// 定义一个变量
/**
* 主方法,程序的入口地址
*/
public static void main(String[]args){
System.out.println("文档注释");
}
}
知识点拨:javadoc是API文档生成器,该工具解析一组Java源文件中的声明与文档注释,生成一组HTML页面,描述这些源程序中定义的类、内部类、接口、构造方法、成员变量等,JDK的API文档就是javadoc工具生成的。
2.1.5 Java编程风格
编程风格是编程的规范,即程序开发者一般约定的一些编程规则、格式等。在日常开发过程中,一些比较大的项目通常都是由很多人合作完成的,所以遵守一门语言的编程风格至关重要,否则如果大家都按自己的喜好来进行编码,会导致代码阅读性大大降低,在后期维护的时候会非常不方便。例如,有的程序员可能会养成不换行的习惯,一串代码整行排列,除了本人,其他人是很难去阅读他的代码的。目前,Java程序的编写流行着两种代码块的写法,分别为Allmans风格和Kernighan风格。
1.Allmans风格
Allmans风格又称为独行风格,大括号左右两边都独占一行,大括号和具体的代码分隔开,在代码量少的时候,代码布局清晰,可读性强。Allmans风格的代码如下:
Public Class Allmans
{
public static void main(String[] args)
{
System.out.println("我是独行风格");
}
}
在代码量少的时候适合使用Allmans风格编码,但是如果代码量多的话,会导致代码左边出现很多大括号,反而不利于阅读。
2.Kernighan风格
Kernignan风格又称为“行尾”风格,左边的大括号在上一行代码的行尾,右边的大括号则独占一行,这样既能将大括号和代码分隔开,又不至于使代码看着过于冗余。当代码量较多时使用“行尾”风格,可使代码层次更加简洁清晰。Kernighan风格的代码如下:
Public Class Kernignan{
public static void main(String[] args){
System.out.println("我是行尾风格");
}
}
2.2 Java基本数据类型
在程序执行过程中,数据是程序必不可少的一部分,也是程序处理的对象。不同的数据有不同的数据类型。通常将数据按照性质进行分类,每一类称为一种数据类型。也就是说,数据类型定义了数据的性质、取值范围、存储方式和对数据能够进行的运算和操作。强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.C 、C++等语言。Java是一种强类型语言,数据类型可以分为两大类,一类是基本数据类型,另一类是引用数据类型(简称引用类型)。基本数据类型的数据在内存中存放的是数据值本身,每种基本数据类型的数据所占用内存的大小是固定的,与软硬件环境无关。引用数据类型的知识将在第2.6.1节详细讲解。
Java基本数据类型分为4类,分别是整数类型、浮点类型、字符型和布尔类型,其中有4种整数类型、2种浮点类型、1种字符类型和1种布尔类型,一共8种类型。它们的分类及对应关键字如下:
• 整数类型:byte、short、int、long。
• 浮点类型:float、double。
• 字符类型:char。
• 布尔类型:boolean。
2.2.1 整数类型
当数据不带小数点或不是分数时,该数据可以声明为整数类型。Java语言中,所有整数类型的数据均带有符号,分为正数和负数,整数数值的最高位表示符号,其中0表示正数,1表示负数,其余位表示值。Java语言的每种数据类型都对应一个默认值,使这种数据类型变量的取值总是确定的,所有整数类型的变量的默认值都是0。
整数类型可分为byte、short、int和long 4种,其长度、取值范围如表2.2所示。由于char(字符)类型可以转换为int类型,所以表2.2将这4种类型和char类型的长度与取值范围一起列出。
表2.2 整数类型长度与取值范围
数据类型 |
长度 |
取值范围 |
byte |
8位 |
-27~27-1,即-128~127 |
short |
16位 |
-215~215-1,即-32768~32767 |
int |
32位 |
-231~231-1,即-2147483648~2147483647 |
long |
64位 |
-263~263-1,即-9223372036854775808~9223372036854775807 |
char |
16位 |
'\u0000'~'\uffff',即0~65535 |
在计算机中,整数类型常量可以使用十进制、八进制和十六进制3种形式表示。以1~0开头的数为十进制数,0除外,如1、2、889、0、9898等;以0开头的数为八进制数,如077、011等;以0x或0X开头的数为十六进制数,如0xBAB、0x3a、0xBFAL等(十六进制里面A、B、C、D、E、F大小写均可)。
注意:当一个整数定义为long型时,需要在数值后面加L或l,因为小写的L看起来和数字1很像,所以建议使用大写L。
2.2.2 浮点类型
浮点类型用来存储小数,当需要进行涉及小数的计算或精确度比较高的计算时,就需要使用浮点类型。在Java语言中,将小数又分为float单精度浮点数和double双精度浮点数两种类型,单精度浮点数以f或F结尾,双精度浮点数以d或D结尾,不加后缀会默认为double双精度浮点数。如果考虑到要节省运行时的资源,并且运算时对于数据取值范围不大,同时对运算精度的要求也不太高,可以使用单精度类型。Java使用如下两种方式表示浮点数:
• 标准计数法:由整数部分、小数点和小数部分组成,如2.8、58.98等。
• 科学计数法:由整数部分、小数点和指数部分组成,其中指数部分由字母E或e加上带正负符号的整数表示,如805.18可以表示为8.0518E+2。
在java中,float是单精度,32位.浮点数,默认是0.0f;double是双精度,64位,浮点数,默认是0.0d。 在内存中存储为float类型符号位1bit、指数8bit、尾数23bit;double类型符号位1bit、指数11bit、尾数52bit。
浮点类型的长度和取值范围如表2.3所示。
表2.3 浮点类型长度与取值范围
数据类型 |
长度 |
取值范围 |
float |
32位 |
1.4E-45~3.4028235E+38 |
double |
64位 |
4.9E-324~1.7976931348623157E+308 |
2.2.3 字符类型
字符类型用来存储单个字符,用char表示。Java语言中的字符采用Unicode字符集编码格式,在内存中占用两个字节,共16位,属于无符号整数,一共有65536个,字符的取值范围从0到65535,表示其在Unicode字符集中的排序位置。字符类型有如下3种形式:
• 用单引号括起来的字符。例如,'Z'、'G'、'7'等都是合法的字符串常量,哪怕是整数,被单引号包起来以后也是字符常量。
• 转义字符。Java语言中的一些特殊字符,称为转义字符。如'\b'表示退格、'\n'表示换行、'\t'表示制表符,调到下一个TAB位置。
• 用Unicode值表示的字符。格式是'\uXXXX',其中XXXX代表一个十六进制的整数,如'\u08B3'。
知识点拨:Unicode标准字符集表最多可以识别65536个字符,在其中前128个字符刚好是ASCII码字符。由于Java语言的字符类型采取了Unicode这种国际标准编码格式,所以使Java语言能够极为方便地处理各种语言。例如,可以将汉字作为字符类型变量的值,这为程序的国际化提供了方便。
2.2.4 布尔类型
在程序中表示判断条件,改变程序执行的流程,可以使用布尔类型。布尔类型也称