1. 保留字和关键字
关键字:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:都是小写
用于定义数据类型的关键字 | ||||
---|---|---|---|---|
class | interface | enum | byte | short |
int | long | 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 |
保留字
现有Java版本尚未使用, 但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字goto
、 const
、_
(在Java9中被用作保留字,以后可能会使用)
2. 标识符
标识符:Java 对各种变量、 方法和类等要素命名时使用的字符序列称为标识符技巧:凡是自己可以起名字的地方都叫标识符。
定义合法标识符规则:
1. Unicode字符集中的任意字母和数字, _或 $ 组成
2. 数字不可以开头。
3. 不可以使用关键字和保留字,但能包含关键字和保留字。
4. Java中严格区分大小写,长度无限制。
5. 标识符不能包含空格。
不符合标识符规则的命名,编译时不通过
public class IdentifierTest{
public static void main(String args[]){
System.out.println("Hello, zdkk");
}
}
class hello1_${
}
/*
class 1hello{
}
*/
/*
class int{
}
*/
class Myint{
}
class myint{
}
class My111111111111111111111111111111111111111111111111111111{
}
class My Int{
}
Java中的名称命名规范:
包名:多单词组成时所有字母都小写: xxxyyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写: XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个
单词首字母大写: xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接: XXX_YYY_ZZZ
注意1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。 注意2: java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。
3. 字面量与基本数据类型
字面量
直接出现在Java源码中的值,包括整数,浮点数,字符,字符串,以及保留字true, false, null
变量的概念:
内存中的一个存储区域
该区域的数据可以在同一类型范围内不断变化
变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值
变量的作用:
用于在内存中保存数据
使用变量注意:
Java中每个变量必须先声明,后使用
使用变量名来访问这块区域的数据
变量的作用域:其定义所在的一对{ }内
变量只有在其作用域内才有效
同一个作用域内,不能定义重名的变量
变量的使用:
- 声明变量
数据类型 变量名
int num
- 变量赋值
变量名= 值
num = 19
- 声明+赋值
变量分类
变量按数据类型分类 :
Java中的基本数据类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或操作系统的改变而改变。
整型
类 型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节=8bit位 | -128 ~ 127 |
short | 2字节 | -215 ~215-1 |
int | 4字节 | -231 ~ 231-1 (约21亿) |
long | 8字节 | -263 ~ 263-1(约9*1018) |
所有整型都表示有符号的数字,Java中没有类似C/C++中的unsigned关键字 java的整型常量默认为 int 型,声明long型常量须后加‘l’或‘L’ java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long bit: 计算机中的最小存储单位。 byte:计算机中基本存储单元。
浮点型
与整数类型类似, Java 浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。
类 型 | 占用存储空间 | 表数范围 |
---|---|---|
单精度float | 4字节 | -3.403E38 ~ 3.403E38 |
双精度double | 8字节 | -1.798E308 ~ 1.798E308 |
浮点型常量有两种表示形式:
十进制数形式:如: 5.12 512.0f .512 (必须有小数点)
科学计数法形式:如: 5.12e2 512E2 100E-2 也可以是十六进制科学计数法:0.125可以表示为0x1.0p-3
float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。
double:双精度,尾数可以精确到16位有效数字。默认采用此类型。
Java 的浮点型常量默认为double型, 声明float型常量,须后加‘f’或‘F’。
字符型
char 型数据用来表示通常意义上“字符”(2字节无符号数)
Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
取值范围:\u0000~\uffff
字符型字面量的三种表现形式:
- 字符常量是用单引号
''
括起来的单个字符。 - Java中还允许使用转义字符
\
来将其后的字符转变为特殊字符型常量。 - 直接使用 Unicode 值来表示字符型常量:
\uxxxx
。其中XXXX代表一个十六进制整数。
char类型是可以进行运算的。因为它都对应有Unicode码。char c1 = 'a';
char c2 = '中';
char c3 = '9';
char c4 = '\n';
char c5 = '\u000a';
\b | 退格键 |
---|---|
\t | 制表位 |
\n | 换行符 |
\f | 换页符 |
\r | 回车符 |
\“ | 双引号 |
\‘ | 单引号 |
\\ | 反斜线 |
\xxx | xxx编码的Latin-1字符,其中xxx是八进制数,介于000-377之间。 |
\uxxxx | xxxx编码的Unicode字符,其中xxxx是四个十六进制数。Unicode转义序列可以出现在Java程序的任何位置,不局限在字符和字符串字面量中。 |
boolean类型
用来判断逻辑条件,一般用于程序流程控制:
- if条件控制语句;
- while循环控制语句;
- do-while循环控制语句;
- for循环控制语句;
必须明确给出条件语句!
boolean类型数据只允许取值true和false,无null。
不可以使用0或非 0 的整数替代false和true,这点和C语言不同。
Java虚拟机中没有任何供boolean值专用的字节码指令, Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替: true用1表示, false用0表示。 ———《java虚拟机规范 8版》
boolean类型到底占多少字节
按照声明的位置分类
在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。
二者在初始化值方面的异同:
同: 都有生命周期 异: 局部变量除形参外,需显式初始化。
类型转换
基本类型转换
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
boolean类型不能与其它数据类型运算。
基本类型与字符串类型转换
当把任何基本数据类型的值和字符串(String)进行连接运算时(+), 基本数据类型的值将自动转化为字符串(String)类型。
强制类型转换
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符: ()
, 但可能造成精度降低或溢出,格外要注意。
通常,字符串不能直接转换为基本类型,基本类型也不能之间转换成字符型, 但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
String str = "123";
int num = Integer.parseInt(a);
进制
所有数字在计算机底层都以二进制形式存在。
对于整数,有四种字面量表示方式:
二进制(binary): 0,1 ,满2进1.以0b或0B开头。
十进制(decimal): 0-9 ,满10进1。
八进制(octal): 0-7 ,满8进1. 以数字0开头表示。
十六进制(hex): 0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。
在任何数字字面量中,可以使用下划线,提升可读性。 严格来说,负号是作用在字面量上的运算符,而不是字面量的一部分。
4. 运算符
算术运算符
运算符 | 运算 | 范例 | 结果 | 是否会发生数据类型转换 |
---|---|---|---|---|
+ | 正号 | +3 | 3 | 会 |
- | 负号 | b=4; -b | -4 | 会 |
+ | 加 | 5+5 | 10 | 会 |
- | 减 | 6-4 | 2 | 会 |
* | 乘 | 3*4 | 12 | 会 |
/ | 除 | 5/5 | 1 | 会 |
% | 取模(取余) | 7%5 | 2 | 会 |
++ ++ |
自增(前):先运算后取值 自增(后):先取值后运算 |
a=2;b=++a; a=2;b=a++; |
a=3;b=3 a=3;b=2 |
否 |
- - - - |
自减(前):先运算后取值 自减(后):先取值后运算 |
a=2;b=- -a a=2;b=a- - |
a=1;b=1 a=1;b=2 |
否 |
+ | 字符串连接 | “He” + “llo” | “Hello” | 会,都转成字符串 |
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 如果对负数取模,可以把模数负号忽略不记,如: 5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。 自增运算不会改变变量本身的数据类型
赋值运算符
符号: =
当“=”两侧数据类型不一致时, 可以使用自动类型转换或使用强制类型转换原则进行处理。
支持连续赋值。 从右往左
扩展赋值运算符: +=, -=, *=, /=, %= 不会改变数据类型(可以看成是强制类型转换)
class PracticeTest2{
public static void main(String args[]){
short s = 3;
//s = s + 2; //错误: 不兼容的类型: 从int转换到short可能会有损失
s += 2; //这样是可以的
s++; //这样也是可以的
System.out.println(s); //6
int m = 2;
int n = 3;
n *= m++;
System.out.println("n="+n); //n=6 注意是6不是9
System.out.println("m="+m); //m=3
int i = 1;
i *= 0.1;
System.out.println("i="+i);//i=0
i++;
System.out.println("i="+i);//i=1
int number = 10;
number += (number++) + (++number);
System.out.println("number="+number);//number=32
}
}
比较运算符(关系运算符)
含自动类型转换
运算符 | 运算 范例 结果 |
---|---|
== | 相等于 4==3 false |
!= | 不等于 4!=3 true |
< | 小于 4<3 false |
> | 大于 4>3 true |
<= | 小于等于 4<=3 false |
>= | 大于等于 4>=3 true |
instanceof | 检查是否是类的对象 “Hello” instanceof String true |
比较运算符的结果都是boolean型,也就是要么是true,要么是false。
比较运算符“==”不能误写成“=” 。
比较运算符也有自动类型转换> < >= <=
只能用于数值之间的比较== !=
也能用于引用数据类型之间的比较,前提是两者满足子父类关系
逻辑运算符4个
&—逻辑与 | —逻辑或 ! —逻辑非
&& —短路与 || —短路或 ^ —逻辑异或
“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
位运算符7个
仅限于整型之间,含自动类型转换
当然与,或,异或运算符除外,既能进行逻辑运算,也能进行位运算
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 | 3 << 2 = 12 —> 322=12 |
>> | 右移 | 3 >> 1 = 1 —> 3/2=1 |
>>> | 无符号右移 | 3 >>> 1 = 1 —> 3/2=1 |
& | 与运算 | 6 & 3 = 2 |
| | 或运算 | 6 | 3 = 7 |
^ | 异或运算 | 6 ^ 3 = 5 |
~ | 取反运算 | ~6 = -7 |
<< | 空位补0,被移除的高位丢弃,空缺位补0。 |
---|---|
>> | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 |
>>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
| | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; |
^ | 相同二进制位进行 ^ 运算,结果是0; 1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1 |
~ | 正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反 |
三元运算符
格式:(条件表达式)?表达式1: 表达式2;
条件表达式为true, 运算后的结果是表达式1;为false, 运算后的结果是表达式2;
表达式1和表达式2为同种类型或者说统一为一种类型
可嵌套
能用三元的都能用if-else,能用if-else的不一定能用三元。但是能用三元尽量用三元
优先级
c运算符优先级
5. 程序流程控制
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
顺序结构
分支结构
if—-else
就近原则
三种格式
if(条件表达式){
执行代码块;
}
if(条件表达式){
执行代码块1;
}
else{
执行代码块2;
}
if(条件表达式1){
执行代码块1;
}
else if (条件表达式2){
执行代码块2;
}
……
else{
执行代码块n;
}
多选1,一旦某个条件满足,后续就不会执行
switch—-case
格式:
switch(表达式){
case 常量1:
语句1;
// break;
case 常量2:
语句2;
// break;
… …
case 常量N:
语句N;
// break;
default:
语句;
// break;
}
switch(表达式)中表达式的值必须是下述几种类型之一: byte, short,char, int, 枚举 (jdk 5.0), String (jdk 7.0); case子句中的值必须是常量,不能是变量名或不确定的表达式值;
同一个switch语句,所有case子句中的常量值互不相同; 即标签不能重复
if和switch语句很像,具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而且符合byte、 short 、 char、 int、 String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if, if的使用范围更广。也就是说, 使用switch-case的,都可以改写为if-else。反之不成立。
循环结构
根据循环条件,重复性的执行某段代码。
循环语句的四个组成部分
- 初始化部分(init_statement)
- 循环条件部分(test_exp)
- 循环体部分(body_statement)
- 迭代部分(alter_statement)
while
格式:①初始化部分
while(②循环条件部分){
③循环体部分;
④迭代部分;
}
do—while
格式:①初始化部分;
do{
③循环体部分
④迭代部分
}while(②循环条件部分);
for
格式:for (①初始化部分; ②循环条件部分; ④迭代部分){
③循环体部分;
}
②循环条件部分为boolean类型表达式,当值为false时,退出循环
①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
④可以有多个变量更新,用逗号分隔
foreach(JDK1.5)
break与continue
break语句用于终止某个语句块的执行
{
……
break;
……
}
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ……
label2: { ……
label3: {
……
break label2;
……
}
}
}
continue 语句
continue只能使用在循环结构中
continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
总结
break只能用于switch语句和循环语句中。
continue 只能用于循环语句中。
二者功能类似,但continue是终止本次循环, break是终止本层循环。
break、 continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
很多语言都有goto语句, goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。 Java中的break和continue是不同于goto的。