关键字与保留字
关键字
abstract | continue | for | new | switch |
---|---|---|---|---|
assert *** | default | goto | package | synchronized |
boolean | do | if | private | this |
break | double | implements | protected | throw |
byte | else | import | public | throws |
case | enum | instanceof | return | transient |
catch | extends | int | short | try |
char | final | interface | static | void |
class | finally | long | strictfp ** | volatile |
const | float | native | super | while |
保留字
const
goto
标识符
Java 对各种变量、方法和类等要素命名时使用的字符序列称为 标识符
标识符定义规则
- 由字母、数字、_或$组成
- 数字不可以开头
- Java 中严格区分大小写,长度无限制
- 标识符不能包含空格
- 不可以使用关键字和保留字,但能包含它们
命名规范
- 包名:所有字母都小写:xxxyyyzzz
- 类名、接口名:首字母大写:XxxYyyZzz
- 变量名、方法名:第一个小写,后面单词首字母大写:xxxYyyZzz
- 常量名:所有字母都大写:XXX_YYY_ZZZ
注:起名尽量见名知意
变量
变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值
- 声明变量
- 语法:<数据类型> <变量名称>
- 例如:int i
- 变量的赋值
- 语法:<变量名称> = <值>
- 例如:var = 10;
- 声明和赋值变量
- 语法:<数据类型> <变量名> = <初始化值>
- 例如:int var = 10;
变量的分类 - 按数据类型
变量的分类 - 按声明的位置不同
- 在方法体外,类体内声明的变量成为成员变量
- 方法体内部声明的变量成为局部变量
相同点:都有声明周期
不同点:局部变量除形参外,需显式初始化
整数类型
byte
占用1字节,-128 ~ 127
short
2字节,-2^15 ~ 2^15 -1
int
4字节,-2^31 ~ 2^31-1(约21亿)
long
8字节,-2^63 ~ 2^63-1
注:Java的整型常量默认为int型,声明long型需在后加l
或L
浮点类型
float
4字节,-3.403E38 ~ 3.403E38
double
8字节,-1.798E308 ~ 1.798E308
注:Java的浮点数常量默认是double型,声明float型,需在后加f
或F
字符类型
char
2字节,Java中所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或者其他书面语的一个字符。
表现方式:
- 用单引号括起来的就是一个字符,例如:char c1 = ‘a’;
- 特殊字符常量,例如:char c2 = ‘\n’;
- 直接使用Unicode值来表示字符,例如:char c3 = ‘\u545a’;
char类型是可以进行运算的。因为它都对应有Unicode码值。
布尔类型
boolean用来判断逻辑条件,一般用于流程控制
- if语句
- while语句
- do-while语句
- for语句
boolean类型只允许取值true或false,无null,不可以使用0或非0代替false或true
基本数据类型转换
自动类型转换:容量小的类型自动转换为容量大的数据类型。容量大小排序如下
byte,short,char - int - long - float - double
- byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
- boolean类型不能与其他数据类型运算
- 任何基本数据类型的值和字符串进行连接运算时(+),基本数据类型的值将自动转化为字符串类型
long l1 = 123L;
float f1 = .23f;
float f2 = f1 + l1;
//long l2 = f1 + l1;// 编译报错
字符串类型 String
-
String 不是基本数据类型,属于引用数据类型
-
使用方式:String str = “abcd”;
强制类型转换
- 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时加上强制转换符:(), 但可能造成精度降低或溢出,格外注意。
- 字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可
以实现把字符串转换成基本类型
String a = "43";
int i = Integer.parseInt(a);
boolean类型不可以转换为其他的数据类型
进制
关于进制
- 所有数字再计算机底层都是以二进制存在的。
- 整数有4种表达方式
- 二进制(binary): 0,1, 以0b或0B开头。
- 十进制(decimal): 0-9
- 八进制(octal):0-7 ,以0开头表示。
- 十六进制(hex): 0-9及A-F,以0x或0X开头
二进制
Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;
当是long类型时,二进制默认占64位,第64位是符号位
二进制的整数有如下三种形式:
- 原码:直接将一个数值换成二进制数。最高位是符号位
- 负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
- 负数的补码:其反码加1。
计算机以二进制补码的形式保存所有的整数。
- 正数的原码、反码、补码都相同
- 负数的补码是其反码+1
为什么要使用补码存储呢?
计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂! 于是
人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正
数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有
减法, 这样计算机运算的设计就更简单了。
1个字节表示的数字范围为-128~127,为什么会有-128呢,因为+0和-0都表示0,重复了,于是就将-0用来表示-128了。
进制间的转化
10 <=> 2,2 <=> 8,2 <=> 16,10 <=> 8,10 <=> 16
运算符
- 算数运算符 + - * /
- 赋值运算符 =
- 比较运算符 > <
- 逻辑运算符 && ||
- 位运算符 >
- 三元运算符 A?B:C
算术运算符
- 如果对负数取模,可以把负号忽略,如:5%-2=1。但被模数是负数则不可忽略。此外取模运算结果不一定为整数。
- "+"除了字符串相加功能外,还能把非字符串转换为字符串,如:sout(“5+5=” + 5+5);//打印结果是5+5=55
赋值运算符
- 符号:=
- 当"="两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理
- 支持连续赋值 int x = 10 = b;
- 扩展赋值运算符:+=,-=,*=,/=,%=
思考: +和+=有什么区别?都是用来计算两个数的和,+计算后会产生一个新值,+=计算后直接赋值给之前的参数。
char a = 1;
a = a + 1;//编译报错,因为整数运算默认是返回int类型
a += 1;//正常运行,因为+=会在运算后强制转换类型赋值到a上去
比较运算符
-
比较运算符的结果都是true/false
-
区别好=和==
boolean b1 = false;
if(b1 == true) {
sout("结果为真");
} else {
sout("结果为假");//输出这个
}
if(b1 = true) {
sout("结果为真");//输出这个
} else {
sout("结果为假");
}
逻辑运算符
& 逻辑与 | 逻辑或 ! 逻辑非
&&短路与 ||短路或 ^逻辑异或
异或就是两个不一样就为真,否则为假
- & 和 &&的区别
- 单&,左边无论真假,右边都要运算
- 双&,左边为假,就不在运算右边
// 面试题
class Test{
public static void main(String[] args){
boolean x = true;
boolean y = false;
short z = 42;
if((z++==42)&&(y=true))z++;
if((z=false)||(++z==45))z++;
System.out.println("z="+z);// 46
}
}
位运算符
-
位运算符是直接对整数的二进制进行的运算
-
没有<<<运算符
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 | 3<<2=12 -> 3*2*2=12 |
>> | 右移 | 3>>1=1 -> 3/2=1 |
>>> | 无符号右移 | 3 >>> 1 = 1 --> 3/2=1 |
& | 与 | 6 & 3 = 2 |
| | 或 | 6 | 3 = 7 |
^ | 异或 | 6 ^ 3 = 5 |
~ | 取反 | ~6 = -7 |
三元运算符
- 格式:(条件表达式)?表达式1:表达式2
- 表达式1和表达式2为同种类型
- 三元运算符与if-else的联系与区别
- 三元运算符可简化if-else语句
- 三元运算符要求必须返回一个结果
- if后的代码块可有多个语句
// 获取两个数中的最大数
int num1 = 10;
int num2 = 20;
int max = num1 > num2 ? num1 : num2;
// 获取三个数中的最大数
int num1 = 10;
int num2 = 20;
int num3 = 30;
int max = num1 > num2 ? num1 > num3 ? num1:num3 :num2 > num3 ? num2:num3;