
在Java中,⼀些数据类型之间是可以相互转换的。分为两种情况:⾃动类型转换和强制类型转换。
隐性转换:把⼀个表示数据范围⼩的数值或者变量赋值给另⼀个表示数据范围⼤的变量。这种转换⽅式是⾃动的,直接书写 即可。例如:
double num = 20; // 将int类型的20直接赋值给double类型 System.out.println(num); // 输出20.0
类型从⼩到⼤关系:byte--short(char)--int--long--float--double
说明: 1. 整数默认是int类型,byte、short和char类型数据参与运算均会⾃动转换为int类型。
案列:
byte b1 = 10; byte b2 = 20; byte b3 = b1 + b2; // 第三⾏代码会报错,b1和b2会⾃动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。 // 修改为: int num = b1 + b2; // 或者: byte b3 = (byte) (b1 + b2);
2. boolean类型不能与其他基本数据类型相互转换。
强制转换:把⼀个表示数据范围⼤的数值或者变量赋值给另⼀个表示数据范围⼩的变量。
强制类型转换格式:⽬标数据类型 变量名 = (⽬标数据类型)值或者变量;
案例:
double num1 = 5.5; int num2 = (int) num1; // 将double类型的num1强制转换为int类型 System.out.println(num2); // 输出5(⼩数位直接舍弃)类型转换案列:
代码:
byte a = 3; byte b = 4; byte c = a + b; //错误。因为两个byte变量相加,会先提升为int类型 byte d = 3 + 4; //正确。
常量优化机制: 在编译时,整数常量的计算会直接算出结果,并且会⾃动判断该结果是否在byte取值范围内, 在:编译通过,不在:编译失败
运算符: 算数运算符运算符和表达式:
运算符:对常量或者变量进⾏ *** 作的符号。在程序中经常出现一些特殊符号,如+、-、=、><等,这些特殊符号称作运算符,运算符用于对数据进行运算,赋值和比较等操作,在Java中,运算符可分为算术运算符,赋值运算符等。
表达式:⽤运算符把常量或者变量连接起来符合java语法的式⼦就可以称为表达式。 不同运算符连接的表达式体现的是不同类型的表达式
举例:
int a = 10; int b = 20; int c = a + b;
+:是运算符,并且是算术运算符。
a+b:是表达式,因为+是算术运算符,所以这个表达式叫做算术表达式。
算术运算符:注意:
1. /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。
2. 整数 *** 作只能得到整数,要想得到⼩数,必须有浮点数参与运算。
int a=10; int b=3; System.out.println(a/b);//输出结果为3 System.out.println(a%b);//输出结果为1(余数)字符的"+" *** 作:
char类型参与算术运算,使⽤的是计算机底层对应的⼗进制数值。需要我们记住三个字符对应的数值(ASCII码数值):
'a' -- 97 a-z是连续的,所以'b'对应的数值是98,'c'是99,依次递加
'A' -- 65 A-Z是连续的,所以'B'对应的数值是66,'C'是67,依次递加
'0' -- 48 0-9是连续的,所以'1'对应的数值是49,'2'是50,依次递加
// 可以通过使⽤字符与整数做算术运算,得出字符对应的数值是多少 char ch1 = 'a'; System.out.println(ch1 + 1); // 输出98,97 + 1 = 98 char ch2 = 'A'; System.out.println(ch2 + 1); // 输出66,65 + 1 = 66 char ch3 = '0'; System.out.println(ch3 + 1); // 输出49,48 + 1 = 49
算术表达式中包含不同的基本数据类型的值的时候,整个算术表达式的类型会⾃动进⾏提升。
提升规则:
byte类型,short类型和char类型将被提升到int类型,不管是否有其他类型参与运算。
整个表达式的类型⾃动提升到与表达式中最⾼等级的 *** 作数相同的类型
等级顺序:byte,short,char --> int --> long --> float --> double
案例:
byte b1 = 10; byte b2 = 20; // byte b3 = b1 + b2; // 该⾏报错,因为byte类型参与算术运算会⾃动提示为int,int赋值给byte可能损失 精度 int i3 = b1 + b2; // 应该使⽤int接收 byte b3 = (byte) (b1 + b2); // 或者将结果强制转换为byte类型 ------------------------------- int num1 = 10; double num2 = 20.0; double num3 = num1 + num2; // 使⽤double接收,因为num1会⾃动提升为double类型
当“+” *** 作中出现字符串时,这个”+”是字符串连接符,⽽不是算术运算。
System.out.println("liyc"+ 666); // 输出:liyc666,+号把字符和666连接在了一起
在”+” *** 作中,如果出现了字符串,就是连接运算符,否则就是算术运算。当连续进⾏“+” *** 作时,从左到右逐个执⾏。
自增自减运算符:注意事项:
++和-- 既可以放在变量的后边,也可以放在变量的前边。
单独使⽤的时候, ++和-- ⽆论是放在变量的前边还是后边,结果是⼀样的。
参与 *** 作的时候,如果放在变量的后边,先拿变量参与 *** 作,后拿变量做++或者--。(变量直接参与运算)
参与 *** 作的时候,如果放在变量的前边,先拿变量做++或者--,后拿变量参与 *** 作。(变量+1或-1后在参加运算)
int i = 10;
i++; // 单独使⽤
System.out.println("i:" + i); // i:11
int j = 10;
++j; // 单独使⽤
System.out.println("j:" + j); // j:11
int x = 10;
int y = x++; // 赋值运算,++在后边,所以是使⽤x原来的值赋值给y,x本身⾃增1
System.out.println("x:" + x + ", y:" + y); // x:11,y:10
int m = 10;
int n = ++m; // 赋值运算,++在前边,所以是使⽤m⾃增后的值赋值给n,m本身⾃增1
System.out.println("m:" + m + ", m:" + m); // m:11,m:11
赋值运算符:
=(赋值,例如:a=1;) +=(加等于,例如:a+=1;如果a=1的话,那么就是a=1+1;) -=(减等于,和+=一个意思) *= /= %=(乘等于(*=把乘的值赋给它本身)、除等于(除的商赋给它本身)、模等于(除的余赋给它本身)。
扩展的赋值运算符隐含了强制类型转换。
在为变量赋值时,当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,需要进行强制类型转换,如果将一个int类型的值赋给一个short类型的变量,需要显式地进行强制类型转换,然而在使用+=、-=、*=、/=、%=运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显式地声明。
short s = 10; s = s + 10; // 此⾏代码报错,因为运算中s提升为int类型,运算结果int赋值给short可能损失精度 s += 10; // 此⾏代码没有问题,隐含了强制类型转换,相当于 s = (short) (s + 10);关系运算符:
关系运算符有6种关系,分别为⼩于、⼩于等于、⼤于、等于、⼤于等于、不等于。
注意事项:
关系运算符的结果都是boolean类型,要么是true,要么是false。
千万不要把“==”误写成“=”,"=="是判断是否相等的关系,"="是赋值。两个并不相同。
逻辑运算符:逻辑运算符把各个运算的关系表达式连接起来组成⼀个复杂的逻辑表达式,以判断程序中的表达式是否成⽴,判断 的结果是 true 或 false。
在逻辑与运算中,只要有⼀个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都 计算出来,短路与 *** 作就有这样的效果,可以提⾼效率。同理在逻辑或运算中,⼀旦发现值为true,右边的表达式 将不再参与运算。
&&(短路与,在使用&进行运算时,不论左边为true或者false,右边表达式都会进行运算,如果使用&&进行运算,当左边为false,那么右边的表达式就不会在进行运算)
||(短路或,在使用|进行运算时,就算左边为true,右边表达式也要进行运算,如果使用||进行运算,如果左边为true,那么右边就不会在进行运算)
三元运算符:三元运算符语法格式:
//关系表达式?表达式1:表达式2 a>b?a:b;//条件成立输出a,条件不成立输出b流程控制语句:
在⼀个程序执⾏的过程中,各条语句的执⾏顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执 ⾏流程。⽽且,很多时候要通过控制语句的执⾏顺序来实现我们想要的功能。
流程控制语句分类:顺序结构
分⽀结构(if, switch)
循环结构(for, while, do…while)
分支结构之if语句:
if语句格式:
if(关系表达式){
语句体;}
if语句执行流程:
1.先计算出关系表达式的值
2.如果关系表达式的值为true,那么再执行语句体,如果为false则不执行
3.继续执行后面的语句
案列:
public class IfDemo {
public static void main(String[] args) {
System.out.println("开始");
// 如果年龄⼤于18岁, 就是成年
int age = 17;
if(age >= 18){
// int a = 10;
System.out.println("成年了");
}else{
System.out.println("未成年");}
}
}
if语句格式2:
格式:
if(关系表达式){
语句体1;
}
else{
语句体2;
}
执行流程:
1.先算关系表达式的值
2.如果关系表达式的值为true,那么再执行语句体,如果为false则执行else里面的语句体2
3.执行后面的语句
if语句格式3
格式:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}else if (关系表达式3) {
语句体3;
}
else {
语句体n+1;
}
执行流程:
1.先计算关系表达式1的值
2.如果关系表达式的值为true,那么再执行语句体,如果为false则执行else if()里面关系表达式2的值
3.如果结果为true那么执行语句体2,如果为false,则执行关系表达式3的值
4.....
5.如果没有关系表达式的值为true,则执行else里面的语句体n+1
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)