1. 数据类型的转换
当数据类型不一样时,将会发生数据类型转换
- 自动类型转换(隐式)
- 强制类型转换(显示)
1.1 自动类型转换(隐式)
特点:代码不需要进行特殊处理,自动完成
规则:数据范围从小到大(与字节数未必相关)
public class Demo01DataType {
public static void main(String[] args) {
System.out.println(1024);//这就是一个整数,默认就是int类型
System.out.println(3.14);//这就是一个浮点数,默认就是double类型
//1.整数和整数
//左边是long,右边默认int
//int--->long,符合数据范围从小到大,所以int可以自动转换成long
long num1=100;
System.out.println(num1);//100
//2.浮点数和浮点数
//左边是double,右边默认float
//float--->double,符合数据范围从小到大,所以float可以自动转换成double
double num2=2.5F;
System.out.println(num2);
//3.整数和浮点数
//左边是float,右边是long
//long--->float,符合范围从小到大
float num3=30L;
System.out.println(num3);//30.0
}
}
1.2 强制类型转换(显示)
特点:代码需要进行特殊的格式处理,不可以自动完成
public class Demo02DataType{
public static void main(String[] args){
//左边是int,右边是long
//long--->int,不符合数据范围从小到大,不会自动转换
//强制转换如下:
int num=(int)100L;
System.out.println(num);//100
//这种情况不加强制转化就会报错
}
}
注意事项:
- 强制类型转换一般不推荐使用,有可能会发生数据溢出或者精度损失
//将Long强制转换成int
int num2=(int)6000000000L;//若不加(int)会报错
System.out.println(num2);//1705032704 数据溢出
//double--->int,强制类型转换
int num3=(int) 3.9;
System.out.println(num3);//3 精度损失
- byte、short、char这三种类型都可以发生数学运算,例如加法“+”
char ch='A';//这是一个字符型变量,里面是大写字母A
System.out.println(ch+1);//66
- byte、short、char这三种类型在运算的时候,都会被首先提升为int类型,然后再计算
byte num4=40;
byte num5=50;
//byte result1=num4+num5;//报错 从int转换到byte可能会有损失
//报错原因:在运算的时候,byte会被提升为int(即num4转换为int,num5转换为int),所以result1应该用int接收
int result1=num4+num5;
System.out.println(result1);//90
short num6=60; //如果result2不用int接收,非要用short接收,在num4和num5进行强制类型转换的时候必须保证num4+num5逻辑上真实大小本来就没有超出short范围,否则会发生数据溢出
short result2=(short)(num6+num5);
System.out.println(result2);//110
- 注意:java中的boolean不可以发生数据类型转换
数字和字符的对照关系(编码表):
- ASCII码表:American Standard Code for Information Interchange,美国信息交换标准代码。
- Unicode:万国码。也是数字和符号的对照关系,开头0-127部分和ASCII完全一样,但是从128开始包含有更多字符。
48----> '0'
65----> 'A'
97----> 'a'
public class Demo03DataTypeChar {
public static void main(String[] args){
//1.输出ASCII值
//加了一个int类型的0,有加法运算就会将char类型提升为int类型,所以这里会输出字符'1'的ASCII值
char ch='1';
System.out.println(ch+0);//49
//2.输出ASCII值
char ch1='c';
int num=ch1;//自动类型转换
System.out.println(num);//99
//3.unicode编码
char ch2='中';
System.out.println(ch2+0);//20013 已经超出了ASCII的范围了
}
}
2 算术运算符
2.1 算数运算符_四则运算
- 四则运算:加减乘除:+ - * /
public class Demo04Operator {
public static void main(String[] args){
int x=10;
int y=3;
//对于一个整数表达式,int除以int得到的还是一个int
int result1=x/y;
System.out.println(result1);//3
}
}
- 取模:% 只有对于整数的除法,取模运算符才有意义
注意事项:一旦运算当中有不同类型的数据,那么结果将会是数据范围大的那种,但同时不要忘了byte、short、char在运算的时候都会自动提升为int类型再进行计算。
int z=6;
//int+double-->double+double-->double
double result2=z+2.5;
System.out.println(result2);//8.5
//但同时不要忘了byte、short、char在运算的时候都会自动提升为int类型再进行计算
2.2 算数运算符_四则运算当中加号"+"有常见的三种用法
- 1.对于数值来说,那就是加法
- 2.对于字符char类型来说,在计算之前,char会被提升为int,然后再计算。char类型字符,和int类型数字,之间的对照关系表:ASCII、Unicode
- 3.对于字符串String(首字母大写,并不是关键字)来说,加号代表字符串连接操作。任何数据类型和字符串进行连接的时候,都会变成字符串。
public class Demo05Plus {
public static void main(String[] args) {
//字符串类型变量的基本使用
String str1="Hello";
System.out.println(str1);//Hello
System.out.println("Hello"+"Word");//HelloWord
System.out.println(str1+20);//Hello20
//优先级问题
System.out.println(str1+20+30);//Hello2030
System.out.println(str1+(20+30));//Hello50
}
}
2.3 算数运算符_自增自减运算符
- 自增运算符:++
- 自减运算符:--
使用方法: - 单独使用:前++和后++没有区别
- 混合使用:若为前++,那么变量立马加1,之后拿着结果进行使用;若是后++,那么首先使用变量本来的值,然后再让变量加1。
- 只有变量可以使用自增自减运算符,常量不可以使用
public class Demo06Operator {
public static void main(String[] args) {
int num1=10;
System.out.println(num1);//10
//单独使用
System.out.println(++num1);//11
System.out.println(num1++);//12
//与打印操作混合使用
int num2=20;
System.out.println(++num2);//21先加后用
System.out.println(num2);//21
int num3=30;
System.out.println(num3++);//30先用后加
System.out.println(num3);//31
//与赋值操作混合
int num4=40;
int result1= --num4;
System.out.println(result1);//39
System.out.println(num4);//39
int num5=50;
int result2=num5--;
System.out.println(result2);//50
System.out.println(num5);//49
//举例
int x=10;
int y=20;
int result3= ++x + y--;
System.out.println(result3);//31
System.out.println(x);//11
System.out.println(y);//19
}
}
3 赋值运算符
赋值运算符:=
复合赋值运算符:+= -= *= /= %=
- 只有变量可以使用赋值运算符,常量不可以使用
- 复合赋值运算符隐含了一个强制类型转换
public class Demo07Operator {
public static void main(String[] args) {
byte num = 30;
num += 5;
// num=num+5
// num=byte+int
// num=int+int
// num=int
// num=(byte)int 强制类型转换
System.out.println(num);//35 是一个byte类型的变量
}
}
4 比较运算符
== < > >= <= !=
- 比较运算符的结构是一个bool值,不成立就是false ,成立就是true
- 比较运算符不可以连写
5 逻辑运算符
- 与&& 或|| 非!
- 其中“与&&” 和 “或||”具有短路效果
- “与&&” 和 “或||” 左右都必须是bool值
- 与&&” 和 “或||”运算符,如果有多个条件可以连续写:条件A && 条件A && 条件A
6 三元运算符
public class Demo08Operator {
public static void main(String[] args) {
int a = 10;
int b = 20;
//格式
//数据类型 变量名称 = 条件判断 ? 表达式A :表达式B
int max = a > b ? a : b;
System.out.println("最大值" + max);//20
//注意
//1. 必须保证表达式A的值和表达式B的值都符合左侧数据类型的要求
//int result = 3 > 4 ? 2.5 : 10;//报错 写法错误
//2. 三元运算符的结果必须被使用
//a > b ? a : b;//报错: 不是语句
System.out.println(a > b ? a : b);//20
}
}
变量赋值时的注意事项总结:
- (1)赋值号右边:观察常量值大小是否在对应的数据类型范围(默认情况下是int/double)内,如果超过范围则直接报错。
//long num6=3000000000;//会报错,没有加L默认是int(30亿超过了int的范围)
long num6=3000000000L;
- 赋值号左边:观察被赋值的变量类型是否可以成功接收右边的常量
何为成功接收:
- (2)自动类型转换(隐式):数据范围从小到大(与字节数未必相关)
- (3)强制类型转换(显示):不符合数据范围从小到大,一般不推荐使用,有可能会发生数据溢出或者精度损失
- byte、short、char这三种类型在运算的时候,都会被首先提升为int类型,然后再计算
- (4)对于byte/short/char三种类型来,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个强制类型转换(byte)(short)(char),如果右侧超过了左侧的范围,那么直接编译器报错
- So:整形常量默认为int类型,在不做强制类型转换的情况下,在不超出左边变量范围的情况下,它可以赋值给除了boolean类型之外的任何数据类型,而不会报错
byte num = 30;
short num1 = 30;
long num2 = 30;
float num3 = 30;
double num4 = 30;
char num5 = 30;