JAVA学习笔记—JAVA SE(一)JAVA语言基础

1. 编写Java程序的常见错误

• 错误: 需要class, interface或enum => 通常都是class关键字拼写错误

• 错误: 找不到符号 => 通常因为单词拼写错误或Java中不支持这样的单词

• 错误: 需要’;’ => 通常都是因为少写分号,加上英文版分号即可

• 错误: 非法字符: ‘\uff1b’ => 通常是因为出现了中文标点符号,修改为英文版即可

• 错误: 在类 PrintTest 中找不到 main 方法, 请将 main 方法定义为: => main写成了mian

2.变量和数据类型

2.1 变量的基本概念

• 当需要在程序中记录单个数据内容时,则声明一个变量即可,而声明变量的本质就是在内存中申请一个存储单元,由于该存储单元中的数据内容可以发生改变,因此得名为"变量"。

• 由于存放的数据内容大小不一样,导致所需存储单元的大小不一样,在Java语言中使用数据类型加以描述,为了便于下次访问还需要给该变量指定一个名字,用于记录该变量对应的存储单元。

变量的注意事项

• Java是强类型语言,变量在使用前必须声明来指明其数据类型。

• 变量在使用之前必须初始化。

• 变量不能重复声明

2.2 标识符的命名法则

• 由数字、字母、下划线以及$等组成,其中数字不能开头。

• 不能使用Java语言的关键字

• 区分大小写,长度没有限制但不宜过长。

• 尽量做到见名知意,支持中文但不推荐使用。

• 标识符可以给类/变量/属性/方法/包 起名字。

规范:变量

随使用随声名 尽可能减少重复的代码
JAVA学习笔记—JAVA SE(一)JAVA语言基础

2.3 数据类型

在Java语言中数据类型主要分为两大类:

• (1)基本数据类型 byte、short、int、long、float、double、boolean、char

• (2)引用数据类型 数组、类、接口、枚举、标注

单个字节表示的整数范围是:-2^7 ~ 2^7-1,也就是-128 ~ 127.

2.3.1 整数类型

• Java语言中描述整数数据的类型有:byte、short、int、long,荐int类型

• 其中byte类型在内存空间中占1个字节,表示范围是:-2^7 ~ 2^7-1.

• 其中short类型在内存空间中占2个字节,表示范围是:-2^15 ~ 2^15-1.

• 其中int类型在内存空间中占4个字节,表示范围是:-2^31 ~ 2^31-1.

• 其中long类型在内存空间中占8个字节,表示范围是:-2^63 ~ 2^63-1.

• 在Java程序中直接写出的整数数据叫做直接量/字面值/常量,默认为int类型。若希望表达更大的直接量,则在直接量的后面加上l或者L,推荐L。

•若描述比long类型还大的数据则使用java.math.BigInteger类型

2.3.2 浮点类型

• Java语言中用于描述小数数据的类型:float 和 double,推荐double类型

• 其中float类型在内存空间占4个字节,叫做单精度浮点数,可以表示7位

有效数字,范围:-3.403E38~3.403E38。 • 其中double类型在内存空间占8个字节,叫做双精度浮点数,可以表示15位有效数字,范围:-1.798E308~1.798E308。

• Java程序中直接写出的小数数据叫做直接量,默认为double类型,若希望表达float类型的直接量,则需要在直接量的后面加上f或者F.

float和double运算时可能会有误差,若希望实现精确运算则需借助java.math.BigDecimal类型。

2.3.3 布尔类型

• Java语言中用于描述真假信息类型有:boolean,数值只有:true 和 false。 • 布尔类型在内存空间中所占大小没有明确的规定,可以认为是1个字节。

2.3.4 字符类型

• Java语言中用于描述单个字符的数据类型:char类型。如:‘a’、'中’等。

• 其中char类型在内存空间中占2个字节并且没有符号位,表示的范围是:0 ~ 65535,由于现实生活中很少有数据能够被单个字符描述,因此以后的开发中更多的使用由多个字符串起来组成的字符串,使用String类型加以描述。

