1. 关键字和保留字
关键字(keyword):
- 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
- 特点:关键字中所有字母都为小写
- 用于定义数据类型的关键字:class、interface、enum、byte、short、int、float、double、char、boolean、void
- 用于定义流程控制的关键字:if、else、switch、case、default、while、do、for、break、continue、return
- 用于定义访问权限修饰符的关键字:private、protected、public
- 用于定义类、函数、变量修饰符的关键字:abstract、final、static、synchronized
- 用于定义类与类之间关系的关键字:extends、implements
- 用于定义建立实例及引用实例、判断实例的关键字:new、this、super、instanceof
- 用于异常处理的关键字:try、catch、finally、throw、throws
- 用于包的关键字:package、import
- 其他修饰符关键字:native、strictfp、transient、volatile、assert
- 用于定义数据类型值的字面值:true、false、null
保留字(reserved word):
现有Java版本尚未使用,但以后版本可能会作为关键字使用,自己命名标识符时要避免使用这些保留字:goto、const
2. 标识符(Identifier)
- 定义:Java对各种变量、方法和类等要素命名时使用的字符序列称为标识符
- 技巧:凡是自己可以起名字的地方都叫标识符
定义合法标识符规则:
- 由26个英文字母大小写,0-9,_或$组成
- 数字不可以开头
- 不可以使用关键字和保留字,但能包含关键字和保留字
- Java中严格区分大小写,长度无限制
- 标识符不能包含空格
Java中的名称命名规范:
- 包名:多单词组成时所有字母都小写 xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写 XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写 xxxYyyZzz
- 常量名:所有字母都大写,多单词时每个单词用下划线连接 XXX_YYY_ZZZ
3. 变量
3.1 变量的概念:
- 变量是内存中的一个存储区域,包含变量类型、变量名、存储的值
- Java中的每个变量必须先声明后使用
- 变量的作用于在其定义所在的一对“{ }”内
- Java定义变量的格式:数据类型 变量名 = 变量值;or 数据类型 变量名;变量名 = 变量值;(定义后必须赋值)
3.2 变量的分类:
3.2.1 按数据类型分类
每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
- Java的整型常量默认为int型,声明long型常量须后加“l”或“L”
类型 | 占用存储空间 | 范围 |
---|---|---|
byte | 1字节 | − 128 ∼ 127 -128\sim127 −128∼127 |
short | 2字节 | − 2 15 ∼ 2 15 − 1 -2^{15}\sim 2^{15}-1 −215∼215−1 |
int | 4字节 | − 2 31 ∼ 2 31 − 1 -2^{31}\sim 2^{31}-1 −231∼231−1 |
long | 8字节 | − 2 63 ∼ 2 63 − 1 -2^{63}\sim 2^{63}-1 −263∼263−1 |
- Java的浮点型默认为double型,声明float型常量须后加“f”或“F”
类型 | 占用存储空间 | 范围 |
---|---|---|
单精度float | 4字节 | − 3.403 E 38 ∼ 3.403 E 38 -3.403E38\sim3.403E38 −3.403E38∼3.403E38 |
双精度double | 8字节 | − 1.798 E 308 ∼ 1.798 E 308 -1.798E308\sim 1.798E308 −1.798E308∼1.798E308 |
- char型数据表示字符,一个字符占2个字节。Java中所有字符都用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。字符型变量有三种表现形式:
- 字符常量是用单引号括起来的单个字符,如:char c1 = ‘a’;(单引号中只能有一个字符)
- 使用转义字符“\”将其后的字符转变为字符型常量,如:char c2 = ‘\n’;
- 直接使用Unicode值“\uXXXX”来表示字符型常量,其中XXXX代表一个十六进制整数,如:char c3 = ‘\u000a’; (char类型是可以进行运算的,因为对应Unicode码)
- boolean类型只能取true和false,不能用0和1来代替。
- String类型变量使用一对双引号声明。
3.2.2 按变量在类中声明的位置分类
- 在方法体外,类体内声明的变量称为成员变量
- 在方法体内声明的变量称为局部变量
- 同:两者都有生命周期
- 异:局部变量除形参外,需显式初始化(指在使用前需要显示赋值)
3.3 基本数据类型转换
3.3.1 自动类型提升:容量小的类型自动转换为容量大的数据类型。排序如下:
有多种类型的数据混合运算时,系统先自动将所有数据转换成容量最大的那种数据类型,再进行计算。
- byte、short、char之间不会相互转换,它们三者计算时会先转为int类型
- boolean类型不能与其他数据类型运算
- 当把任何基本数据类型的值和字符串(String)进行连接运算(+)时,基本数据类型的值会自动转为String类型(基本数据类型与String之间只能进行“+”运算)
3.3.2 强制类型转换:使用强转符“( )”,可能导致精度损失
long l = 123; //本身123为int型,相当于自动类型提升把int变为long
long l1 = 123123123123123; //赋值整数超出int范围时报错,此时必须在后面加l或L
3.4 进制
二进制以0b或0B开头,八进制以0开头,十六进制以0x或0X开头。
4. 运算符
运算符的分类:算术运算符、赋值运算符、比较运算符(关系运算符)、逻辑运算符、位运算符、三元运算符。
short s = 10;
s = s + 1; //编译不通过,转为int型后不能赋值给s
s += 1; //可以实现运算,且不改变s的数据类型
s++; //自增不会改变变量本身的数据类型
- 赋值运算符支持连续赋值
- 逻辑运算符共有6个:&逻辑与、&&短路与、|逻辑或、||短路或、!逻辑非、^逻辑异或。逻辑运算无论左边是true还是false右边都会进行运算,短路与运算若左边为false右边不会进行运算。
//手动将60转化为十六进制
int i = 60;
int j = i & 15; //获得低四位的值
i = i >> 4;
int k = i & 15; //获得高四位的值
//将第四位与高四位都转为十六进制的字符串并相加
- 位运算符共有7个:<<左移、>>右移、>>>无符号右移、&与运算、|或运算、^异或运算、~取反运算。位运算符是直接对整数的二进制进行的运算。
//使用异或运算交换两个数值变量的值
n = n ^ m;
m = n ^ m;
n = n ^ m;
- 三元运算符:(条件表达式)?表达式1:表达式2;
- instanceof:用于检查目标是否是类的对象
5. 程序流程控制
顺序结构、分支结构、循环结构
5.1 Scanner类
要想从键盘获取不同类型的变量,需要使用Scanner类。Scanner类中没有获取char型数据的方法,只能获取一个字符串。
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String str = s.next();
int age = s.nextInt();
System.out.println(str);
System.out.println(age);
}
}
5.2 分支结构switch-case
- 若case后没有接break,则会继续执行其后的语句(后面的case不匹配也会执行)
- switch结构中的表达式,只能是如下6种数据类型之一:byte、short、char、int、枚举、String
- case之后只能声明常量,不能声明一个范围
- default是可选的,而且位置是灵活的,无论放在哪都在最后执行
- 当多个case语句处理的语句块一致时,可统一书写(没写break顺序执行的结果)
public class SwitchCaseTest {
public static void main(String[] args) {
int number = 1;
switch (number) {
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
default:
System.out.println("other");
}
}
}
5.3 循环结构
- 循环结构的分类:for、while、do-while
- 循环语句的4个要素:初始化条件、循环条件(boolean类型)、循环体、迭代条件
- 无限循环:for(;;)或while(true)
- 带标签的break和continue的使用:结束指定标签层的循环结构
public class PrimeNumberTest {
//计算100000以内质数的个数,使用带标签的continue后不用定义flag
public static void main(String[] args) {
int cnt = 0;
label: for (int i = 2; i <= 100000; i++) {
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
continue label;
}
}
cnt++;
}
System.out.println("质数的个数为" + cnt);
}
}