第二章:JAVA基本语法
关键字与保留字
关键字的定义和特点:
- 定义:被Java语言赋予了特殊含义,用作专门用途的字符串
- 特点:关键字中的所有字母都为小写。
Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。
标识符
- Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符
- 定义合法标识符的规则:
- 由26个字母大小写,0-9,_或$组成
- 不可以用数字开头
- 不可以使用关键字与保留字,但可以包含
- Java中严格区分大小写,长度无限制
- 标识符不能包含空格
- Java中的名称命名规范:
- 包名:多单词组成时所有字母都小写:
xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:
XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:
xxxYyyZzz
(驼峰命名法) - 常量名:所有字母都大写,多单词时每个单词用下划线连接:
XXX_YYY_ZZZ
- 包名:多单词组成时所有字母都小写:
变量
- 变量的概念:
- 内存中的一个存储区域
- 该区域有自己的名称(变量名)和类型(数据类型)
- Java中每个变量必须先声明,后使用
- 该区域的数据可以在同一类型范围内不断变化
- 使用变量注意:
- 变量的作用域,在一对
{}
之间有效 - 初始化值
- 变量的作用域,在一对
- 定义变量的格式:
数据类型 变量名 = 初始化值
- 变量是通过变量名来访问这块区域的
- 变量的分类
- Java的整型常量默认为int型,声明long类型时,值的后面需要加上字母l或L:
long L = 3L;
- Java的浮点型常量默认为double型,声明float类型时,值的后面需要加上字母f或F
- Boolean类型只允许取值true和false,无null,且不可以用0或非0的整数来替代false和true
- 引用类型:String类
- 值null可以赋值给任何引用类型(类、接口、数组)的变量,用以表示这个引用类型变量中保存的地址为空
- String类属于引用类型,可以用null赋值
- String类是一个典型的不可变类,String对象创建出来就不可能被改变。创建出的字符串将存放在数据区,保证每个字符串常量只有一个,不会产生多个副本。
String s0 = "hello"; String s1 = "hello"; String s2 = "hel"+"leo"; // 此时,s0、s1、s2均指向“hello"的存放地址,而不会产生多个“hello”
类型 占用存储空间 表数范围 类型 占用存储空间 表数范围 byte 1字节=8bit -128 ~ 127 short 2字节 -215 ~ 215-1 int 4字节 -231 ~ 231-1 long 8字节 -263 ~ 263-1 单精度float 4字节 -2128 ~ 2128
7位有效数字双精度double 8字节 -21024 ~ 21024
16位有效数字 - Java的整型常量默认为int型,声明long类型时,值的后面需要加上字母l或L:
- 基本数据类型转换
- 自动类型转换:容量小的类型自动转换为容量大的数据类型
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
- byte、short、char之间不会相互转换,他们三者在计算时首先转换为int类型
- 当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型,
String str0 = 1+2+"a"+3+4;
的打印结果为3a34
运算符
- 算术运算符:
+
-
*
/
%
++
--
- 赋值运算符:
=
- 当
=
两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。 - 支持连续赋值
i0 = i1 = i2 = 1;
- 扩展赋值运算符:
+=
-=
*=
/=
%=
,字符串仅支持+=
short s = 2; s = s + 3; //会报错,更改为 s = (short)(s+3) 后可以运行 s += 3; //会自动把结果强制转换为当前变量的类型
- 当
- 比较运算符:
==
!=
<
>
<=
>=
- 逻辑运算符:
&
|
!
&&
||
^
&&
(短路与):使用&
时,左边无论真假,右边始终参与运算,而使用&&
时,若左边为假,则右边不参与运算||
(短路或):使用|
时,左边无论真假,右边始终参与运算,而使用||
时,若左边为真,则右边不参与运算- 在不需要逻辑运算两边都参与运算时,尽量使用
&&
和||
a | b | a&b | a|b | !a | a^b | a&&b | a||b |
---|---|---|---|---|---|---|---|
true | true | true | true | false | false | true | true |
true | false | false | true | false | true | false | true |
false | true | false | true | true | true | false | true |
false | false | false | false | true | false | false | false |
- 位运算符:直接对二进制进行运算
- 无符号右移时,左侧补0,而正常的负数右移时左侧应该补1
-32>>2=-8,-32>>>2=1073741816
- 正数二进制 → 反码 → 加1(补码) → 负数二进制
- 无符号右移时,左侧补0,而正常的负数右移时左侧应该补1
运算符 | 运算 | 范例 |
---|---|---|
<< |
左移 | 3<<2=12 → 3*2*2=12 , m<<n -> m*2^n |
>> |
右移 | 3>>1=1 → 3/2=1 , m>>n -> m*2^-n |
>>> |
无符号右移 | 3>>>1=1 → 3/2=1 |
& |
与运算 | 6 & 3 = 2 → 0110 & 0011 = 0010 |
| |
或运算 | 6 | 3 = 7 → 0110 | 0011 = 0111 |
^ |
异或运算 | 6 ^ 3 = 5 → 0110 ^ 0011 = 0101 |
~ |
反码 | ~6 = -7 → ~0110 = 1001 |
- 三元(目)运算符:
(条件表达式)? 表达式1 : 表达式2
数组
- 一维数组:
type var[];
或者type[] var;
- 动态初始化:
int[] arr = new int[3];
arr[0]=0;arr[1]=1;arr[2]=2;
- 静态初始化:
int[] arr = {0,1,2};
或int a[] = new int[] {0,1,2};
arr.length
得到数组的长度- 使用动态初始化时,数组元素会有默认值,数字类型为0,对象类型为null
- 动态初始化:
- 多维数组:
- 动态初始化:
int[][] arr = new int[3][2];
或int[][] arr = new int[3][];
,再分别初始化arr[0]
array[1]
array[2]
- 静态初始化:
int[][] arr = new int[][]{ {1,2},{3,4,5} };
- 注意,
int[] x,y[];
中,x为一维数组,y为二维数组
- 动态初始化:
程序流程控制
- 顺序结构:程序从上到下逐行地执行,中间没有任何判断和跳转
- 分支结构:根据条件,选择性地执行某段代码
- if-else语句的三种格式
if(条件表达式){ 执行代码块; }
if(条件表达式){ 执行代码块; } else{ 执行代码块; }
if(条件表达式){ 执行代码块; } else if(条件表达式){ 执行代码块; } ······ else{ 执行代码块; }
- switch语句:变量仅支持
byte
short
char
int
String
和枚举switch(变量){ case 常量1:{ 语句1; break; } case 常量2:{ 语句2; break; } ······ default:{ 语句; break; } }
- if-else语句的三种格式
- 循环结构:根据循环条件,重复性的执行某段代码
- 循环语句的四个组成部分
- 初始化部分:init_statement
- 循环条件部分:test_exp
- 循环体部分:body_statement
- 迭代部分:alter_statement
- 循环语句的分类
- for循环
for(int i=0 ; i<10 ; i++) { System.out.println(i); }
- while循环
while(i<100){ resulr += i; i++; }
- do-while循环
do{ resulr += i; i++; }while(i<100);
- for循环
- 嵌套循环时,尽量保证外层循环次数小于内层循环次数
- 循环语句的四个组成部分
- 特殊流程控制语句:
break
continue
return