学习感受
今天学到了if判断语句,作业题难度也加了一些,有些打不开思维。但也正在一点点的进步!
表达式自动提升类型
在程序中出现直接写出来的数字,如果是整数默认类型为int; 如果为小数默认类型为double.
一个表达式中包含多种数据类型时,结果的数据类型会自动提升,规则如下:
- byte, short, char 自动提升为int
- 整个表达式的类型提升到最高级的数据类型
float f1 = 3.14F; //直接写3.14这样的小数, 默认类型为double
int i1 = 2147483647; //直接写一个整数的数字, 默认类型为int
byte b1 = 3;
byte b2 = 2;
int sum1 = 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 = 8;
//以为表达式中有一个long类型的加数, 所以整个表达式的结果提升为long
long sum4 = l1 + s1 + b1;
// 练习:
short s3 = 5;
// s3 = s3 - 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里的数据类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBx7GIML-1658681363399)(D:\笔记\Java基础第三天.assets\image-20220722105347604.png)]
运算符
运算符是一种特殊的符号,用于数据计算、赋值和比较。运算符将多个操作数连接在一起,就成为了表达式。
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作为除数,结果时Infinity
```java
int res1 = 8 / 4;
System.out.println("8/4: " + res1);
res1 = 8 / 3;
// 两个整数相除,得到的结果是整数,舍弃小数部分
System.out.println("8/3: " + res1);
// res1 = 8 / 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); //10/3.0:3.3333333333333335
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 % 0;
System.out.println("5.0%3:" + res2);
-
++称为单目运算符(只有一个操作数),自己加1, 可以放在操作数左边或右边、
–称为弹幕运算符,自己减1,可以放在操作数的左边或右边
int k = 1;
/*自加1, ++在后面,操作数先参与运算,然后再加1
等效于: res1 = 5 + k;
k = k + 1;
*/
res1 = 5 + k++;
System.out.println(res1); // 6
System.out.println(k); //2
int j = 1;
/*j自加1, ++在前面,先自加,再参与表达式运算
* 等效于: j = j + 1;
* res1 = 5 + j;
* */
res1 = 5 + ++j;
System.out.println(res1);//7
System.out.println(j); //2
赋值运算符
- = 赋值运算, 把=右边的结果赋给左边的变量。右边的值可以是字面量,表达式,变量,方法调用
int n = 5; //赋值字面量
n = 3 + 2; //赋值表达式
n = k - j; //赋值含有变量的表达式
Scanner scanner = new Scanner(System.in);
// n = scanner.nextInt(); //赋值一个方法返回值
System.out.println(n = 4 + 6);//10, 赋值语句会返回结果
- 扩展(组合)的赋值运算符
+= -= *= /= %= 有算术运算符和赋值运算符组合而成的
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
比较运算符
用于判断两个操作数的大小或是否相等,返回的值是布尔型。包含:
> < == >=(大于或等于) <=(小于或者等于) !=
System.out.println(3 > 2); //true
System.out.println(3 < 2); //false
System.out.println(2 == 2); //true
System.out.println(2 != 2); //false
System.out.println(3 >= 3); //true
System.out.println(3 <= 5); //true
逻辑运算符
- && 短路与
- & 与
- || 短路或
- | 或
- ! 非
- ^ 异或
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);
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
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));// 等效于 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);
三目运算符
三目运算符用于两分支的判断,等效于if else语句
语法: 条件表达式 ?为真值 :为假的值
res1 = 3 > 5 ? 100 : 0;
System.out.println(res1);
- 练习: 从控制台输入两个整数, 打印出较大的数
Scanner scanner = new Scanner(System.in);
System.out.println("输入一个整数:");
int i = scanner.nextInt();
System.out.println("输入一个整数:");
int m = scanner.nextInt();
// 如果i大于m, 返回i; 如果i小于m, 返回m
int res1 = i > m ? i : m;
System.out.println(res1);
运算符的优先级
括号 > 单目运算符 > 算术运算 > 比较运算符 > 逻辑运算符 > 三目 > 赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xCuWfKrp-1658681363402)(D:\笔记\Java基础第三天.assets\image-20220722151735095.png)]
/*
* 第一步,计算括号: 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);
条件判断语句
单分支条件判断
if(条件表达式){
//条件为真时执行的语句
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PkkjfM8J-1658681363403)(D:\笔记\Java基础第三天.assets\image-20220722155344443.png)]
int rain = 1; //是否下雨,1-下雨; 0-没有下雨
if(rain == 1) { //在下雨
System.out.println("出门要带雨伞");
}
两分支判断
if(条件表达式){
//为真执行
}else{
//为假执行
}
//性别, 1-男; 0-女
int sex = 1;
if(sex == 1){
System.out.println("男生");
}else{
System.out.println("女生");
}
作业
- 输入金额,大于15元,吃鸭血面;如果小于15,吃小面。
package com.hqyj;
import java.util.Scanner;
public class LianXi {
public static void main(String[] args) {
Scanner scanner1 = new Scanner(System.in);
System.out.println("请输入您现在拥有的金额:");
int money = scanner1.nextInt();
if (money>=15){
System.out.println("您可以吃鸭血面");
}
else {
System.out.println("您可以吃小面");
}
}
}
- 定义两个int变量,交换两个变量的值。(常规解法:定义中间变量; 不使用中间变量:和, 异或)
int a = 3
int b = 2;
交换后的结果:
a = 2;
b = 3;
package com.hqyj;
import java.util.Scanner;
public class LianXi {
public static void main(String[] args) {
Scanner scanner2 = new Scanner(System.in);
System.out.println("请输入第一个变量(整数):");
int bl1 = scanner2.nextInt();
System.out.println("请输入第二个变量(整数):");
int bl2 = scanner2.nextInt();
int bl3 = bl1;
System.out.println("交换前:" + bl1 + " , " + bl2);
bl1 = bl2;
bl2 = bl3;
System.out.println("交换后:" + bl1 + " , " + bl2);
}
}
- 在控制台输入数字(65 ~ 90), 如果不是65到90,打印”输入错误“;如果是65~90,打印出对应的字符
package com.hqyj;
import java.util.Scanner;
public class LianXi {
public static void main(String[] args) {
Scanner scanner3 = new Scanner(System.in);
System.out.println("请您输入一个65-90的整数:");
int number3 = scanner3.nextInt();
if (number3 >= 65 & number3<= 90){
char number3_1 = (char) number3;
System.out.println(number3 + ":打印对应的字符为:" + number3_1);
}
else {
System.out.println("输入错误");
}
}
}
- 指出下列代码中的问题
byte b1 = 5;
byte b2 = 6;
byte b3 = b1 + b2;
byte b3 = b1 + b2;程序会抛出异常, b1和b2相加会自动提升数据类型为int。
当一个java算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。
所有byte型、short型和char型将被提升到int型。
- 在控制台输入一个整数,打印除该数字是正数、负数、0。
package com.hqyj;
import java.util.Scanner;
public class LianXi {
public static void main(String[] args) {
Scanner scanner5 = new Scanner(System.in);
System.out.println("请您输入一个的整数:");
int number5 = scanner5.nextInt();
if (number5 == 0){
System.out.println(number5 + "是0");
}
if (number5 > 0){
System.out.println(number5 + "是正数");
}
if (number5 < 0){
System.out.println(number5 + "是负数");
}
}
}
- 控制台输入一个年份(如:2022),判断是否是闰年。(能被4整除,但不能被100整除; 能被400整除)
}
package com.hqyj;
import java.util.Scanner;
public class LianXi {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请您输入一个年份(如:2022):");
int year = scanner.nextInt();
if (year % 4 == 0 & year % 100 !=0 | year % 400 == 0){
System.out.println(year + "年是闰年");
}
else {
System.out.println(year + "年不是闰年");
}
}
}
7.收银程序。控制台输入单价, 再输入数量, 再付款金额。打印除应收金额, 付款金额, 找零金额
package com.hqyj;
import java.util.Scanner;
public class LianXi {
public static void main(String[] args) {
Scanner scanner7 = new Scanner(System.in);
System.out.println("请您输入一个单价:");
double unit_rice = scanner7.nextDouble();
System.out.println("请您输入一个数量:");
int number7 = scanner7.nextInt();
System.out.println("请您输入付款金额:");
double fk_money = scanner7.nextDouble();
double ys_money = unit_rice * number7;
double zl_money = fk_money - ys_money;
System.out.println("应收金额为:" + ys_money + ", 付款金额:" + fk_money + ", 找零金额为:" + zl_money);
}
}