1. 数据类型
1.1分类
Java的数据类型分为两大类:
- 基本数据类型:包括 整数 、 浮点数 、 字符 、 布尔 。
- 引用数据类型:包括 类 、 数组 、 接口 。
1.2基本数据类型
四类八种基本数据类型:
| 数据类型 | 关键字 | 内存占用 | 取值范围 | 默认值 | |
|---|---|---|---|---|---|
| 字节型 | byte | 1个字节 | -128-127 | 0 | |
| 短整型 | short | 2个字节 | -32768~32767 | 0 | |
| 整型 | int(默认) | 4个字节 | -2的31次方~2的31次方-1 | 0 | |
| 长整型 | long | 8个字节 | -2的63次方~2的63次方-1 | 0L | 超过int范围的必须加L或l(小写L) |
| 单精度浮点数 | float | 4个字节 | 1.4013E-45~3.4028E+38 | 0.0f | 要表示float类型,必须加F或f |
| 双精度浮点数 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 | 0.0d | 不加F,就是double类型。 |
| 字符型 | char | 2个字节 | 0-65535 | ‘\u0000’ | char常量值,必须使用单引号 |
| 布尔类型 | boolean | 1个字节 | true,false | false |
Java中的默认类型:整数类型是 int 、浮点类型是 double 。
1.2.1进制表示
八进制:以0开头,包括0-7的数字
如:037,056
十六进制表示:以0x或0X开头,包括0-9的数字,及字母a-f,A-F
如:0x12,0xabcf,0XABCFF
2.常量
2.1 常量概述
2.2 常量分类
| 类型 | 含义 | 数据举例 |
|---|---|---|
| 整数常量 | 所有的整数 | 0,1, 567, -9 |
| 小数常量 | 所有的小数 | 0.0,-0.1,2.55 |
| 字符常量 | 单引号引起来,只能写一个字符,必须有内容 | ‘a’ , ‘ ‘, ‘好 |
| 字符串常量 | 双引号引起来,可以写多个字符,也可以不写 | “A” ,”Hello” ,”你好” ,”” |
| 布尔常量 | 只有两个值(流程控制中讲解) | true,false |
| 空常量 | 只有一个值(引用数据类型中讲解) | null |
public class ConstantDemo {public static void main(String[] args) {//输出整数常量System.out.println(123);//输出小数常量System.out.println(0.125);//输出字符常量System.out.println('A');//输出布尔常量System.out.println(true);//输出字符串常量System.out.println("你好Java");}}
3. 变量
3.1 变量概述
变量:常量是固定不变的数据,那么在程序中可以变化的量称为变量。
数学中,可以使用字母代替数字运算,例如 x=1+5 或者 6=x+5。
程序中,可以使用字母保存数字的方式进行运算,提高计算能力,可以解决更多的问题。比如x保存5,x也可 以保存6,这样x保存的数据是可以改变的,也就是我们所讲解的变量。
Java中要求一个变量每次只能保存一个数据,必须要明确保存的数据类型。
3.2 变量的定义
变量定义的格式包括三个要素: 数据类型 、 变量名 、 数据值 。
public class Variable {public static void main(String[] args) {//定义字节型变量byte b = 100;System.out.println(b);//定义短整型变量short s = 1000;System.out.println(s);//定义整型变量int i = 123456;System.out.println(i);//定义长整型变量long l = 12345678900L;//整型字面值默认情况下是int类型,如果表示长整型则在末尾加L或lSystem.out.println(l);//定义单精度浮点型变量float f = 5.5F;//如表示float类型,则需要在字面值后加f或FSystem.out.println(f);//定义双精度浮点型变量double d = 8.5;//浮点型字面值默认情况下表示double类型,也可以在值后加d或DSystem.out.println(d);//定义布尔型变量boolean bool = false;System.out.println(bool);//定义字符型变量char c = 'A';System.out.println(c);}}
3.3 最终变量
最终变量习惯上也称为常量,因为它是通过在声明变量的数据类型前面加final的方式实现的,所以叫最终变量。加final修饰后,这个变量的值就不能修改了,一开始赋值多少,就是多少,所以此时的变量名通常称为常量名。常量名通常所有字母都大写,每一个单词之间使用下划线分割,从命名上和变量名区分开来。
这样做的好处,就是可以见名知意,便于维护。
public class FinalVariableDemo {
public static void main(String[] args){
//定义常量
final int FULL_MARK = 100;//满分
// FULL_MARK = 150;//错误,final修饰的变量,是常量,不能重新赋值
//输出常量值
System.out.println("满分:" + FULL_MARK);
//小王的成绩比满分少1分
int wang = FULL_MARK - 1;
//小尚得了满分
int shang = FULL_MARK;
//小刘得了一半分
int liu = FULL_MARK/2;
//输出变量值
System.out.println("小王成绩:" + wang);
System.out.println("小尚成绩:" + shang);
System.out.println("小刘成绩:" + liu);
}
}
3.4 类型转换
3.4.1 自动类型转换

自动类型转换原则:
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不想关类的对象
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换
- 转换过程中可能导致溢出或者损失精度
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,
int i =128;
byte b = (byte)i;
//因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
(int)23.7 == 23;
(int)-45.89f == -45
3.4.2 强制类型转换
- 条件是转换的数据类型必须是兼容的。
- 格式:(type)value type是要强制类型转换后的数据类型 实例:
public class QiangZhiZhuanHuan{ public static void main(String[] args){ int i1 = 123; byte b = (byte)i1;//强制类型转换为byte System.out.println("int强制类型转换为byte后的值等于"+b); } } //int强制类型转换为byte后的值等于1234. Java中的转义字符
| 符号 | 字符含义 | | —- | —- | | \n | 换行 (0x0a) | | \r | 回车 (0x0d) | | \f | 换页符(0x0c) | | \b | 退格 (0x08) | | \0 | 空字符 (0x0) | | \s | 空格 (0x20) | | \t | 制表符 | | \“ | 双引号 | | \‘ | 单引号 | | \\ | 反斜杠 | | \ddd | 八进制字符 (ddd) | | \uxxxx | 16进制Unicode字符 (xxxx) |
- 格式:(type)value type是要强制类型转换后的数据类型 实例:
5. 运算符
5.1 算术运算符
| 算术运算符 | 名称 | 举例 |
|---|---|---|
| + | 加法 | 5+10=15 |
| - | 减法 | 10-5=5 |
| * | 乘法 | 3*6=18 |
| / | 除法 | 36/4 = 9 |
| % | 求余数 | 13%3=1 |
| ++ | 自增1 | int n=3;n++ |
| — | 自减1 | int n=4;—n |
public class OperatorDemo01 {
public static void main(String[] args) {
int a = 3;
int b = 4;
System.out.println(a + b);// 7
System.out.println(a - b);// -1
System.out.println(a * b);// 12
System.out.println(a / b);// 计算机结果是0,为什么不是0.75呢? 整数/整数结果还是整数
System.out.println(a % b);// 3
//余数的符号只看被除数
System.out.println(5%2);//1
System.out.println(5%-2);//1
System.out.println(-5%2);//-1
System.out.println(-5%-2);//-1
//商*除数 + 余数 = 被除数
//5%-2 ==>商是-2,余数时1 (-2)*(-2)+1 = 5
//-5%2 ==>商是-2,余数是-1 (-2)*2+(-1) = -4-1=-5
}
}
5.1.1 自增自减运算符的执行方式
理解:++ 运算,变量自己的值加1。反之,— 运算,变量自己的值减少1,用法与++ 一致。
1、单独使用
- 变量在单独运算的时候,变量前++和变量后++,变量的是一样的;
- 变量前++ :例如 ++a 。
- 变量后++ :例如 a++ 。
| 表达式 | 执行方式 | 结果(num1=1) |
| —- | —- | —- |
| num2=++num1; | num1 = num1 +1;
num2=num1; | num1 =2;
num2=2; | | num2=num1++; | num2=num1; num1=num1+1; | num1=2;
num2=1; | | num2=—num1; | num1=num1-1; num2=num1; | num1=0;
num2=0; | | num2=num1—; | num2=num1; num1=num1-1; | num1=0;
num2=1; |
2、复合使用
- 和其他变量放在一起使用或者和输出语句放在一起使用,前++和后++就产生了不同。
- 变量前++ :变量先自身加1,然后再取值。
变量后++ :变量先取值,然后再自身加1。
public class OperatorDemo03 { public static void main(String[] args) { // 其他变量放在一起使用 int x = 3; //int y = ++x; // y的值是4,x的值是4, int y = x++; // y的值是3,x的值是4 System.out.println(x); System.out.println(y); System.out.println("=========="); // 和输出语句一起 int z = 5; //System.out.println(++z);// 输出结果是6,z的值也是6 System.out.println(z++);// 输出结果是5,z的值是6 System.out.println(z); int a = 1; a = a++;//(1)先取a的值“1”放操作数栈(2)a再自增,a=2(3)再把操作数栈中的"1"赋值给a,a=1 int i = 1; int j = i++ + ++i * i++; /* 从左往右加载 (1)先算i++ ①取i的值“1”放操作数栈 ②i再自增 i=2 (2)再算++i ①i先自增 i=3 ②再取i的值“3”放操作数栈 (3)再算i++ ①取i的值“3”放操作数栈 ②i再自增 i=4 (4)先算乘法 用操作数栈中3 * 3 = 9,并把9压会操作数栈 (5)再算求和 用操作数栈中的 1 + 9 = 10 (6)最后算赋值 j = 10 */ } }小结:
比较运算符用于判断两个数据的大小,如大于
- 比较的结果是一个布尔值 | 运算符 | 名称 | 表达式 | 结果 | | —- | —- | —- | —- | | > | 大于 | 5>3 | true | | < | 小于 | 5<3 | false | | >= | 大于等于 | 5>=3 | true | | <= | 小于等于 | 5<=3 | false | | == | 等于 | 5==3 | false | | != | 不等于 | 5!=3 | true |
5.3 逻辑运算符
- &&和&区别:
- &&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。
- ||和|区别:
- ||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。 | 名称 | 运算符 | 表达式 | | —- | —- | —- | | 与 | &&或& | operand1&&operand2 | | 或 | ||或| | operand1||operand2 | | 非 | ! | !operan |
5.4 条件运算符
Java中的条件运算符是三目运算符
语法:
- 布尔表达式?表达式1:表达式2
- 当布尔表达式的值为true,则返回表达式1的值,否则返回表达 式2的值
5.5 位运算符
位运算符: 对两个操作数中的每一个二进制位都进行运算
位运算符功能:
1、按位取反 ~
2、按位与 &
3、按位或 |
4、按位异或 ^
5.6 位移运算符:
左移:”a<<b;”将二进制形式的a逐位左移b位,最低位空出的b位补0运算规则:左移几位就相当于乘以2的几次方 3<<4 类似于 32的4次= 316 = 48
注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位 byte,short,char在计算时按照int类型处理
带符号右移:”a>>b; “将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位
快速运算:类似于除以2的n次,如果不能整除,向下取整 69>>4 类似于 69/2的4次 = 69/16 =4
无符号右移:”a>>>b;”将二进制形式的a逐位右移b位,最高位空出的b位补0
69>>>4 类似于 69/2的4次 = 69/16 =4 69>>4 类似于 69/2的4次 = 69/16 =4
5.7 复合赋值运算符
| 运算符 | 表达式 | 计算 | 结果(假设x=15) |
|---|---|---|---|
| += | x+=5 | x=x+5 | 20 |
| -= | x-=5 | x=x-5 | 10 |
| *= | x*=5 | x=x*5 | 75 |
| /= | x/=5 | x=x/5 | 3 |
| %= | X%=5 | x=x%5 | 0 |
| <<= | 将左边变量的值左移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量 | ||
| >>= | 将左边变量的值右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量 | ||
| >>>= | 将左边变量的值无符号右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量 | ||
| &= | 将左边变量的值和右边的常量值/变量值/表达式的值进行按位与,最后将结果赋值给左边的变量 | ||
| |= | 将左边变量的值和右边的常量值/变量值/表达式的值进行按位或,最后将结果赋值给左边的变量 | ||
| ^= |
将左边变量的值和右边的常量值/变量值/表达式的值进行按位异或,最后将结果赋值给左边的变量 |
public class OperatorDemo04 {
public static void main(String[] args) {
int a = 3;
int b = 4;
int c = a + b;
b += a;// 相当于 b = b + a ;
System.out.println(a); // 3
System.out.println(b); // 7
System.out.println(c); //7
short s = 3;
// s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度
s += 4; // 代码没有报错
//因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
System.out.println(s);
int j = 1;
j += ++j * j++;//相当于 j = j + (++j * j++);
System.out.println(j);//5
int m = 1;
m <<= 2;
System.out.println(m);
}
}
5.8 运算符的优先级
| 运算符 | 描述 |
|---|---|
| () | 圆括号 |
| !,++,— ,~ | 逻辑非,自增,自减 |
| *,/,% | 乘法,除法,取余 |
| +,- | 加法,减法 |
| << ,>> ,>>> | 位移运算符 |
| <,<=,>,>=,instanceof | 小于,小于等于,大于,大于等于 |
| ==,!= | 等于,不等于 |
| & | 逻辑与 |
| ^ | 异或 |
| | | 逻辑或 |
| && | 逻辑与 |
| || | 逻辑或 |
| ? : | 三目表达式 |
| =,*=,/=,%= | 赋值运算符 |
| +=,-=,<<=,>>= | 复合赋值运算 |
| >>>=,&=,^=,|= | 复合赋值运算 |
提示说明:
(1)表达式不要太复杂
(2)先算的使用()
口诀:
单目运算排第一; 乘除余二加减三; 移位四,关系五; 等和不等排第六; 位与、异或和位或; 短路与和短路或; 依次从七到十一; 条件排在第十二; 赋值一定是最后;
