1. 代码块
使用大括号“{}"划分程序的各个部分(通常称为块),任何方法的代码都用 ”{“ 开始,用 ”}“ 结束。
1.1. 块作用域
块(block)指由若干条Java语句组成的语句,并用一对大括号括起来。块确定了变量的作用域。一个块可以嵌套再另一个块中。
int n;
...
{
int k;
...
} //k作用域到这里
//不能在嵌套的两个块中声明同名的变量
int n;
...
{
int k;
int n; //ERROR
...
}
2. 注释
注释不会出现在可执行程序中
- 单行注释 :使用 // ,其注释内容从 // 开始到本行结尾
- 多行注释 :使用 /* 和 */ 将一段较长的注释括起来
- 生成文档注释 :以 /** 开始,以*/ 结束
3. 数据类型
java语言是一种强类型语言,意味必须为每一个变量声明一种类型。 在java中一共有8种基本类型,其中4种整型、2种浮点型、1种用于表示Unicode编码的字符单元的字符类型char 和1种用于表示真值的boolean类型。
各种数据类型的取值范围都是固定的,Java中所有的数值类型所占据的字节数量与平台无关。
3.1 整形
整形用于表示没有小数部分的数值,允许是负数; 整形范围与运行Java代码的机器无关;
- 长整数数值有一个后缀 L 或 l(如4000000000L);
- 十六进制数值有一个前缀 0x 或 0X(如 0xCAFE);
- 八进制有一个前缀0,例如,010对应八进制中的8,但是8进制表示法比较容易混淆,建议不要使用八进制常数;
- java7开始,加上前缀0b或0B就可以写二进制数,例如,0b1001就是9;
可以为数字字面量加上下划线,用1_000_000(或0b1111_0100_0010_0100_0000)表示一百万,这些下划线只是为了易读性,java编译器会去取这些下划线。
3.2 浮点类型
float类型的数值有一个后缀F或f(例如,3.14F),没有后缀F的浮点数值(如3.14)总是默认为double类型,也可以在浮点数值后面添加后缀D或d。
浮点数值不适用与无法接受舍入误差的金融计算。
3.3 char类型
- char类型原本用于表示单个字符,现在有些Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值。
- char类型的字面量值要用单引号括起来,例如
A是编码值位65的字符常量。 - char类型的值可以表示位十六进制值,其范围从\u0000到\uFFFF,例如,\u2122表示商标符号(™),\u03C0表示希腊字母(π)。
3.4 boolean类型
boolean类型有两个值:false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。
4. 变量与常量
Java使用变量来存储值,常量就是值不变的变量。
4.1. 声明变量
在Java中,每个变量都有一个类型(type),在声明变量时,先指定变量的类型,然后是变量名。
4.2. 变量初始化
- 声明一个变量之后必须用赋值语句对变量进行显式初始化;
- 变量的声明尽可能靠近变量第一次使用的地方;
- 从Java 10开始,对于局部变量,如果可以从变量的初始值推断出它的类型,就不需要声明类型,只需使用关键字var而无需指定类型。
4.3. 常量
//使用关键字final指示常量,例如:
final double CM_PER_INCH = 2.54;
关键字final表示这个变量只能被赋值一次,一旦被赋值之后,就不能够再更改了。习惯上,常量名使用全大写。
4.3.1. 类常量
在Java中,经常希望某个常量可以在一个类的多个方法中使用,通常将这些常量称为类常量(class constant)。可以使用关键字 static final 设置一个类常量。
类常量的定义位于main方法的外部,因此,在同一个类的其他方法中也可以使用这个常量。而且,一个常量被声明为public,那么其他类的方法也可以使用这个常量。
4.4. 枚举类型
有时候,变量的取值只在一个有限的集合内
//Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者特殊值
enum Size {SMALL,MEDIUM,LARGE,EXTRA_LARGE};
Size s = Size.MEDIUM;
null,null表示这个变量没有设置任何值。
5.运算符
运算符用于连接值,Java中提供了一组丰富的算术和逻辑运算符以及数学函数
5.1. 算数运算符
- 使用算术运算符+、-、*、/表示加、减、乘、除运算。
- 当参与 / 运算的两个操作数都是整数时,表示整数除法,否则,表示浮点除法。
- 整数的求余操作(取模)用 % 表示。
- 整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。
5.2. 类型转换
5.2.1. 合法类型转换
5.2.2. 强制类型转换
在必要时,int类型的值将会自动转换为double类型,但另一方面,可以把double类型强制转成int,但是可能会损失信息。
double x = 9.997;
int nx = (int) x; //nx 值为9
如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300 的实际值为44。
5.3. 结合赋值和运算符
x += 4;
//等价于:
x = x+4;
//如果运算符得到一个值,其类型与左侧操作数
//的类型不同,就会发生强制类型转换。
//例如,如果 x 是一个 int,则以下语句
//是合法的,将把 x 设置为 (int)(x+3.5)
x += 3.5;
5.4. 自增与自减运算符
- n++将变量 n 的当前值加1,n--将变量 n 的值减1。
- 这些运算符改变的是变量的值,不能应用与数值本身。
- 在表达式中,n表示先自增再赋值,n表示先赋值再自增。
5.5. 关系和boolean运算符
- && 逻辑”与“运算符;
- || 逻辑”或“运算符;
- ! 逻辑非运算符;
&&和 || 运算符是按照短路方式来求值的:如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。
- ? :
三元运算符:如果条件为 true,就为第一个表达式的值,否则计算为第二个表达式的值。
5.6. 运算符优先级
同一级别的运算符按照从左到右的次序进行计算(但右结合运算符除外)。
//因为 += 是右结合运算符,所以表达式
a += b += c;
//等价于
a += (b += c);
//也就是将 b += c 的结果(加上c之后的b)加到a上。
6.字符串
从概念上讲,Java字符串就是Unicode字符序列。例如,字符串Java\u2122由5个Unicode字符J、a、v、a和™组成。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然叫作String。每个用双引号括起来的字符串都是String类的一个实例。
6.1. 子串
String 类的 substring 方法从一个较大的字符串中提取一个子串。
String greeting = "Hello";
String s = greeting.substring(0,3); //s值为"Hel"
Java字符串中的代码单元和代码点从0开始计数。
substring方法的第二个参数是不想复制的第一个位置,从0开始计数,直到3位置,但不包含3。substring的工作方式有一个优点:容易计算子串的长度。字符串s.substring(a,b)的长度为b-a。
6.2. 拼接
Java语言允许使用 + 号连接(拼接)两个字符串。
当将一个字符串与一个非空字符串的值进行拼接时,后者会转换成字符串(任何一个Java对象都可以转换成字符串)。
int age = 13;
String rating = "PG" + age; //将rating设置为 "PG13"
//使用静态的 join 方法可以把多个字符串放在一起
//并指定一个界定符分隔
String all = String.join("/","S","M","L","XL"); //all的值为 S/M/L/XL
//repeated的值为 javajavajava
String repeated = "java".repeat(3);
6.3. 不可变字符串
String 类没有提供修改字符串中某个字段的方法。
String类对象是不可变的,字符串"Hello"永远包含字符 H、e、l、l 和o的代码单元序列。不能修改这些值,但是可以修改字符串变量,让它引用另外一个字符串。
6.4. 检测字符串是否相等
//可以使用 equals 方法检测两个字符串是否相等
s.equals(t);
//s与t可以是字符串变量,也可以是字符串字面量
"Hello".equals(greeting); //true
//使用 equalsIgnoreCase方法检测两个字符串是否相等而不区分大小写
"hello".equalsIgnoreCase(greeting); //true
不要使用 == 运算符检测两个字符串是否相等!
6.4. 空串与 Null 串
空串 "" 是长度为0的字符串。
//调用以下代码检查一个字符串是否为空
if (str.length() == 0)
//或
if (str.equals(""))
空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存一个特殊的值,名为 null ,表示目前没有任何对象与该变量关联。
//检查一个字符串既不是 null 也不是空串
if (str != null && str.length() != 0)
6.5. 构建一个字符串
有时候,需要由较短的字符串构建字符串,例如,按键或来自文件中的单词。如果采用字符串拼接的方式来达到这个目的,效率会比较低。每次拼接字符串时,都会构建一个新的String对象,即耗时,又浪费空间。使用StringBuilder类可以避免这个问题。
如果需要用许多小段的字符串来构建一个字符串,应该按照下列步骤进行。
//首先构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();
//需要添加一部分内容时,调用append方法
builder.append(ch); //添加一个single character
builder.append(str); //添加一个string
//在字符串构建完成时调用toString方法得到一个String对象
String completedString = builder.toString();