1.运算符和表达式
运算符:
就是对常量或者变量进行操作的符号。
比如: + - * /
表达式:
用运算符把常量或者变量连接起来的,符合Java语法的式子就是表达式。
比如:a + b 这个整体就是表达式。
而其中+是算术运算符的一种,所以这个表达式也称之为算术表达式。
2.算术运算符
分类:
+ - * / %
运算特点:
+ - * :跟小学数学中一模一样没有任何区别.
/:
1.整数相除结果只能得到整除,如果结果想要是小数,必须要有小数参数。
2.小数直接参与运算,得到的结果有可能是不精确的。
案例:
System.out.println( 10 / 3);//3 System.out.println(10.0 / 3);//3.3333333333333335
%:取模、取余。
他做的也是除法运算,只不过获取的是余数而已。
案例:
System.out.println(10 % 2);//0 System.out.println(10 % 3);//1 应用场景: //可以利用取模来判断一个数是奇数还是偶数 System.out.println(15 % 2);//1 奇数
练习:数值拆分
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
代码示例:
//1.键盘录入一个三位数 //导包 --- 创建对象 --- 接收数据 Scanner sc = new Scanner(System.in); System.out.println("请输入一个三位数"); int number = sc.nextInt();//123 //2.获取这个三位数的个位、十位、百位并打印出来 //公式: //针对于任意的一个数而言 //个位: 数字 % 10 int ones = number % 10; //十位: 数字 / 10 % 10 int tens = number / 10 % 10; //百位: 数字 / 100 % 10 int hundreds = number / 100 % 10; //输出结果 System.out.println(ones); System.out.println(tens); System.out.println(hundreds);
公式:
获取任意一个数上每一位数。
个位:数字 % 10
十位:数字 / 10 % 10
百位:数字 / 100 % 10
千位:数字 / 1000 % 10
。。。以此类推。。。
3.隐式转换
概念:
也叫自动类型提升。
就是把一个取值范围小的数据或者变量,赋值给另一个取值范围大的变量。此时不需要我们额外写代码单独实现,是程序自动帮我们完成的。
简单记忆:
就是小的给大的,可以直接给。
两种提升规则:
- 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算。
- byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算。
取值范围从小到大的关系:
byte short int long float double
4.隐式转换的练习
请看下面案例是否有误,如果有问题,请说出原因,如果没有问题,请说出运算过程和运算结果
案例一:
double d = 10; System.out.println(d);//10.0
解释:
10是整数,整数默认是int类型的。
而在取值范围的顺序中:byte short int long float double
在赋值的时候把一个int类型的赋值给了一个double类型的。把一个小的赋值给一个大的是可以直接给的。
案例二:
byte b = 100; int i = b;//可以成功赋值
解释:
因为byte的取值范围是小的,int的取值范围是大的,在底层进行了隐式转换,不需要我们额外写代码单独实现,是可以直接赋值。
案例三:
int i = 10; long n = 20L; ??? result = i + n; 问变量result是什么类型的?
解释:
变量i是int类型的,变量n是long类型的。
而在取值范围的顺序中:byte short int long float double
变量i里面的值会自动提升为long类型的,最终的结果其实就是两个long相加,那么最终的result是long类型的。
案例四:
1. int i = 10; 2. long n = 100L; 3. double d = 20.0; 4. ??? result = i + n + d; 5. 问变量result是什么类型的?
解释:
变量i是int类型,变量n是long类型,变量d是double类型。
而在取值范围的顺序中:byte short int long float double
所以变量i和变量n里面的值在参与运算的时候,都会进行类型提升,变成double。
最终其实就是三个double进行相加,那么最终的结果就是double类型的。
案例五:
byte b1 = 10; byte b2 = 20; ??? result = b1 + b2;//int 问变量result是什么类型的?
解释:
因为b1和b2都是byte类型的。所以在参与计算的时候,变量b1和变量b2里面的值都会自动提升为int类型的。最终其实就是两个int类型的相加,最终结果也是int类型的。
案例六:
byte b = 10; short s = 20; long n = 100L; ??? result = b + s + n; 问变量result是什么类型的?long
解释:
变量b是byte类型的,变量s是short类型的,变量n是long类型的。
byte,short,char类型的变量在参与运算的时候,变量里面的值会直接先提升为int。
第一步:变量b和变量s里面的值会先提升为int参与运算。
int + int + long
第二步:而long类型的取值范围是大于int的取值范围的。
所以变量b和变量s里面的值会再次提升为long。
long + long + long。
所以最终结果是long类型的。
5.强制转换
概念:
如果要把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量。是不允许直接操作。
如果一定要这么干,就需要加入强制转换。
书写格式:
目标数据类型 变量名 = (目标数据类型)被强转的数据;
简单理解:
要转成什么类型的,那么就在小括号中写什么类型就可以了。
案例:
public class OperatorDemo2 { public static void main(String[] args) { double a = 12.3; int b = (int) a; System.out.println(b);//12 } }
注意点:
强制转换有可能会导致数据发生错误。(数据的精度丢失)
6.字符串的+操作
核心技巧:
- 当+操作中出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串。
- 当连续进行+操作时,从左到右逐个执行的。
7.字符串相加的练习:
案例1:
1 + "abc" + 1
结果:"1abc1"
解释:
第一步: 1 + "abc"。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串"1abc"
第二步: "1abc" + 1。这个过程中,有字符串参与的,所以做的也是拼接操作,产生一个新的字符串"1abc1"
案例2:
1 + 2 + "abc" + 2 + 1
结果:“3abc21”
解释:
第一步:1 + 2 。在这个过程中,没有字符串参与的,所以做的是加法运算,结果为3。
第二步:3 + "abc"。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串"3abc"。
第三步:"3abc" + 2。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串"3abc2"。
第四步:"3abc2" + 1。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串“3abc21”
案例3:
String name = "黑默丁格"; System.out.println("我的名字是" + name);
结果: 我的名字是黑默丁格
解释:当字符串跟变量相加的时候,实际上是跟变量里面的值进行拼接。
8.字符的+操作
规则:
当+操作中出现了字符,会拿着字符到计算机内置的ASCII码表中去查对应的数字,然后再进行计算。
案例:
char c = 'a'; int result = c + 0; System.out.println(result);//97
ASCII码表中:
'a' ----- 97
'A' ----- 65
9.算术运算符的总结
分类:
+ - * / % 这些操作跟小学数学几乎是一模一样的。
注意点:
- / 和 % 的区别:他们两个都是做除法运算,/取结果的商。% 取结果的余数。
- 整数操作只能得到整数,如果想要得到小数,必须有浮点数参与运算。
算术运算符的高级用法:
是以+为例进行的讲解,其余减法,乘法,除法的运算规则也是一样的。
特例:字符串只有+操作,没有其他操作。