• 计算机的底层只识别0和1组成的二进制序列,对于字符’a’这样的图案来说不满足该规则,因此该数据无法直接在计算机中存储,但现实生活中存在这样的图案数据需要计算机存储,为了使得该数据能够存储起来就可以给该数据指定一个编号,然后将编号存储起来即可,该编号就叫做ASCII。

• 要求掌握的ASCII有:‘0’ - 48 ‘A’ - 65 ‘a’ - 97 空格 - 32 换行符 - 10

JAVA学习笔记—JAVA SE(一)JAVA语言基础

• Java字符类型采用Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位。

• 要求掌握的转义字符有:" - " ’ - ’ \ - \ \t - 制表符 \n - 换行符

2.3.5 基本数据类型之间的转换

• Java语言中基本数据类型之间的转换方式:自动类型转换和强制类型转换。

• 其中自动类型转换主要指从小类型到大类型之间的转换。

JAVA学习笔记—JAVA SE(一)JAVA语言基础

• 其中强制类型转换主要指从大类型到小类型之间的转换,语法格式如下:

目标类型 变量名 = (目标类型)源类型变量名;

3. 运算符

3.1 算术运算符

• + 表示加法运算符

• - 表示减法运算符

• * 表示乘法运算符

• / 表示除法运算符

• % 表示取模/取余运算符

注意事项:

1.当两个整数相除时结果只保留整数部分,丢弃小数部分。

2.若希望保留小数部分:(1)使用强制类型转换将其中一个操作数转换为double类型再运算。(2)让其中一个操作数乘以1.0即可

3.0不能作除数。Java.lang.ArithmeticException(算数异常)

3.2 字符串连接运算符

• + 可以实现字符串的连接。同时可以实现字符串与其他数据类型“相连”。

注:+ 既可以作为字符串连接符,又可以作为加法运算符。只要+两边的操作数中有一个操作数是字符串类型,则该+就被当做字符串连接符处理,否则当作加法运算符。

3.3 关系/比较运算符

• > 表示是否大于运算符 >= 表示是否大于等于运算符

• < 表示是否小于运算符 <= 表示是否小于等于运算符

• == 表示是否等于运算符 != 表示是否不等于运算符

• 所有以关系运算符作为最终运算的表达式结果一定是boolean类型。

3.4 自增减运算符

• ++ 表示自增运算符,用于使得当前变量自身的数值加1的效果

• – 表示自减运算符,用于使得当前变量自身的数值减1的效果

• 只能用于变量,常数不可以。

•i++叫表达式,i叫做变量,i++和i表示不同的含义,所占的内存空间不同。

•后++表示先让变量的数值作为整个表达式的最终结果,然后再让变量自身的数值加1;前++表示先让变量自身的数值加1,然后再让变量的数值作为整个表达式的结果。

JAVA学习笔记—JAVA SE(一)JAVA语言基础

3.5 逻辑运算符

• && 表示逻辑与运算符,相当于"并且",同真为真,一假为假。

• || 表示逻辑或运算符,相当于"或者",一真为真,同假为假。

• ! 表示逻辑非运算符,相当于"取反",真为假,假为真。

• 逻辑运算符的操作数均为boolean表达式。

逻辑运算符主要用于连接多个关系运算符作为最终运算的表达式。

3.5.1 逻辑运算符的短路特性

• 对于逻辑与运算符来说,若第一个表达式为假则结果为假,此时跳过第二个表达式;

• 对于逻辑或运算符来说,若第一个表达式为真则结果为真,此时跳过第二个表达式;

3.6 条件/三目运算符

• 条件表达式? 表达式1: 表达式2 • 判断条件表达式是否成立,若成立则执行表达式1,否则执行表达式2 。

3.7 赋值运算符

• = 表示赋值运算符,用于将=右边的数据赋值给=左边的变量,覆盖变量原来的数值。

• 赋值表达式本身也有值,其本身之值即为所赋之值。

• +=、 -=、 *=、 /=、 …

注:byte + byte 相加的结果是int类型,因为编译器优化。

解决方法:强制类型转换b1=(byte)(b1+2);在这里等价于b1 += 2;

