JavaSE基础1:https://developer.aliyun.com/article/1580042
2.3 数据类型转换
2.3.1 为什么进行数据类型转换
在Java中要求等号左边和等号右边的类型要一致。如果出现不一致,就需要进行数据类型转换
2.3.2 自动类型转换
在数据类型兼容的情况下, 小转大就是自动类型转换
自动类型转换也称之为隐式类型转换,即不需要做任何操作
class one{ public static void main(String[] args){ //自动类型转换 byte b = 19; //i的类型为int b的类型为byte int i = b; System.out.println(i); //19 int num1 = 100; double num2 = num1; System.out.println(num2); //100.0 //char类型的自动类型转换 char c1 = 'a'; int c2 = c1; System.out.println(c2); //97 } }
2.3.3 强制类型转换
在数据类型兼容的情况下, 大转小就是强制类型转换
自动类型转换也称之为显式类型转换,需要添加对应语法
语法:(转换类型)变量
public class Demo05{ public static void main(String[] args){ //强制类型转换 double n1 = 100; //n1的类型为double n2的类型为int int n2 = (int)n1; System.out.println(n2); //100 int c3 = 97; char c4 = (char)c3; System.out.println(c4); //a //对表达式进行类型转换 double d1 = 10; double d2 = 12; int d3 = (int)(d1 + d2); System.out.println(d3); //22 } }
2.3.4 数据类型转换注意点
- 1、boolean不能参与任何数据类型转换
- 2、基本类型中范围(大小) byte short|char int long float double
- 3、强制类型转换可能会造成数据丢失
- 4、数据类型提升
- 表达式中有double,结果double
- 有float,结果float
- 有long,结果long
- 有int,结果int
- 有char、byte、short,结果为int
- 5、在Java中,任何一个整数默认都当做是int类型,
- 在Java中,任何一个小数默认都是double类型
public class Demo05{ /* 数据类型转换的注意点: 1、boolean不能参与任何数据类型转换 2、基本类型中范围(大小) byte short|char int long float double 3、强制类型转换可能会造成数据丢失 4、数据类型提升 表达式中有double,结果double 有float,结果float 有long,结果long 有int,结果int 有char、byte、short,结果为int 5、在java中,任何一个整数默认都当做是int类型, v 在java中,任何一个小数默认都是double类型 */ int m1 = 129; //0000 0000 0000 0000 0000 0000 1000 0001 byte m2 = (byte)m1; System.out.println(m2); double m3 = 10.2; int m4 = (int)m3; System.out.println(m4); short s1 = 1; short s2 = 1; //short s3 = s1 + s2; 错误 //System.out.println(s3); char x1 = 'a'; System.out.println(x1+1); } }
2.4 运算符
2.4.1 算数运算符
+ - * / % ++ --
- +号在java中有两个作用:1、字符串的拼接 2、加法运算
字符串拼接的时候,任何类型与字符串拼接最终的结果是字符串类型 - ++表示自身+1
–表示自身-1
++在前,先加+1再使用;++在后,先使用再加+1
两个操作数进行计算
操作符 | 描述 |
+ | 加、求和 |
- | 减、求差 |
* | 乘、求积 |
/ | 除、求商 |
% | 模、求余 |
int n1 = 10; byte n2 =4; System.out.println(n1/n2); //2 //如果两个数字都是int整数,结果还是int整数 double r =n1/n2; System.out.println(r); //2.0 double r1 =(double)n1/n2; System.out.println(r1); //2.5
System.out.println(5.2%3); // 2.2 System.out.println(-5.2%3); // -2.2 System.out.println(3%5); //3 无法整除的,商0余3 System.out.println(6%10); // 6 System.out.println(-6%10); // -6 System.out.println(5%-10); // 5 System.out.println(1%10); // 1
//4687,求各个位上数字的和25 public static void main(String[] args) { int num = 4678; int ge = num%10; int shi = num/10%10; int bai = num/100%10; int qian = num/1000; int sum = ge +shi +bai +qian; System.out.println(sum); }
2.4.2 赋值运算符
= += -= *= /= %=
= += -= *= /= %=
- += 例如 a +=b 即为 a = a +b;
- 等号右边值赋值给等号左边的变量。
操作符 | 描述 |
= | 直接赋值 |
+= | 求和后赋值 |
-= | 求差后赋值 |
*= | 求积后赋值 |
/= | 求商后赋值 |
%= | 求余后赋值 |
//+=和+的区别 byte b = 127; b+=1; //输出-128 不会类型提升 b++; //输出-128 也不会类型提升 //b=b+1; //编译不通过,会类型提升Incompatible types. Found: 'int', required: 'byte'
注意:运算后赋值(复合运算)的,不会自动类型提升(++ – += -= /= %= *=)
short s1 = 1;
short s2 = 1;
s2 = s1 + s2;
//错误
s2 = short ( s1 + s2 );
//正确
s2 += s1;
//正确
2.4.3 关系运算符
> < >= <= != ==
- 两个操作数进行比较,结果是一个布尔值(true / false)。
- == 一般用比较基本数据类型,在基本数据类型中只要值相等,就会返回true
- ==和equals的区别
- 重写equals比的是内容
操作符 | 描述 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
注意 float double 不要直接使用关系运算符比较(存储方式,精度丢失,近似存储,会出现误差)
用包装类double float提供的方法
2.4.4 逻辑运算符
&& || !
两个boolean类型的操作数或表达式进行逻辑比较,返回Boolean结果
操作符 | 语义 | 描述 |
&& | 短路与(并且) | 两个操作数,同时为真,结果为真 |
|| | 短路或(或者) | 两个操作数,有一个为真,结果为真 |
! | 取反(非) | 意为“不是”,真即是假,假即是真 |
int n1 =10; int n2 =8; System.out.println(n1<n2&&++n1>10); //false &&短路与之后的不执行 System.out.println(n1); //10 System.out.println(n1>n2||++n1>10); //ture ||短路或之后的不执行 System.out.println(n1); //10
- && 短路与, 即在整个运算式中只要有一个结果返回了false,就不会再执行后面的表达式
- & 非短路与,逻辑与, 不管整个运算式如何,都会执行玩所有的表达式
- || 短路或, 即在整个运算式中只要有一个结果返回了true,就不会再执行后面的表达式
- | 非短路或,逻辑或, 不管整个运算式如何,都会执行玩所有的表达式
总结:&&和||效率更高,开发常用
2.4.5 三目运算符
boolean类型表达式 ? 结果1 : 结果2;
- 布尔表达式 ? 结果1 : 结果2
- 当表达式结果为真,获得结果1当表达式结果为假,获得结果2
将判断后的结果赋值给变量
操作符 | 语义 | 描述 |
? : | 布尔表达式 ?结果1:结果2 | 当表达式结果为真,获得结果1当表达式结果为假,获得结果2 |
int java = 87; String level = java>=90?"优秀":java>=80?"良好":"一般"; System.out.println(level); //或者直接sout嵌套 int java = 92; System.out.println(java>=90?"优秀":java>=80?"良好":"一般");
public class Demo { public static void main(String[] args) { //提示用户输入两个正整数并使用变量记录 System.out.println("请输入两个整数"); Scanner sc = new Scanner(System.in); int a =sc.nextInt(); int b =sc.nextInt(); //使用三目运算符找到最大值并打印 int max = a > b ? a : b; System.out.println("最大值是 " + max); System.out.println("最大值是 " + (a > b ? a : b)); } }
2.5 控制台录入
控制台录入指的是通过键盘输入数据与程序之间进行交互
程序运行中,可在控制台(终端)手动录入数据,再让程序继续运行。
导包语法:import 包名.类名; //将外部class文件的功能引入到自身文件中。
步骤:
- 导入Scanner类,import java.util.Scanner,
- 创建Scanner类型的变量(对象)
- 使用Scanner类的方法
- .nextInt(); //获得整数
- .nextDouble(); //获得小数
- .next(); //获得字符串,只要出现空格,只截取空格前的内容
.nextLine(); //获得字符串,以enter为标记截取前面所有的内容(可以输入空格)
Scanner sc =new Scanner(System.in); System.out.println("请输入第一个字符串s"); String s = sc.next(); System.out.println("你输入的第一个字符串s为"+s); //输入jack rose,输出:你输入的字符串为jack System.out.println("请输入第二个字符串s2"); String s2 = sc.nextLine(); System.out.println("你输入的第二个字符s2串为"+s2); //直接跳过 sc.nextLine(); //读取刚才的回车 System.out.println("请输入第三个字符串s3"); String s3 = sc.nextLine(); System.out.println("你输入的第二个字符串s3为"+s3); /* 请输入第一个字符串s s a 你输入的第一个字符串s为s 请输入第二个字符串s2 你输入的第二个字符s2串为 a d f g 请输入第三个字符串s3 h j k 你输入的第二个字符串s3为h j k */
- .ext().charAt(0);//获得单个字符 char x = input.next().charAt(0);
如果输入了不匹配的数据,则会产生 java.util.InputMismatchException
- 变量接收方法的返回值
- 快捷键自动生成返回值 方法.var
//alt + enter 手动导包 // 1、创建Scanner对象 Scanner sc = new Scanner(System.in); //3、使用Scanner对象提供的方法来使用获取键盘录入的内容 System.out.println(" 请输入... "); // .var int num = sc.nextInt(); //阻塞式的方法,即这个方法不执行代码就不会往下走 System.out.println("你输入的为"+num );
//格式类型 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入一个整数"); int age = input.nextInt(); //int System.out.println("请输入一个小数"); double num = input.nextDouble(); //double System.out.println("请输入一个字符串"); String name = input.next(); //String System.out.println("请输入一个字符"); char x = input.next().charAt(0); //字符串char } }
//需求:控制台输入输出三门课程成绩,统计总分和平均分 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入java成绩"); int java = input.nextInt(); System.out.println("请输入sql成绩"); int sql = input.nextInt(); System.out.println("请输入html成绩"); int html = input.nextInt(); System.out.println("总成绩为" + (java + sql + html)); System.out.printf("平均分是%.2f",(java + sql + html) / 3.0);//保留两位小数 System.out.printf("平均分是:"+"%.2f",(java + sql + html) / 3.0); } }
案例:从键盘输入三角形的底和高,并输出三角形的面积。
//2、引入Scanner类型 import java.util.Scanner; public class Demo03{ public static void main(String[] args){ //从键盘输入三角形的底和高,并输出三角形的面积。 //1、创建键盘录入对象Scanner Scanner sc = new Scanner(System.in); System.out.println("请输入三角形的低"); double di = sc.nextDouble(); System.out.println("请输入三角形的高"); double gao = sc.nextDouble(); System.out.println("三角形的面积为:"+di*gao/2); } }