1. 数据类型的转换

当数据类型不一样时,将会发生数据类型转换

  • 自动类型转换(隐式)
  • 强制类型转换(显示)

1.1 自动类型转换(隐式)

特点:代码不需要进行特殊处理,自动完成

规则:数据范围从小到大(与字节数未必相关)

int整数类型转换 java java int转换成double_强制类型转换

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;