3.8 移位运算符

• << 左移运算符,用于将数据的二进制位向左移动,右边使用0补充

• >> 右移运算符,用于将数据的二进制位向右移动,左边使用符号位补充

• >>> 表示逻辑右移运算符,用于将数据的二进制位向右移动,左边使用0补充。

左移1位相等于当前整数的数值2,左移2位相等于当前整数的数值4;

右移1位相等于当前整数的数值/2,右移2位相等于当前整数的数值/4;

3.9 位运算符

• & 表示按位与运算符,按照二进制位进行与运算,同1为1,一0为0.

• | 表示按位或运算符,按照二进制位进行或运算,一1为1,同0为0.

• ~ 表示按位取反运算符,按照二进制位进行取反,1为0,0为1.

• ^ 表示按位异或运算符,按照二进制位进行异或运算,同为0,不同为1.

3.10运算符的优先级

• ()的优先级极高。 • =的优先级极低。

• 若无法确认优先级,则使用()来确保即可。

4. 流程控制语句

4.1 分支结构

• 当需要进行条件判断并做出选择时,使用分支结构。

4.1.1 if分支结构

• if(条件表达式) {

语句块; }

• 判断条件表达式是否成立

=> 若成立,则执行语句块;

=> 若不成立,则跳过语句块;

4.1.2 if else分支结构

• if(条件表达式) {

语句块1;

} else {

语句块2;

}

• 判断条件表达式是否成立

=> 若成立,则执行语句块1;

=> 若不成立,则执行语句块2;

4.1.3 if else if else分支结构

• if(条件表达式1) {

语句块1; }

else if(条件表达式2) {

语句块2; }

else {

语句块n; }

• 判断条件表达式1是否成立

=> 若成立,则执行语句块1;

=> 若不成立,则判断条件表达式2是否成立

=> 若成立,则执行语句块2;

=> 若不成立,则执行语句块n;

4.1.4 switch case分支结构

• switch(变量/表达式) {

case 字面值1: 语句块1; break;

case 字面值2: 语句块2; break;

default:语句块n;

}

• 计算变量/表达式的数值 => 判断是否匹配字面值1

=> 若匹配,则执行语句块1 => 执行break跳出当前结构

=> 若不匹配,则判断是否匹配字面值2

=> 若匹配,则执行语句块2 => 执行break跳出当前结构

=> 若不匹配,则执行语句块n

• switch()中支持的数据类型有:byte、short、char以及int类型,从jdk1.5开始支持枚举类型,从jdk1.7开始支持String类型。

4.2 循环结构

循环结构的概念

• 在Java程序中若希望重复执行一段代码时,就需要使用循环结构。 • 任何复杂的程序逻辑都可以通过顺序、分支、循环三种程序结构实现。

4.2.1 for循环

• for(初始化表达式; 条件表达式; 修改初始值表达式) {

循环体;

}

• 执行初始化表达式 => 判断条件表达式是否成立

=> 成立则执行循环体 => 修改初始值表达式 => 判断条件是否成立

=> 若不成立,则循环结束

continue关键字

• continue语句用在循环体中,用于结束本次循环而开始下一次循环。

break关键字

• break用于退出当前语句块,break用在循环体中用于退出循环。

