表达式自动提升类型
在程序中直接写出来的数字,如果是整数默认类型为int,小数默认类型是double
一个表达式中包含多种数据类型,结果的数据雷系会自动提升,规则如下:
-
byte、short、char自动提升为int
-
整个表达式的类型会自动提升到最高级的数据类型
byte b1 = 3; byte b2 = 2; int sum1 = b1 + b2;//b1和b2自动提升类型为int short s1 = 1; short s2 = 2; int sum2 = s1 + s2;//s1和s2自动提升类型为int char c1 = '1'; char c2 = '2'; int sum3 = c1 + c2;//c1和c2自动提升类型为int System.out.println(sum3);//char相加是加的ASCII码值 long l1 = 8; //表达式中有一个long类型的加数,所以整个表达式的结果提升为long long sum4 = l1 + s1 + b1; //练习: short s3 = 5; s3 = s3 - 2;//2是int类型,所以表达式结果为int类型
字面量(直接量)
在代码中直接出现的的数字或字符串,叫字面量
int m =28;//20称为字面量 float f5 = 3.14F;//3.14称为字面量 String str1 = "字符串";//"字符串"称为字面量
自动装箱和自动拆箱
每一种基本类型都对应一种包装类型(类),基本类型与包装类型之间可以自动转换,
从基本类型转换为包装类型称为自动装箱,
从包装类型转换为基本类型称为自动拆箱。
基本类型 | 包装器类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int i =10; Integer integer = i;//基本类型直接赋值给包装类型,自动装箱 int i2 = integer;//包装类型直接赋值给基本类型,自动拆箱 //包装类型常用方法 String str = "123"; Integer value = Integer.valueOf(str);//把字符串转换为Integer类型 System.out.println(1 + value);//结果是124 int i1 = Integer.parseInt(str);//把字符串转为int类型 System.out.println(2 + i1);//结果125
Java里的数据类型
运算符
运算符是一种特殊的符号,用于数据的计算、赋值和比较。运算符将多个操作数连接在一起,成为了表达式。
Java运算符包含以下几类:
-
算术运算符
-
赋值运算符
-
比较运算符
-
逻辑运算符
-
位运算符
-
三目运算符
算术运算符
java里的算术运算符包含: + - * / %(取余) ++ --
-
+加号运算符除了数学的相加作用外,还可以用于字符串的拼接
int sum1 = 3 + 2; //加号用于字符串拼接,自动把后面int类型的数组转为字符串 String str1 = "加法的和等于:"+ sum1; System.out.println(str1); String str2 = sum1 + "这个数是和";//字符串和其他类型拼接是顺序无关 System.out.println(str2); String str3 = "字符串与布尔类型拼接" + true;//字符串可以和所有基本数据类型拼接 System.out.println(str3);
-
-做减法运算
-
*做乘法运算
-
/ 做除法运算
整除的结果为整数,会舍弃小数部分;整除时不能用0做除数
浮点数相除结果有小数,可以用0做除数,结果是Infinity
int res1 = 8/4; System.out.println("8/4=" + res1); res1 =8/3; //两个整数相除,结果会舍弃小数部分 System.out.println("8/3=" + res1); // res1 = 8/0;//整数除法不能用0做除数,会抛出异常 //java代码运行时出现异常会停在异常处,异常之后的不会在运行 System.out.println("8/0="+ res1); double res2 = 8/2.5;//只要有一个操作数为小数,除出来的结果就是小数 System.out.println("8/2.5=" + res2); res2 = 10/3.0;//结果为3.3333333333333335 System.out.println("10/3.0=" + res2); res2 = 5.0/0;//浮点数除法,除数为0,结果为Infinity无限大 System.out.println("5.0/0=" + res2);
-
%模运算用于得到除法的余数
整数取模,除数不能为0;
小数取模时,除数可以为0,结果为NaN
//取模运算 res1 = 5%3;//结果为余数 System.out.println( "5%3=" + res1); // res1 = 5%0;//模运算不能用0做除数 System.out.println("5%0=" + res1); res2 = 5.0%3;//结果为小数 System.out.println("5.0%3=" + res2); res2 = 5.0%0;//结果为NaN System.out.println("5.0%0=" + res2);
//取模运算 res1 = 5%3;//结果为余数 System.out.println( "5%3=" + res1); // res1 = 5%0;//模运算不能用0做除数 System.out.println("5%0=" + res1); res2 = 5.0%3;//结果为小数 System.out.println("5.0%3=" + res2); res2 = 5.0%0;//结果为NaN System.out.println("5.0%0=" + res2);
-
++ 称为单目运算(只有一个操作数),自己加1,可以放在操作数的左边或右边
int k = 1; k++;//k加1, 操作数先参与运算再加1 ++k;//k加1, 先自我加1再参与运算 System.out.println(k);
-
--称为单目运算符(只有一个操作数),自己加1,可以放在操作数的左边或右边
--称为弹幕运算符,自己减1,可以放在操作数的左边或者右边
注:运算方式同++
赋值运算符
-
=赋值运算,把右边的结果赋给左边,右边的值可以是字面量、表达式、变量、方法调用
//赋值运算 int n = 5;//赋值字面量 n = 3 + 2;//赋值表达式 n = k - res1;//赋值含有变量的表达式 Scanner scanner = new Scanner(System.in); //控制台输入 n = scanner.nextInt();//赋值一个方法返回值 System.out.println("结果:" + (n = 4 + 6));//赋值语句返回结果
-
扩展(组合)的赋值运算
+= -= *= /= %= 有算数运算符和赋值运算符组合而成的
n = n + 2; n += 2;//n = n + 2 n -= 2;//n = n - 2 n *= 2;//n = n * 2 n /= 2;//n = n / 2 n %= 2;//n = n % 2
比较运算符
用于判断两个操作数的大小是否相等,返回的值是boolean值包含:
< > == <= >= != >=:大于或等于
//比较运算符 System.out.println(3 > 2);//返回true System.out.println(3 < 2);//返回false System.out.println(2 == 2);//返回true System.out.println(2 != 2);//返回false //同理:>= <=
逻辑运算符
-
&& 短路与 有一个false是返回false
-
& 与
-
|| 短路或 同时为false时返回false
-
| 或
-
! 非
-
^ 异或 操作数相同返回false,不同返回true
//逻辑运算符 //&&短路与,如果根据第一个操作数就能觉得表达式的结果,那么第二个表达式不会再执行 n = 1; System.out.println(false && (2 == ++n));//第一个操作数是false,所以后面(2 == ++n)不会再执行,n还是1 System.out.println(n); //&&两个操作数都是true是返回true System.out.println("true && true: " + (true && true)); //&&中一个操作数为false时返回false System.out.println("true && false: " + (true && false)); // & 两个操作数都是true是返回true System.out.println("true & true:" + (true & true)); //&中一个操作数为false时返回false System.out.println("true & false:" + (true & false)); // ||、| 只要有一个true就为true System.out.println(true || true);//true System.out.println(false || true);//true System.out.println(false || false);//false // ! 取反,false变成true,true变成false System.out.println(!true);//false System.out.println(!false);//true // ^ 两个操作数相同时返回false,不同返回true System.out.println(true ^ true);//false System.out.println(false ^ true);//true System.out.println(false ^ false);//false
位运算符
-
& 按位与
-
| 按位或
-
~ 按位非
-
^ 按位异或
-
<< 向左移位
-
> > 向右移位
-
> >> 无移位右移
//位运算符 int a = 5; int b = 7; //转换为二进制右对齐再进行计算 System.out.println("a&b: "+ (a & b));//结果为5 System.out.println("a|b: "+ (a | b));//结果为7 a = -5; System.out.println(~a);//2,010,结果为4, 有符号位 a = 5; System.out.println(a ^ b);//结果为2 //面试题:最优解计算:2 * 8 a = 2;//2左移三位 System.out.println(a << 3);//结果为16,10左移三位得10000,换成十进制为16 System.out.println(5 >> 2);//5右移两位得1,考虑符号位 System.out.println(5 >>> 2);
三目运算符
三目运算符用于两粉质的判断,等效与if else语句
语法:条件表达式? 为真值:为假的值
//从控制台输入两个整数,打印较大的那个值 Scanner scanner = new Scanner(System.in); System.out.println("输入一个整数:"); int i = scanner.nextInt(); System.out.println("输入一个整数:"); int m = scanner.nextInt(); res1 = i > m ? i : m; //i>m,返回i;i<m,返回m System.out.println(res1);
运算符的优先级
括号 > 单目运算符 > 算术运算 > 比较运算符 > 逻辑运算符 > 三目运算符 > 赋值运算符
条件判断语句
单分支条件判断
if( 条件表达式){
//条件为真时执行的语句
}
int rain = 1;//是否下雨,1就是下雨,0没有下雨 if(rain == 1){ //if()括号里面的是判断语句,语句为真就执行{}中的内容;为假不执行 System.out.println("下雨了出门带雨伞"); }
两分支判断
if(条件表达式){
//为真执行
}
else{
//为假执行
}
//性别:1--男,2--女 int sex = 1; if(sex == 1){ System.out.println("男"); }else{ System.out.println("女"); }
多分支判断
if(条件){
#分支一
}else if(条件){
#分支二
}else{
#分支三
}
//输入一个人金额,小于等于800,买一个老年机,小于等于1500,小米;<=2500,vivo;<=5000,华为;>5000,土豪 Scanner scanner = new Scanner(System.in); System.out.println("请输入金额:"); int money = scanner.nextInt(); if(money > 5000){ System.out.println("你是土豪"); }else if(2500 < money && money <= 5000){ System.out.println("买华为"); }else if(1500<money && money <= 2500){ System.out.println("买vivo"); }else if(800 < money && money <= 1500){ System.out.println("买小米"); }else if(money <= 800){ System.out.println("买老年机"); }
//模拟取款机功能 System.out.println("1. 查询 " + "2. 取款 " + "3. 转账 " + "4.修改密码 "); System.out.println("请输入数字选择功能:"); int i = scanner.nextInt(); if(i == 1){ System.out.println("查询账户"); }else if(i == 2){ System.out.println("取款"); }else if(i == 3){ System.out.println("转账"); }else if(i == 4){ System.out.println("修改密码"); }else { System.out.println("无效输入:请重输"); }
switch(开关语句)实现多分支判断
switch(条件表达式){
case 值1:
//分支一
break:
case 值2:
//分支二
bresk:
default:
//其他情况的分支
break:
}
System.out.println("1. 查询 " + "2. 取款 " + "3. 转账 " + "4.修改密码 "); System.out.println("请输入数字选择功能:"); int i = scanner.nextInt(); switch (i){ case 1: System.out.println("查询"); break; case 2: System.out.println("取款"); break; case 3: System.out.println("转账"); break; case 4: System.out.println("修改密码"); break; default:{ System.out.println("无效输入"); break; } }
注:
-
case语句只能是具体的值(类型可以是byte、char、short、int、String、枚举),不能是表达式或变量;
-
每个case结束都要有break(终止执行后面的),如果没有break,满足case条件后面的case都会执行(不再做判断),直道遇到break
-
default执行其他情况(所有case都不满足),不受语句位置影响
System.out.println("*****学生管理系统*****"); System.out.println("新增学生"); System.out.println("修改学生"); System.out.println("删除学生"); System.out.println("查询学生"); System.out.println("********************"); System.out.println("请输入功能:"); String i = scanner.next(); switch (i){ case "新增学生": System.out.println("新增学生"); break; case "修改学生": System.out.println("修改学生"); break; case "删除学生": System.out.println("删除学生"); break; case "查询学生": System.out.println("查询学生"); break; default:{ System.out.println("无效输入"); break; } }