一、数据类型
1、分类
基本数据类型
1.1 数值型
(1)整型<br /> Byte 字节 8bit <br /> Short 短整型 16bit <br /> Int 整型 32bit <br /> Long 长整型 64bit <br /> (2)浮点型<br /> Float 单浮点 32bit <br /> Double 双浮点 64bit<br /> (3)字符型<br /> Char 字符 16bit <br /> (4)布尔型<br /> Boolean 布尔 8bit
1.2 引用数据类型
类,数组,接口
2、类型使用
2.1 整数型
public static void main(String[] args){
byte b1 = 12;
b1 = 2;
System.out.println(b1);
short s1 = 32767;
//int类型使用的最多
int i1 = -2147483648;
//long类型的值,需要加L/l结尾,不区分大小写,建议大写
long l1 = 2147483648L;
}
2.1.1 进制
//二进制 0b开头
int i_1 = 0b0101;
//八进制 0开头
i_1 = 025;
//十六进制 0x开头
i_1=0x12af;
2.2 浮点型
public static void main(String[] args){
//单浮点 必须加F/f结尾,不区分大小写
float f1 = 1.5F;
//双浮点,需要加D/d结尾,不区分大小写,D/d可省略
double d1 = 5.6;
}
2.3 字符型
字符型的值用单引号表示,单引号内有且只有一个字符
public static void main(String[] args){
char c1 = '啊';
//字符型可以转换为int行,ASCII码
int i1 = c1;
System.out.println(i1);
//还支持unicode编码 \ u 4位十六进制
//而char类型默认值 就是 0000
char c2 = '\u4f11';
System.out.println(c2);
// 字符串用string,使用双引号表示一串字符
String s = "苗赛";
s="\\\\";
System.out.println(s);
}
2.4 转义符
转义符 \ ,把有意义字符转换为无意义字符
保存 \ 需要使用转义符 \ 把 \ 转义就行
//转义符 \ ,把有意义字符转换为无意义字符
char c1 = '\'';
c1 = '\\';
c1 = '"';
System.out.println(c1);
2.5 布尔型
java中布尔型的值,只有true和false,一般用于流程控制,占用1字节,1表示true,0表示false
boolean flag = true;
System.out.println(flag);
flag = false;
System.out.println(flag);
3、类型转换
8种基本类型中,除了布尔型,其他类型都可以进行类型转换
自动类型转换:低精度到高精度位自动类型转换
强制类型转换:高精度到低精度是强制类型转换,有可能丢失精度
byte -> short ->int ->long ->float ->double 是自动转换,相反就是强制转换
byte short char 之间只能强制转换(byte和short中有负数,char中只有正数,所以需要强制转换),char到int之后是自动转换(int包含char的所有字节)
public static void main(String[] args){
byte b1 = 2;
short s1 = 4;
int i1 = 6;
long l1 = 66L;
//自动转换
i1 = b1;
l1 = s1;
//强制转换
i1 = (int) l1;
b1 = 10;
i1 = 130;
//精度丢失
b1 = (byte)i1;
System.out.println(b1);
byte b = 97;
char c = (char) b;
System.out.println(c);
//char的范围是0~65535,不能保存负数
//char不考虑符号位,负数的二进制给了char之后,也会编程正整数
int i = -265;
System.out.println(0b1111111011110111);
char c1 = (char) i;
System.out.println(c1);
//char不加引号,就是在ASCII码中选择
char c2 = 65271;
System.out.println(c2);
}
二、变量
1、常量
值不能更改
public static void main(String[] args){
//字面量/常量
//默认是int类型
System.out.println(52);
//long类型字面量
System.out.println(214748364747L);
//小数 默认double
System.out.println(2.5);
//float类型字面量
System.out.println(2.5f);
//字符类型字面量
System.out.println('a');
//布尔类型字面量
System.out.println(false);
//引用类型默认值是null,null是不能打印的
// System.out.println(null);
}
2、变量
2.1 变量声明
变量声明:数据类型 变量名 = 值;
变量可以多次使用,也可以重新覆盖原来的值
//变量声明:数据类型 变量名 = 值;
int i = 2;
//变量可以多次使用
System.out.println(i);
//也可以重新覆盖原来的值
i = 22;
System.out.println(i);
//同作用域中,不能有同名的变量名
//一个大括号{}就是一个作用域,可以同时声明多个变量
int i4 = 1, i5 = 2, i6 = 3;
2.2 变量分类
根据变量声明位置不同,作用域不同,分成三类
1)局部变量:方法中创建的变量是局部变量
2)静态变量:类体中(方法外)使用static创建的变量
3)成员变量:类体中(方法外)没有使用static创建的变量
public class var_01 {
//静态变量
static int b = 3;
//成员变量
int c = 5;
public static void main(String[] args){
//局部变量
int a = 2;
}
}
2.3 变量调用
局部变量:局部变量具有临时性,方法执行结束就消失了,只能在当前方法中通过变量名使用
静态变量:类级别,通过类名、静态变量名使用,如果在当前类中使用当前类的静态变量,类名可以省略
成员变量:对象级别,通过对象.成员变量名调用,在成员方法中可以直接使用变量名调用
public static void main(String[] args){
//局部变量
int a = 2;
//局部变量调用
System.out.println(a);
//静态变量调用
System.out.println(var_01.b);
System.out.println(b);
}
2.4 ** 变量调用优先级**
当局部变量和静态变量同名,如果直接使用变量名,则调用的是局部变量,想要调用静态变量,需要加类名区分
2.5 默认值
局部没有默认值,不赋值不能使用
静态变量和成员变量有默认值,整数0,小数0.0,字符\u0000,布尔型false,引用类型null
三、运算符
1、算术运算符
算数运算符有+ - * / %,其中 * / % 优先级大于 + - ,并且+ - * / % 都是左结合,同优先级的时候,从左到右计算
**注意:**小数相加减,不要判断相等
++ – 属于一元运算,优先级大于 + - * / %
1.1 i++和++i的区别
i++ 是先初始化赋值,再自身+1
++i 是先自身+1,再初始化赋值
i++ 和 ++i单独出现时,没有区别,都是自身+1
i = 10;
int x = 10 + i-- + ++i * i + i++ + ++i;
System.out.println("x:" + x + ", i:" + i);
i++/-- 是需要先赋值在加一,所以第一个 i-- 是10,i的值变为了9,++ – 的优先级要高,需要有限计算,从左往右进行赋值,所以在 i++ * i 中·,后边的i值是10,赋值不讲究优先级
2、混合运算
当进行多类型混合运算时,结果是参与运算的最大类型
当只有byte short int char 四种类型中任意一种或多种进行运算,结果一定是int类型
3、关系运算
关系运算有 > >= < <= == !=
关系运算结果一定是布尔型
int a = 10;
int b = 11;
System.out.println(a == b);
System.out.println(a > b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a <= b);
System.out.println(a != b);
结果如下:
4、位运算/逻辑运算
逻辑运算,以下几个操作结果均为布尔型
& 位与,两边都为true,结果就是true
| 位或,一边为true,结果就是true
! 位非,取反,true就是false,false就是true
&& 短路与,两边都为true,结果就是true,如果第一个条件为false,则第二个条件不再执行
|| 短路或,一边为true,结果就是true,如果第一个条件为true,则第二个条件不再执行
^ 位异或,两边不一样,结果就是true
System.out.println(1>2 & 2<3);
System.out.println(1>2 && 2<3);
System.out.println(1>2 | 2<3);
System.out.println(1>2 || 2<3);
System.out.println(!true);
System.out.println(true ^ false);
结果如下:
当 && 和 || 同时出现时,&& 优先级大于 ||
boolean flag = true || false && false;
System.out.println(flag);
//结果为true
& 也支持两边是数字,转换为二进制进行每位比较,都是1 则取1,否则取0
运算结果,不会超过两个数中的最小数,所以适合用于做数组下标技术(包括hash算法)
// 0000 1111
// 0000 1000
// 0000 1000
System.out.println(15 & 8);
^ 也支持两边是数字,转换为二进制进行每位比较,不同取1,相同取0
因此 两个相同数进行^ , 结果得0 , 并且 0和任何数进行^ , 该数不变
// 0000 1111
// 0000 1000
// 0000 0111
System.out.println(15 ^ 8);//7
System.out.println(15 ^ 56 ^ 23 ^ 15 ^ 23);//56
~ 按位非,转换二进制,1变0,0变1 (符号位也会变)
// 0000 1100
// 1111 0011 补码
// 1111 0010 反码
// 1000 1101
System.out.println(~12);
: 右移运算(考虑符号位,符号位不受影响)
10 >> 1 , 右移1次,会把最右边的一个删除,在最左边补0 (如果是负数,就补1)
右移一次,相当于该数 / 2
// 0 00000 10
System.out.println(10 >> 2);
// 1000 1010
// 1111 0101
// 111111 01
// 111111 00
// 100000 11
System.out.println(-10 >> 2);
: 右移运算(不考虑符号位),只补0,不补1
System.out.println(10 >>> 2);
// 1000 0000 0000 0000 0000 0000 0000 1010
// 1111 1111 1111 1111 1111 1111 1111 0101
// 001111 1111 1111 1111 1111 1111 1111 01
System.out.println(-10 >>> 2);
System.out.println(0b00111111111111111111111111111101);
<< : 左移运算,只补0, 不补1,左移1次,相当于该数*2
// 0000 0010
// 00 001000
System.out.println(2 << 2);//8
// 1000 0010
// 1111 1101
// 1111 1110
// 11 111000
// 11 110111
// 10 001000
System.out.println(-2 << 2);//
// 如何快速计算2的3次方?
System.out.println(2 << 2);
5、赋值运算
+= -= *= /= %= 优先级一样
-=:左边减去右边,结果赋值给左边,a-=b, a = a - b
当运算中出现多个赋值运算,则从右到左计算,右结合,还会隐式类型转换
int s = 5;
s *= s += s;
System.out.println(s);//50
byte c = 2;
byte y = 3;
c += y;
System.out.println(c);//5
6、字符串连接符
- 即是加减运算 也是 字符串拼接符
int a = 10;
int b = 11;
System.out.println("a+b=" + (a + b));
System.out.println(a + "+" + b + "=" + (a + b));
7、三目运算符
三目运算符,又叫三元运算符
布尔型表达式 ? 真语句 : 假语句;
布尔型表达式 : 只要运算结果是布尔型就行
int i1 = 1 < 2 ? 1 : 2;
System.out.println(i1);