# day02——数据类型、运算符
二、数据类型转换
2.1 自动类型转换
各位同学,接下来我们来学习类型转换的知识。为什么要学习类型转换呢?因为在我们实际开发中可能存在将某种类型变量的值,赋值给另一个类型的变量;也可能存在多种数据类型的数据一起运算的情况。
在以上情况中,其实都会涉及到类型转换。类型转换的形式总体分为2种,一种是自动类型转换,一种是强制类型转换。 这里先学习自动类型转换
- 什么是自动类型转换呢?
答:自动类型转换指的是,数据范围小的变量可以直接赋值给数据范围大的变量 byte a = 12; int b = a; //这里就发生了自动类型转换(把byte类型转换int类型)
- 自动类型转换的原理是怎样的?
答:自动类型转换其本质就是在较小数据类型数据前面,补了若干个字节
除了byte和int之间的转换之外,其他类型也可以转换,转换顺序如下图所示
下面我们通过代码演示一下,自动类型转换的各种形式。
public class TypeConversionDemo1 { public static void main(String[] args) { // 目标:理解自动类型转换机制。 byte a = 12; int b = a; // 发生了自动类型转换了 System.out.println(a); System.out.println(b); int c = 100; // 4 double d = c;// 8 发生了自动类型转换了 System.out.println(d); char ch = 'a'; // 'a' 97 => 00000000 01100001 int i = ch; // 发生了自动类型转换了 => 00000000 00000000 00000000 01100001 System.out.println(i); } }
- 表达式的自动类型转换
自动类型转换还有另外一种形式,就是表达式的自动类型转换。所谓表达式指的是几个变量或者几个数据一起参与运算的式子。
如果同一个表达式中,出现不同类型的变量或者数据一起运算,这种情况下运算结果是一个什么数据类型呢?需要遵守下面的两条运算规则:
1.多种数据类型参与运算,其结果以大的数据类型为准 2.byte,short,char 三种类型数据在和其他类型数据运算时,都会转换为int类型再运算
接下来我们来看代码演示,自己试一试
public class TypeConversionDemo2 { public static void main(String[] args) { // 目标:掌握表达式的自动类型转换机制。 byte a = 10; int b = 20; long c = 30; long rs = a + b + c; System.out.println(rs); double rs2 = a + b + 1.0; System.out.println(rs2); byte i = 10; short j = 30; int rs3 = i + j; System.out.println(rs3); // 面试笔试题: 即使两个byte运算,结果也会提升为int byte b1 = 110; byte b2 = 80; int b3 = b1 + b2; System.out.println(b3); } }
2.2 强制类型转换
前面我们学习了自动类型转换,我们知道可以将数据类型小的数据可以直接赋值给数据范围大的变量。 那反过来,能不能将数据范围大的数据直接赋值给数据范围小的变量呢? 答案是会报错。
因为数据范围大的数据,赋值给数据范围小的变量,它有可能装不下;就像把一个大桶的水倒入一个小桶中,有溢出的风险。
- 什么是强制类型转换
但是你强行将范围大的数据,赋值给范围小的变量也是可以的,这里就需要用到强制类型转换。下面是强制类型转换的格式
目标数据类型 变量名 = (目标数据类型)被转换的数据;
下面是强制类型转换的代码演示
public class TypeConversionDemo3 { public static void main(String[] args) { // 目标:掌握强制类型转换。 int a = 20; byte b = (byte) a; // ALT + ENTER 强制类型转换。 System.out.println(a); System.out.println(b); int i = 1500; byte j = (byte) i; System.out.println(j); double d = 99.5; int m = (int) d; // 强制类型转换 System.out.println(m); // 丢掉小数部分,保留整数部分 } }
- 强制类型转换的原理
强制类型转换的原理,其实就是强行把前面几个字节砍掉,但是有数据丢失的风险。
到这有关数据类型和数据类型转换的内容,我们就学习完了。大家能够知道什么时候会发生自动类型转换,以及如何进行强制类型转换就可以了。
三、运算符
接下来,给同学们讲解一个在开发中用得很多的一块内容,叫做运算符。
大家知道计算机是用来处理数据的,处理数据就少不了对数据的计算,想要对数据进行计算就必须用到运算符。
运算符就是参与运算的符号。Java提供的运算符有很多种,可以分为算术下面几种
- 基本算术运算符
- 自增自减运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 三元运算符
3.1 算术运算符
先从最基本的算术运算符开始学习,算术运算符有 + - * / %
,其中*
表示乘法,/
表示除法,%
表示取余数
需要我们注意以下几点
/: 两个整数相除,结果也是一个整数 %: 表示两个数相除,取余数
需要我们注意的是:+
符号除了用于加法运算,还可以作为连接符。+
符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串。
下面通过代码演示一下各种算术运算符的运算效果
public class OperatorDemo1 { public static void main(String[] args) { // 目标:掌握基本的算术运算符的使用。 int a = 10; int b = 2; System.out.println(a + b); System.out.println(a - b); System.out.println(a * b); // 20 System.out.println(a / b); // 5 System.out.println(5 / 2); // 2.5 ==> 2 System.out.println(5.0 / 2); // 2.5 int i = 5; int j = 2; System.out.println(1.0 * i / j); // 2.5 System.out.println(a % b); // 0 System.out.println(3 % 2); // 1 System.out.println("---------------------------------------"); // 目标2:掌握使用+符号做连接符的情况。 int a2 = 5; System.out.println("abc" + a2); // "abc5" System.out.println(a2 + 5); // 10 System.out.println("itheima" + a2 + 'a'); // "itheima5a" System.out.println(a2 + 'a' + "itheima"); // 102itheima } }
3. 2 自增自减运算符
接下来,学习一种比较常用的运算符:++
和--
++
读作自增,--
读作自减; 运算规则如下
需要我们注意的是,自增自减只能对变量进行操作,不能操作字面量。具体使用时也分为两种情况,如下:
1.单独使用:++或者--放在变量前面没有区别 int a =10; a++; //11 --a; //10 System.out.println(a); //10 2.混合使用:++或者--放在变量或者前面运算规则稍有不通过 //++在后:先做其他事情,再做自增和自减 int a = 10; int b = a++; //等价于 int b = a; a++; //++在前:先自增或者自减,再做其他运输 int x = 10; int y = --x; //等价于x--; int y = x;
下面通过代码演示一下++
和--
的用法
public class OperatorDemo2 { public static void main(String[] args) { // 目标:掌握自增自减运算符的使用。 int a = 10; // a++; // a = a + 1 ++a; System.out.println(a); // a--; // a = a - 1 --a; System.out.println(a); // 自增自减只能操作变量不能操作字面量的,会报错! //System.out.println(2++); System.out.println("--------------------------------------"); int i = 10; int rs = ++i; // 先加后用 System.out.println(rs); System.out.println(i); int j = 10; int rs2 = j++; // 先用后加 System.out.println(rs2); System.out.println(j); } }
3.3 赋值运算符
接下来,我们学习赋值运算符。基本的赋值运算符其实就是=
号,意思就是把右边的数据赋值给左边的变量。
int a = 10; //将数据10赋值给左边的变量a
除了基本的赋值运算符,我们这里主要学习一下扩展的赋值运算符。有+= -= *= /= %=
我们以+=
为例来看一下它的运算规则,其他的运算符运算同理分析即可
int a = 10; //+=解析:在a原来记录值10的基础上累加5,将结果重新赋值给a; a+=5; //最终打印a的值为15 System.out.println(a);
下面通过一个首发红包的例子给大家演示一下
public class OperatorDemo3 { public static void main(String[] args) { // 目标:掌握扩展赋值运算符的使用。 // += // 需求:收红包 double a = 9.5; double b = 520; a += b; // a = (double)(a + b); System.out.println(a); // -= 需求:发红包 double i = 600; double j = 520; i -= j; // i = (double)(i - j); System.out.println(i); int m = 10; int n = 5; // m *= n; // 等价形式: m = (int)(m * n) // m /= n; // 等价形式: m = (int)(m / n) m %= n; // 等价形式: m = (int)(m % n) System.out.println(m); } }
学完扩展赋值运算符的基本使用之后,接下来我们看一个面试题
问题1:下面的代码否有问题? byte x = 10; byte y = 30; x = x + y; //这句代码有问题,因为两个byte类型数据相加,会提升为int类型; 问题2:下面的代码是否有问题? byte x = 10; byte y = 30; x+=3; //这句代码没有问题,因为这里有隐含的强制类型转换 //x+=3; 等价于 byte x = (byte)(x+y);
到这里赋值运算符就学习完了,稍微总结一下
1.基本赋值运算符: =符号含义: 把右边的值赋值给左边的变量 2.扩展赋值运算符: += -= *= /= %=符号含义:将右边的数据和左边的变量相加、相减、相乘、相除、取余数后,将结果重新赋值给左边的变量。
3.4 关系运算符
接下来我们学习一个,在实际代码中用得很多,但是又非常简单的运算符,叫关系运算符。关系运算符(也叫比较运算符)。
下图是每一种关系运算符的符号及作用,每一个关系运算符的结果都是false
下面通过代码来家演示一下,各种关系运算符的效果
public class OperatorDemo4 { public static void main(String[] args) { // 目标:掌握关系运算符的基本使用。 int a = 10; int b = 5; boolean rs = a > b; System.out.println(rs); System.out.println(a >= b); // 要么a大于b,或者a等于b System.out.println(2 >= 2); // true System.out.println(a < b); System.out.println(a <= b); // false System.out.println(2 <= 2); // true System.out.println(a == b); // false System.out.println(5 == 5); // true // 注意了:判断是否相等一定是用 == ,=是用来赋值的。 // System.out.println(a = b); System.out.println(a != b); // true System.out.println(10 != 10); // false System.out.println(false ^ true ^ false); } }
现在我们只需要知道每一种关系运算符的运算效果就行了,关于关系运算符的实际运用需要在后面学习了流程控制语句才能实际用到。
关系运算符在程序中常用于条件判断,根据条件判断的结果是true还是false,来决定后续该执行哪些操作。
3.5 逻辑运算符
学习完关系运算符之后,接下来我们学习一下逻辑运算符。我们来看一下逻辑运算符有哪些。
逻辑运算符是用来将多个条件放在一起运算,最终结果是true或者false
下面我们通过几个案例来演示一下逻辑运算符的使用
//需求1:要求手机必须满足尺寸大于等于6.95,且内存必须大于等于8. //需求2:要求手机要么满足尺寸大于等于6.95,要么内存必须大于等于8.
public class OperatorDemo5 { public static void main(String[] args) { // 目标:掌握逻辑运算符的使用。 // 需求:要求手机必须满足尺寸大于等于6.95,且内存必须大于等于8. double size = 6.8; int storage = 16; // 1、& 前后的条件的结果必须都是true ,结果才是true. boolean rs = size >= 6.95 & storage >= 8; System.out.println(rs); // 需求2:要求手机要么满足尺寸大于等于6.95,要么内存必须大于等于8. // 2、| 只要多个条件中有一个是true,结果就是true. boolean rs2 = size >= 6.95 | storage >= 8; System.out.println(rs2); // 3、!取反的意思 System.out.println(!true); // false System.out.println(!false); // true System.out.println(!(2 > 1)); // false // 4、^ 前后条件的结果相同时返回false,不同时返回true. System.out.println(true ^ true); // false System.out.println(false ^ false); // false System.out.println(true ^ false); // true System.out.println(false ^ true); // true // 5、&& 左边为false,右边不执行。 int i = 10; int j = 20; // System.out.println(i > 100 && ++j > 99); System.out.println(i > 100 & ++j > 99); System.out.println(j); // 6、|| 左边是true ,右边就不执行。 int m = 10; int n = 30; // System.out.println(m > 3 || ++n > 40); System.out.println(m > 3 | ++n > 40); System.out.println(n); } }
到这里关于逻辑运算符的规则记学习完了,给你一个运算表达式你能分析出结果就行。至于逻辑运算符的实际运用,需要在学习了流程控制语句之后,才能实际用到。
逻辑运算符在程序中常用于组合几个条件判断,根据条件判断的结果是true还是false,来决定后续该执行哪些操作。
3.6 三元运算符
接下来,我们学习今天最后一种运算符,叫做三元运算符。
先认识一下三元运算符的格式:
关系表达式? 值1 : 值2;
三元运算的执行流程:首先计算关系表达式的值,如果关系表达式的值为true,则返回值1;如果关系表达式的值为false, 则返回值2;
如下图所示:判断学生的成绩是否>=60,如果为true,就考试通过;如果为false,就成绩不合格。
接下来通过代码来演示一下,目的是让大家掌握三元运算符的格式和执行流程。
public class OperatorDemo6 { public static void main(String[] args) { // 目标:掌握三元运算符的基本使用。 double score = 58.5; String rs = score >= 60 ? "成绩及格" : "成绩不及格"; System.out.println(rs); // 需求2:找出2个整数中的较大值,并输出。 int a = 99; int b = 69; int max = a > b ? a : b; System.out.println(max); // 需求3:找3个整数中的较大值。 int i = 10; int j = 45; int k = 34; // 找出2个整数中的较大值。 int temp = i > j ? i : j; // 找出temp与k中的较大值。 int max2 = temp > k ? temp : k; System.out.println(max2); } }
3.7 运算优先级
最后我们在给大家介绍一下运算符的优先级,如果你想要知道各个运算符的优先级,哪些先算哪些后算,可以参考下面这张图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-abxMcef9-1689742236611)(assets/1660875681298.png)]
从图中我们发现,&&运算比||运算的优先级高,所以&&和||同时存在时,是先算&&再算||;
比如下面的代码
//这里&&先算 相当于 true || false 结果为true System.out.println(10 > 3 || 10 > 3 && 10 < 3); // true
最后给大家说一下,在实际开发中,其实我们很少考虑运算优先级, 因为如果你想让某些数据先运算,其实加()
就可以了,这样阅读性更高。
//有括号先算 相当于 true && false 结果为false System.out.println((10 > 3 || 10 > 3) && 10 < 3); //false
四、案例技术:获取用户键盘输入的数据
最后给大家讲一个案例技术,这个技术现在其实有一些超前,因为需要用到后面学习的知识。但是在这里讲可以让我们的学习体验度更好一点,前面案例中参与运算的数据都是在程序中写死的,下面我们想让自己键盘录入数据,然后参与程序的运行。
键盘录入这个事情,其实并不是我们自己做的,而是Java本身就提供了这样的功能,我们按照它的要求,去调用就行。
我们在安装JDK的时候,其实JDK中就已经包含了一些Java写好的代码,我们把Java写好的代码直接拿过来用就行。
比如:Scanner就是Java提供给我们用于键盘录入数据的类,为了录入不同类型的数据,还提供了不同的功能,每一个功能会有不同的名称,我们只需要调用Scanner提供的功能就可以完成键盘录入数据。
大家只需要按照下面的步骤编写代码,就可以键盘录入数据了
【第1步】:在class类上导包:一般不需要我们自己做,idea工具会自动帮助我们 导包的。 import java.util.Scanner; 【第2步】:得到一个用于键盘扫描器对象(照抄代码就行,固定格式) //Scanner是键盘扫描器对象(你就把它理解成一个东西),这个东西有录入的功能 //sc是给这个东西取的名字 Scanner sc = new Scanner(System.in); 【第3步】:开始调用sc的功能,来接收用户键盘输入的数据。 //sc这个东西有键盘录入整数的功能,这个功能的名字叫nextInt() //.表示表示调用的意思 int age = sc.nextInt(); System.out.println("我的年龄是:"+age); //sc这个东西还有键盘录入字符串的功能,这个功能的名字叫next String name = sc.next(); System.out.println("我的姓名是:"+name);
下面是完整代码演示
public class ScannerDemo1 { public static void main(String[] args) { // 1、导包:一般不需要我们自己做,idea工具会自动帮助我们 导包的。 // 2、抄写代码:得到一个键盘扫描器对象(东西) Scanner sc = new Scanner(System.in); // 3、开始 调用sc的功能,来接收用户键盘输入的数据。 System.out.println("请您输入您的年龄:"); int age = sc.nextInt(); // 执行到这儿,会开始等待用户输入一个整数,直到用户按了回车键,才会拿到数据。 System.out.println("您的年龄是:" + age); System.out.println("请您输入您的名字:"); String name = sc.next(); // 执行到这儿,会开始等待用户输入一个字符串,直到用户按了回车键,才会拿到数据。 System.out.println(name + "欢迎您进入系统~~"); } }