表达式自动提升类型
一个表达式中包含多种数据类型时,结果的数据类型会自动提升,规则如下:
- byte、short、char自动提升为int
- 整个表达式的类型提升到最高级的数据类型
注意
- 直接写3.14这样的小数,默认类型为double
- 直接写一个整数的数字,默认类型为int
- char类型的数据转换为int型时输出的是ascii码对应的值
float f1 = 3.14f;//直接写3.14这样的小数,默认类型为double
int i1 = 263114; //直接写一个整数的数字,默认类型为int
byte b1 = 3;
byte b2 = 2;
int sun1 = b1 + b2; //b1 和 b2 自动提升类型为int
short s1 = 3;
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);
long l1 = 6;
//因为表达式中有一个long类型的加数,所以这整个表达式的结果提升为long
long sum4 = l1 + s1 + b1;
//练习
short s3 = 5;
//s3 = a3 -2;
//表达式中的2是int,表达式的结果为int,这个结果是错误的
字面量(直接量)
在代码中直接出现的数字或者字符串,叫做字面量
//字面量
int m = 20;//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);
int i1 = Integer.parseInt(str);//把字符中转为int类型
System.out.println(2 + i1);
Java里的数据类型
Java常见的运行时异常
-
java.lang.NullPointerException
这个异常的解释是 "程序遇上了空指针 (空指针异常),简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。
-
java.lang.ClassNotFoundException
异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可
-
java.lang.ArrayIndexOutOfBoundsException
这个异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了.
-
java.lang.NoSuchMethodError
方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。
-
java.lang.IndexOutOfBoundsException
索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。
-
java.lang.NumberFormatException
数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
-
java.sql.SQLException
Sql语句执行异常
-
java.io.IOException
输入输出异常
-
java.lang.IllegalArgumentException
方法参数错误
-
java.lang.IllegalAccessException
无访问权限异常
运算符
运算符是一种特殊的符号,用于数据计算、赋值和比较。运算符将多个操作数连接在一起,就成为了表达式。
Java运算符包含以下几类:
- 算数运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三目运算符
算数运算符
Java里的算术运行算符包含: + - * / % ++ –
-
+运算符除了数学的相加作用外,还可以用于字符串的拼接
int sum1 = 3 + 2; String str1="加法的和等于:"+ sum1;//+用于字符串,自动把后面int类型的数字转为字符串 System.out.println(str1); String str2 = sum1 + "这是和";//字符串和其他类型拼接时顺序无关 System.out.println(str2); String str3 = "字符串和布尔类型拼接" + true;//字符串可以和所有的基本数据类型拼接 System.out.println(str3);
-
做减法运算
-
*做乘法运算
-
/做除法运算
整除的结果也为整数(舍弃小数部分);整除时不能用0做除数
浮点数相除结果有小数;浮点数相除时河以用0作为除数,结果时lnfinityint res1; res1 =8 / 4; System.out.println("8/4:" + res1); res1=8/3; //两个整数相除,得到的结果是整数,舍弃小数部分 (整除) System.out.println("8/3:" + res1); /* res1 = 5 / 0; System.out.println("8 / 0" + res1); //不能用0做除数,会出异常 */ double res2 = 8/2.5; //只要有一个操作数为小数,结果就是小数 System.out.println("8/2.5 " + res2); res2 = 10 / 3.0; System.out.println("10/3.0 " + res2); res2 = 5.0 / 0;//浮点数除法,除数可以为零,得到的结果是Infinity(无穷大) System.out.println("5.0/0:" + res2);//5.0/0:Infinity
-
%模运算用于得到除法的余数
整数取模,除数不能为0
小数取模,除数可以为0,得到的结果是NaN(Not a Number)(表示不是一个数字)//取模运算 res1 = 5 % 3;//结果是余数 System.out.println("5%3:" + res1); /* res1 = 5 % 0;//模运算也不能用0作为除数 System.out.println("5%0:" + res1); */ res2 = 5.1 % 3; System.out.println("5.0%3:" + res2);//结果为NaN(表示结果不是一个数字)
-
++称为单目运算符(只有一个操作数),自己加1,可以放在操作数左边或右边
-
–称为单目运算符,自己减1,可以放在操作数的左边或右边
//++ --单目运算符
int k = 1;
res1 = 5 + k++;
/*自己加1,++在后面,操作数先参与运算,然后再加1
*等效于: res1=5+k;
* k =k +1;
* */
System.out.println(res1);
int res3;
int j = 1;
res3= 5 + ++j;
/*j自加1,++在前面,先自己加,再参与表达式运算
* 等效于: k =k +1;
* res1=5+k;
*/
System.out.println(res3);
System.out.println(j);
赋值运算符
- = 赋值,把等号右边的值赋给左边的变量
//赋值运算
int n = 5;//赋值字面量
n = 3 + 2;//赋值表达式
n = k - j;//赋值含有变量的表达式
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)型(true或者false)
//比较运算符
System.out.println(3 >2);//true
System.out.println(2 == 2);//true
System.out.println(3 < 2);//false
System.out.println(2 != 2);//false
System.out.println(3 >= 3);//true
System.out.println(3 <= 2);//false
逻辑运算符
-
&& 短路与
-
& 与
-
|| 短路或
-
| 或
-
! 非
-
^ 异或
//逻辑运算符
System.out.println("--------逻辑运算------------");
//&& 短路与,两个操作数都为true,结果才为true
System.out.println(true && true);
System.out.println(true && false);
n = 1;
//如果根据第一个操作数就能觉得表达式的结果,那么第二个表达式不会再执行
System.out.println(false && (2 == ++n));//第一个操作数是于false,所以后面的表达式(2==++n)不会被执行,n还是1
System.out.println(n);
// & 与 ,有两个true才为true
System.out.println(true & true);
System.out.println(false & true);
int m = 1;
System.out.println(false & (2 == ++m));
System.out.println(m);
// || 短路或,有一个true即为true,有两个false才为false
//如果根据第一个操作数就能觉得表达式的结果,那么第二个表达式不会再执行
System.out.println(true || true);//true
System.out.println(false || true);//true
System.out.println(false || false);//false
//求反,true变false,false变true
System.out.println(!true);
System.out.println(!false);
System.out.println(!(2 == 2));
// ^ 异或,只有两个操作数不同时返回true,相同(都true或者都false)返回false
System.out.println(true ^ false);//true
System.out.println(false ^ false);//false
System.out.println(true ^ true);//false
位运算符
-
& 按位与
-
| 按位或
-
~ 按位非
-
^ 按位异或
-
<<向左移位
-
>>向右移位
-
>>>无符号移位
//位运算符 System.out.println("-------位运算符----------------"); int a = 5;//101 int b = 7;//111 System.out.println(a & b);//5 101 System.out.println(a | b);//7 111 a = -5; System.out.println(~a);// 4 a = 5; System.out.println(a^b); //2,010 /** * 面试题:请用性能最优的方式计算:2 * 8 */ a = 2; System.out.println(a << 3); //16 , 二进制10 左移3位得到二进制数 10000 System.out.println(5 >> 2); System.out.println(5 >>> 2); System.out.println(-5 >>> 2);
三目运算符
三目运算符用于两分支的判断,等效于if else语句
语法:条件表达式? 为真值:为假值
条件表达式为真输出:前面的值 条件表达式为假输出:后面的值
//三目运算符
res1 = 3 > 2 ? 100 : 500;
System.out.println(res1);
- 练习:从控制台输入两个整数,打印出较大的数
import java.util.Scanner;
public class Work {
public static void main(String[] args) {
//打印较大的数
Scanner scanner = new Scanner(System.in);
System.out.println("请输入两个整数:");
int a = scanner.nextInt();
int b = scanner.nextInt();
int i1 = a > b ? a : b ;
System.out.println( a + "和" + b + "其中较大的数为:" + i1);
}
}
运算符的优先级
括号>单目运算符>算术运算>比较运算符>逻辑运算符>三目>赋值
//运算符优先级
/*
*第一步,计算括号: 5 * ++a == 8 ? true:false
*第二步,计算++: 5 * 6 == 8 ? trUe:false
*第三步,计算*: 30 == 8 ? trUe:false
*结果:false
*/
a = 5;
System.out.println((3 + 2) * ++a == 8 ? true : false);
int i1 = a > b ? a : b ;
System.out.println( a + "和" + b + "其中较大的数为:" + i1);
}
}
### 运算符的优先级
括号>单目运算符>算术运算>比较运算符>逻辑运算符>三目>赋值
[外链图片转存中...(img-aIiHMD7Z-1659346829465)]
```java
//运算符优先级
/*
*第一步,计算括号: 5 * ++a == 8 ? true:false
*第二步,计算++: 5 * 6 == 8 ? trUe:false
*第三步,计算*: 30 == 8 ? trUe:false
*结果:false
*/
a = 5;
System.out.println((3 + 2) * ++a == 8 ? true : false);