01隐式转换
小转大
自动类型转换:
小的会自动变为大的.
byte,short,char类型在参与运算的时候,都会先变int,再参与运算.
public class Demo1Conversion {
/*
隐式转换: 将数据类型中, 取值范围小的数据, 给取值范围大的类型赋值, 可以直接赋值
*/
public static void main(String[] args) {
int a = 10; // int 4个字节
double b = a; // double 8个字节
System.out.println(b); //10.0
}
}
02强制转换
大转小
格式:
目标类型 变量名 = (目标类型)待转数据;
注意:
该转换有可能损失精度(丢失数据)
public class Demo2Conversion {
/*
强制转换: 把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
简答理解: 大的给小的, 不能直接给, 需要强转
格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
*/
public static void main(String[] args) {
int a = 10; // int 4个字节
byte b = (byte)a; // byte 1个字节 错误: 不兼容的类型: 从int转换到byte可能会有损失精度
System.out.println(b);
double num1 = 12.9;
int num2 = (int)num1;
System.out.println(num2);
}
}
03类型转换案例
public class Demo3Conversion {
/*
请找出下列代码的错误, 指出原因并解决.
*/
public static void main(String[] args) {
byte a = 3;
byte b = 4;
/*
前置知识点铺垫:
隐式转换: 当小的数据类型和大的数据类型在一起运算的时候, 小的会先提升为大的之后, 再进行运算
特殊关注: byte short char 在运算的时候, 都会直接提升为int, 然后再进行运算.
错误原因:
byte c = a + b;
这里的a和b是两个byte类型, 它们在运算之前会将自己提升为int类型, 然后再进行运算
两个int相加, 结果还是int, 想要把一个int类型的结果, 赋值给byte类型的变量
大的给小的, 不能直接给.
非要给的话, 就需要强制类型转换.
解决方案:
首先让a和b进行相加, 使用()提升算数优先级
再对相加的结果整体进行强转.
*/
byte c = (byte)(a + b); // 错误: 不兼容的类型: 从int转换到byte可能会有损失
System.out.println(c);
}
}
/*
请找出下列代码的错误, 指出原因并解决.
担心的问题:
3 和 4 是两个常量, 整数常量默认的数据类型是int
这里两个int相加, 结果还是int, int给byte赋值.
emmm... 应该需要强转吧
Java存在常量优化机制:
byte d = 3 + 4;
这里的3和4是两个常量, Java存在常量优化机制, 会在编译的时候就会让3和4进行相加, 然后会自动判断7是否在byte的取值范围内
不在范围内: 编译出错
在范围内: 通过编译
*/
public static void main(String[] args) {
byte d = 3 + 4;
System.out.println(d);
long num = 123456789123456789L;
}
}
04算数运算符
public class Demo1Operator {
/*
运算符:
对[常量]或[变量]进行操作的符号
算数运算符
+ - * : 跟小学数学的运算方式一样
/ : 整数相除,结果只能得到整数,如果想要得到带有小数的结果,必须加入小数(浮点类型)的运算
%(取模) : 取余数
*/
public static void main(String[] args){
System.out.println(10 + 20);
System.out.println(10 - 20);
System.out.println(10 * 20);
System.out.println("-----------------------");
/*
/ : 整数相除,结果只能得到整数,如果想要得到带有小数的结果,必须加入小数(浮点类型)的运算
*/
System.out.println(10 / 2); // 5
System.out.println(10 / 3); // 3
System.out.println(10 / 3.0); // 3.3333333333333335
System.out.println(10.0 / 3); // 3.3333333333333335
System.out.println("-----------------------");
/*
%(取模) : 取余数
*/
System.out.println(5 % 2); // 5 / 2 = 商2, 余数为1
}
}
05字符的+操作
06字符串的+操作
public class Demo2Operator {
/*
字符串的 + 操作
当 + 操作中出现字符串时,这个 + 是[字符串连接符],而不是算术运算。
*/
public static void main(String[] args) {
// 字符串可以使用 +号, 跟[任意数据类型]拼接
System.out.println("itheima" + 666);
System.out.println("itheima" + true);
System.out.println(1 + 99 + "年黑马");
System.out.println("5+5="+5+5); // 5+5=55
System.out.println("5+5="+(5+5)); // 5+5=10
}
}
07案例_数值拆分
import java.util.Scanner;
public class Test {
/*
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
运行结果:
请输入一个三位数:
123
整数123个位为:3
整数123十位为:2
整数123百位为:1
分析:
1:使用Scanner键盘录入一个三位数
2:个位的计算:数值 % 10
3:十位的计算:数值 / 10 % 10
4:百位的计算:数值 / 100
5:将个位, 十位, 百位拼接上正确的字符串, 打印即可
*/
public static void main(String[] args) {
// 1:使用Scanner键盘录入一个三位数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数");
int num = sc.nextInt();
// 2:个位的计算:数值 % 10
int ge = num % 10; // 123 % 10 = 3
// 3:十位的计算:数值 / 10 % 10
int shi = num / 10 % 10; // 123 / 10 = 12 12 % 10 = 2
// 4:百位的计算:数值 / 100
int bai = num / 100; // 123 / 100 = 1
// 5:将个位, 十位, 百位拼接上正确的字符串, 打印即可
System.out.println("整数"+num+"个位为:" + ge);
System.out.println("整数"+num+"十位为:" + shi);
System.out.println("整数"+num+"百位为:" + bai);
}
}
08自增自减运算符
public class Demo3Operator {
/*
自增自减运算符 :
++ : 变量自身+1
-- : 变量自身-1
++ 和-- 既可以放在变量的后边,也可以放在变量的前边。
注意:
单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的
*/
public static void main(String[] args){
int a = 10;
++a; // a = a + 1;
System.out.println(a); // 11
int b = 10;
--b;
System.out.println(b); // 9
}
}
public class Demo4Operator {
/*
参与操作:
++在前: 先对该变量做自增(++)或者自减(--),然后再拿变量参与操作。
++在后: 先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(--)。
*/
public static void main(String[] args){
// ++在前: 先对该变量做自增(++)或者自减(--),然后再拿变量参与操作。
int a = 10;
int b = ++a;
System.out.println(a); // 11
System.out.println(b); // 11
// ++在后: 先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(--)。
int aa = 10;
//bb = 10
int bb = aa++; // aa = 11
System.out.println(aa); // 11
System.out.println(bb); // 10
int num = 123;
System.out.println(num++); // 123
System.out.println(num); // 124
System.out.println(10++); // a++; a = a + 1;
// 10++; 10 = 10 + 1;
}
}
09赋值运算符
public class Demo1Operator {
/*
基本赋值运算符:
= : 将符号右侧的数据, 赋值给左边
扩展赋值运算符:
+= -= *= /= %=
+= : 将符号左右两边的数据, 做加法运算, 结果赋值给左边
*/
public static void main(String[] args) {
int a = 10;
// += : 将符号左右两边的数据, 做加法运算, 结果赋值给左边
a += 20;
System.out.println(a);
}
}
public class Demo2Operator {
/*
阅读下列代码, 查看是否存在问题, 如果有请指出并修正
*/
public static void main(String[] args) {
short s = 1;
// s是short类型, 1默认是int类型
// short和int相加, short会先提升为int, 然后再进行运算
// 提升之后, 就是两int相加, 两个int相加, 结果还是int, 将int赋值给short
// 需要加入强转.
// s = s + 1; // 错误: 不兼容的类型: 从int转换到short可能会有损失
s = (short)(s + 1);
System.out.println(s);
short ss = 1;
ss += 1; // ss = (short)(ss + 1);
// 注意: 扩展赋值运算符底层会自带强转功能
System.out.println(ss);
}
}
10关系运算符
public class Demo1Operator {
/*
关系运算符(比较运算符) :
(>) (>=) (<) (<=) (==) (!=)
*/
public static void main(String[] args){
System.out.println(10 > 20); // false
System.out.println(10 >= 20); // false
System.out.println(10 < 20); // true
System.out.println(10 <= 20); // true
System.out.println(10 == 20); // false
System.out.println(10 != 20); // true
}
}
11逻辑运算符
public class Demo1Operator {
/*
逻辑运算符作用: 用于[整合]多个比较表达式的条件
1. 连接多个比较表达式
2. 连接true或false
最终得到的结果都是boolean类型的true或false.
应用场景:
需求: 键盘录入学生成绩, 如果是90-100之间, 程序输出[优秀]
判断条件(score >= 90 & score <= 100)
需求: 键盘录入工人工号, 只要3号或者5号或者7号.
判断条件(id 3 | id 5 | id == 7)
*/
public static void main(String[] args){
int x = 10;
// true & true
// x > 5 并且 x < 15
System.out.println(x > 5 & x < 15); // true
}
}
public class Demo2Operator {
/*
逻辑运算符分类 :
&(与) : 并且, 遇false则false, 只有符号左右两边同时为true, 结果才为true.
|(或) : 或者, 遇true则true, 只有符号左边两边同时为false, 结果才为false
!(非) : 取反
^(异或) : 相同为false, 不同为true.
*/
public static void main(String[] args){
// &(与) : 并且
System.out.println(true & true); // true
System.out.println(false & false); // false
System.out.println(true & false); // false
System.out.println(false & true); // false
System.out.println("------------------");
// |(或) : 或者
System.out.println(true | true); // true
System.out.println(false | false); // false
System.out.println(true | false); // true
System.out.println(false | true); // true
System.out.println("------------------");
// !(非) : 取反
System.out.println(!true); // false
System.out.println(!!true); // true
System.out.println("------------------");
// ^(异或) :
System.out.println(true ^ true); // false
System.out.println(false ^ false); // false
System.out.println(true ^ false); // true
System.out.println(false ^ true); // true
}
}
12短路逻辑运算符
public class Demo3Operator {
/*
& 和 && 的区别 :
& : 无论符号左边是true还是false, 右边都要继续执行
&& : 具有短路效果, 符号左边为false的时候, 右边就不执行了.
如果符号左边为true, 右边要继续执行.
*/
public static void main(String[] args ){
int x = 3;
int y = 4;
// false & true
System.out.println(++x > 4 && y-- < 5); // false
System.out.println("x=" + x); // 4
System.out.println("y=" + y); // 4
}
}
13三元运算符
public class Demo1Operator {
/*
三元运算符:
格式: 关系表达式 ? 表达式1 : 表达式2;
执行流程:
首先计算关系表达式的值
如果值为true,取表达式1的值
如果值为false,取表达式2的值
需求: 求两个变量的最大值
*/
public static void main(String[] args){
int a = 10;
int b = 20;
int min = a > b ? b : a;
System.out.println(min);
}
}
14案例三个和尚
public class Test {
/*
1. 定义三个变量用于保存和尚的身高
2. 用三元运算符 , 比较前两个变量,获取较大值。
3. 用三元运算符 , 让较大值和第三个变量比较,获取最大值。
4. 输出结果
*/
public static void main(String[] args) {
// 1. 定义三个变量用于保存和尚的身高
int a = 150;
int b = 210;
int c = 165;
// 2. 用三元运算符 , 比较前两个变量,获取较大值。
int tempMax = a > b ? a : b;
// 3. 用三元运算符 , 让较大值和第三个变量比较,获取最大值。
int max = tempMax > c ? tempMax : c;
// 4. 输出结果
System.out.println(max);
int result = a > b ? a : b > c ? a > b ? a : b : c;
System.out.println(result);
}
}
15流程控制语句-顺序结构
一些语句来控制程序的执行流程,分为顺序,分支(if,switch),循环(fow,while,do…while)
顺序结构语句是Java默认的执行流程,从上到下,从左到右
public class Demo1 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
}
}
16if语句格式1
public class Demo1If {
/*
格式:
if (关系表达式) {
语句体;
}
执行流程:
首先计算关系表达式的值
如果关系表达式的值为true就执行语句体
如果关系表达式的值为false就不执行语句体
继续执行后面的语句内容
注意事项:
1. 如果if语句所控制的语句体, 是一条语句, 大括可以省略不写
但是不建议!
2. if语句的小括后面, 不要写分号
*/
public static void main(String[] args) {
System.out.println("开始");
// 如果年龄大于18岁, 就可以上网吧
int age = 17;
if(age >= 18){
// int a = 10;
System.out.println("可以上网吧");
}
System.out.println("结束");
}
}
17if语句格式2
public class Demo2If {
/*
格式:
if (关系表达式) {
语句体1;
} else {
语句体2;
}
执行流程:
首先计算关系表达式的值
如果关系表达式的值为true就执行语句体1
如果关系表达式的值为false就执行语句体2
继续执行后面的语句内容
*/
public static void main(String[] args) {
// 程序判断一个数, 是奇数还是偶数
int num = 9;
if(num % 2 == 0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
}
}
18if语句格式3
public class Demo3If {
/*
格式:
if (判断条件1) {
语句体1;
} else if (判断条件2) {
语句体2;
}
…
else {
语句体n+1;
}
执行流程:
首先计算判断条件1的值
如果值为true就执行语句体1;如果值为false就计算判断条件2的值
如果值为true就执行语句体2;如果值为false就计算判断条件3的值
…
如果没有任何判断条件为true,就执行语句体n+1。
需求:
根据学生成绩, 程序给出对应评价
90~100
优秀
80~89
良好
70~79
中等
60~69
及格
0~59
请努力加油!
*/
public static void main(String[] args){
int score = -1;
if(score >= 90 && score <= 100){
System.out.println("优秀");
}else if (score >= 80 && score <= 89){
System.out.println("良好");
}else if (score >= 70 && score <= 79){
System.out.println("中等");
}else if (score >= 60 && score <= 69){
System.out.println("及格");
}else if (score >= 0 && score <= 59){
System.out.println("请努力加油");
}else{
System.out.println("成绩有误!");
}
}
}
19案例_考勤奖励
import java.util.Scanner;
public class Test {
/*
需求:键盘录入学生考试成绩, 根据成绩程序给出不同的奖励。
95~100分 : 自行车一辆
90~94分 : 游乐场一次
80~89分 : 变形金刚一个
80分以下 : 挨顿揍, 这座城市又多了一个伤心的人~
步骤:
1. 使用Scanner录入考试成绩
2. 判断成绩是否在合法范围内 0~100
非法的话, 给出错误提示
3. 在合法的语句块中判断成绩范围符合哪一个奖励
并给出对应的奖励.
*/
public static void main(String[] args){
// 1. 使用Scanner录入考试成绩
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的成绩:");
int score = sc.nextInt();
// 2. 判断成绩是否在合法范围内 0~100
if(score >=0 && score <= 100){
// 合法成绩
// 3. 在合法的语句块中判断成绩范围符合哪一个奖励
if(score >= 95 && score <= 100){
System.out.println("自行车一辆");
}else if(score >= 90 && score <= 94){
System.out.println("游乐场一次");
}else if(score >= 80 && score <= 89){
System.out.println("变形金刚一个");
}else {
System.out.println("挨顿揍, 这座城市又多了一个伤心的人~");
}
}else{
// 非法的话, 给出错误提示
System.out.println("您的成绩输入有误!");
}
}
}