• for(;???? - 这种没有循环条件的循环叫做 无限循环,俗称“死循环”。

4.2.2 双重for循环

• for(初始化表达式1; 条件表达式2; 修改初始值表达式3) {

for(初始化表达式4; 条件表达式5; 修改初始值表达式6) {

循环体;

}

}

• 执行表达式1 => 判断表达式2是否成立

=> 若成立,则执行表达式4 => 判断表达式5是否成立

=> 若成立,则执行循环体 => 执行表达式6 => 表达式5是否成立

=> 若不成立,则内层循环结束 => 表达式3 => 表达式2是否成立

=> 若不成立,则外层循环结束

• 外层循环用于控制打印的行数,内层循环用于控制打印的列数,外层循环改一下,内层循环从头到尾跑一圈。

• 在以后的开发中若需要打印多行多列时,需要使用双重循环。

• 多重循环不宜嵌套太多层,否则效率很低。一般到三重循环即可,最常见的就是双重循环。

break关键字跳出多层循环

• 在嵌套的循环结构中,break用于退出所在循环体。

• 如果要退出外层循环体,需要使用标号的方式。

outer: for (…) {

for(…) {

break outer;

}

}

4.2.3 while循环

• while(条件表达式) {

循环体; } • 判断条件表达式是否成立

=> 若成立,则执行循环体 => 判断条件表达式是否成立

=> 若不成立,则循环结束

while循环和for循环比较

• while循环和for循环完全可以互换,当然推荐使用for循环。

• while循环更适合于明确循环条件但不明确循环次数的场合中。

• for循环更适合于明确循环次数或范围的场合中。

• while(true) 等价于 for(;???? 都表示无限循环。

4.2.4 do while循环

• do {

循环体;

} while(条件表达式);

• 执行循环体 => 判断条件表达式是否成立

=> 若成立,则执行循环体 => 判断条件表达式是否成立

=> 若不成立,则循环结束

• do-while循环主要用于至少执行一次循环体的场合中。

5. 数组的概念和应用

5.1 一维数组

5.1.1 一维数组的概念

• 当需要在Java程序中记录单个数据内容时,则声明一个变量即可。

• 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数组即可,一维数组本质上就是在内存空间中申请一段连续的存储单元。

• 数组是相同数据类型的多个元素的容器,元素按线性顺序排列,在Java语言中体现为一种引用数据类型。

5.1.2 一维数组的声明方式

• 数据类型[] 数组名称 = new 数据类型[数组的长度];

• 调用数组的length属性可以获取数组的长度:

• 可以通过下标的方式访问数组中的每一个元素。需要注意的是:数组的下标从0开始,对于长度为n的数组,下标的范围是0~n-1。

5.1.3 一维数组的初始化

• 基本类型的数组(数据元素为基本类型)创建后,其元素的初始值:byte、short、char、int、long为0;float和double为0.0;boolean为false。

• 可以在数组声明的同时进行初始化,具体如下:数据类型[] 数组名称 = {初始值1, 初始值2, …};

5.1.4 内存结构

• 栈用于存放程序运行过程当中所有的局部变量。一个运行的Java程序从开始到结束会有多次变量的声明。

• JVM会在其内存空间中开辟一个称为“堆”的存储空间,这部分空间用于存储使用new关键字创建的数组和对象。

JAVA学习笔记—JAVA SE(一)JAVA语言基础

5.1.5 数组的优缺点

• 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快。

• 数组要求所有元素的类型相同。

• 数组要求内存空间连续,并且长度一旦确定就不能修改。 • 增加和删除元素时可能移动大量元素,效率低。

注:Java官方提供的拷贝功能:System.arraycopy(arr, 1, brr, 0, 3);

表示将数组arr中下标从1开始的3个元素拷贝到数组brr中下标从0开始的位置。

变长数组:变量可以作为数组的长度。 Int num = 10; int[] arr = new int[num];

5.1.6 数组工具类的概念

• java.util.Arrays类可以实现对数组中元素的遍历、查找、排序等操作。

• 常用方法如下:

static String toString(int[] a) 输出数组中的内容

static void fill(int[] a, int val) 将参数指定元素赋值给数组中所有元素

static boolean equals(boolean[] a,

boolean[] a2) 判断两个数组元素内容和次序是否相同

static void sort(int[] a) 对数组中的元素进行从小到大排序

static int binarySearch(int[] a, int key) 从数组中查找参数指定元素所在的位置

5.2 二维数组

5.2.1 二维数组的概念

• 二维数组本质上就是由多个一维数组摞在一起组成的数组,二维数组中

的每个元素都是一维数组,而一维数组中的每个元素才是数据内容。

5.2.2 二维数组的声明和初始化方式

• 数据类型[][] 数组名称 = new 数据类型[行数][列数];

• 数据类型[][] 数组名称 = {{元素1, 元素2,…}, …};

JAVA学习笔记—JAVA SE(一)JAVA语言基础