java basic 03

124 阅读7分钟

day03 笔记总结

01-自增自减运算符

  • 目标1 : 能够掌握 ++ -- 的单独使用方式
  • 目标2 : 能够理解自增自减运算符, 参与运算时候的时候, 在前和在后的区别
++ : 让变量自身的值 + 1操作
-- : 让变量自身的值 - 1操作
    
----------------------------
    
1. 单独使用(推荐)
    
    	解释: 一条语句中, 只做 ++, --
            
            	int a = 10;
				++a;
				a--;
		
		++,--放在变量的前面和后面, 没有区别
            
2. 参与运算使用(面试题-笔试)
            
        ++在前: 先自增, 再操作
            	
            	int a = 10;
				int b = ++a;	// a = 11, b = 11
				
		++在后: 先操作, 再自增
            	
            	++在后, 将该变量原本记录的值, 提取出来做操作, 然后再进行自增.
            
            	int a = 10;
				int b = a++;    // b = 10, a = 11

注意事项: 自增自减运算符, 只能操作变量, 不允许操作常量
package com.itheima.test;

public class OperatorTest1 {
    /*
        看程序说结果
     */
    public static void main(String[] args) {
        int x = 10;
        int y = ++x;
        int z = y--;

        System.out.println("x=" + x);
        System.out.println("y=" + y);
        System.out.println("z=" + z);

        System.out.println("------------------------");

        int a = 3;
        int b = (++a) + (a++) + (a * 10);

        System.out.println("a=" + a);
        System.out.println("b=" + b);     
    }
}

02-类型转换-隐式转换

  • 目标 : 能够知道哪些运算过程中, 发生了隐式转换.

  • 介绍 : 将取值范围小的数据, 或变量, 赋值给另外一个取值范围大的变量, 允许直接赋值

    • 简单记 : 小的给大的可以直接给
    • 细节 : 这里所谓的小和大, 指的是取值范围
    byte -- short -- int -- long -- float -- double
    
    注意: float虽然占用4个字节, 但是取值范围, 要比8个字节的long更大一些
    		- 小数的二进制存储形式, 比整数更加节省内存.
    
  • 运算过程中的隐式转换

    • 思路 : 在Java中, 如果数据类型不统一, 没办法直接运算
    • 解决 : 当取值范围小的数据, 和取值范围大的数据, 在一起运算, 小的会先提升为大的
      • 简单记 : 小的和大的运算, 小的先把自己提升为大的.
    int a = 10;
    double b = 12.3;
    double result = a + b;		// a + b 这句代码中, 就存在隐式转换.
    
    • 特殊注意 : byte , short , char 在运算的时候, 直接提升为 int 类型
    byte b1 = 3;
    byte b2 = 4;
    int b3 = b1 + b2;
    

03-类型转换-强制转换

  • 介绍 : 将取值范围大的数据或变量, 给取值范围小的变量赋值, 不允许直接赋值, 需要强转
    • 简单记 : 大的给小的, 不允许直接给, 需要强转
double a = 12.3;
int b = (int)a;
System.out.println(b);   // 12

注意: 12.3经过强转后, 数据变化成了12, 对于.3的丢失,我们叫做精度损失
  • 建议 : 今后尽量减少强转的时候, [有可能] 会造成精度损失.

类型转换的面试题 - 掌握

package com.itheima.test;

public class ChangeTest {
    /*
        类型转换的面试题, 看程序说结果

        byte b1 = 3;
        byte b2 = 4;
        byte b3 = b1 + b2;

        以上代码是否存在问题, 如果有请指出说明原因, 并解决!

        回答: 存在问题, 原因: b1和b2是两个byte类型, 在运算的时候, 会直接提升为int.
                    提升之后, 就是两个int相加, 两个int相加的结果还是int.
                    现在, 将int类型结果, 赋值给byte类型变量, 属于是大的给小的, 不能直接给.

                    byte b1 = 3;
                    byte b2 = 4;
                    byte b3 = (byte)(b1 + b2);

        ------------------------------------------------------------

        byte b = 3 + 4;

        以上代码是否存在问题, 如果有请指出说明原因, 并解决!

        回答: 不会!
        疑惑: 这里的3和4,是两个整数常量,所有的整数默认都是int, 两个int相加, 结果还是int
                - 将int类型结果, 赋值给byte, 属于大的给小的, 应该需要强转.

        原因: 因为3和4是两个常量, Java存在常量优化机制
                    - 在编译的时候(javac), 就会将3和4运算出一个7的结果

                    - 字节码文件(.class)
                                byte b = 7;

                    - 检查运算的结果, 是否在byte的取值范围内
                                不在: 编译出错
                                在: 编译成功
     */
    public static void main(String[] args) {

    }
}

04-赋值运算符

  • 基本赋值运算符 : =
  • 扩展赋值运算符 : += , -= , *=, /=, %=
+= : 将符号左右两边的数据, 做加法运算, 将结果赋值给左边

			int a = 10;
			a += 5;
			System.out.println(a);		// 15
            
-= : 将符号左右两边的数据, 做减法运算, 将结果赋值给左边

...
  • 细节 : 扩展赋值运算符, 底层自带强转效果
  • 目标 : 能够损使用扩展赋值运算符, 对代码进行优化
优化前 :  a = a + 10;
优化后 :  a += 10;

05-关系运算符

> 
>=
<
<=
==
!=

结论: 无论简单还是复杂, 结果都是boolean类型的true, false

注意: = 号和 == 号是有区别

		= : 赋值操作
		== : 比较操作

06-三元运算符

  • 介绍 : 可以根据一个判断条件, 达成二者选其一
  • 格式 : 判断条件 ? 值1 : 值2;
  • 执行流程 :
    • 执行判断, 看其返回结果是true, false
    • true : 值1就是最终结果
    • false : 值2就是最终结果
需求: 求两个整数的最大值

int a = 10;
int b = 20;

int max = a > b ? a : b;
package com.itheima.test;

import java.util.Scanner;

public class OperatorTest2 {
    /*
        需求: 键盘录入3个整数, 求出最小值, 中间值, 最大值, 并按照从小到大的顺序, 打印在控制台

        1. 求最大值
        2. 求最小值
        3. 求中间值  (num1+num2+num3) - max - min
        4. 并按照从小到大的顺序, 打印在控制台
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入三个整数:");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        int num3 = sc.nextInt();

        // 1. 求最大值
        int tempMax = num1 > num2 ? num1 : num2;
        int max = tempMax > num3 ? tempMax : num3;

        // 2. 求最小值
        int tempMin = num1 < num2 ? num1 : num2;
        int min = tempMin < num3 ? tempMin : num3;

        // 3. 求中间值
        int mid = num1 + num2 + num3 - max - min;

        // 4. 并按照从小到大的顺序, 打印在控制台
        System.out.println("最小值为:" + min);
        System.out.println("中间值为:" + mid);
        System.out.println("最大值为:" + max);
    }
}

07-逻辑运算符

  • 代码层面 : 逻辑运算符连接 boolean 类型的表达式, 或者是值
System.out.println(score >= 95 & score <= 100);
System.out.println(true & false);
  • 理解层面 : 可以将多个条件, 整合为一段整体的逻辑
if(score < 0 || score > 100 ){
	System.out.println("请检查您输入的成绩是否是0~100之间");
}
  • 分类 :
&(与) : 并且, 遇falsefalse
|(或) : 或者, 遇truetrue
!(非) : 取反
----------------------------------------
^(异或) : 相同为false, 不同为true

短路逻辑运算符 :

& : 没有短路效果, 无论符号左边是true, false, 右边都要继续执行
&& : 具有短路效果, 当符号左边为false的时候, 右边就不会执行了.
		如果符号左边为true, 右边要继续执行

---------------------------------------------------

| : 没有短路效果, 无论符号左边是true, false, 右边都要继续执行
|| : 具有短路效果, 当符号左边为true的时候, 右边就不会执行了.
如果符号左边为false, 右边要继续执行

---------------------------------------------------

结论: 今后逻辑运算符, 最常用的

	&& || !

08-运算符优先级

  • 目标1 : 熟练掌握 () 的使用
  • 目标2 : 常识性的运算顺序, && 的优先级, 大于 ||

09-流程控制语句

  • 介绍 : 通过一些语句, 来控制程序的执行流程
  • 分类 :
    • 顺序结构 : Java程序默认的执行结构
    • 分支结构 : if , switch
    • 循环结构 : for, while, do...while
  • 布置任务 :
    • 今晚务必预习 for 循环

10-分支语句-if

  • 目标 : 今后的需求, 只要是涉及到判断, 就要联想到 if 语句
    • 能够分析出, 使用哪一种格式.
if语句的第一种格式:

    if(判断条件){
        语句体;
    }

 执行流程:
        1. 执行() 中的判断条件, 看其返回的结果是true, false
        2. true : 执行 {} 中的语句体
        3. false : 不执行 {} 中的语句体

 注意事项:
        1. if语句 () 和 {} 之间不要写分号
        2. if语句 {} 中如果只有一条语句, {} 可以省略不写, 但是不建议!
        3. if语句 () 中, 无论简单还是复杂, 只要给它一个true, false, 就符合语法规则
if语句的第二种格式:

    if(判断条件){
        语句体1;
    }else{
        语句体2;
    }

执行流程:
    1. 执行 () 判断条件, 看其返回结果是true, false
    2. true : 执行语句体1
    3. false : 执行 else 里面的语句体2
if语句的第三种格式:

    if(判断条件1){
        语句体1;
    }else if(判断条件2){
        语句体2;
    }else if(判断条件3){
        语句体3;
    }
    ...
    else {
        语句体n+1;
    }

 执行流程:

    1. 执行判断条件1, 看其返回结果是true, false
            true : 执行语句体1, 结束整个if语句
            false : 进入第二步
    2. 执行判断条件2, 看其返回结果是true, false
            true : 执行语句体2, 结束整个if语句
            false : 进入第三步
            ...
    3. 如果给出的所有判断条件, 都是false,  将会执行最后的else, 语句体n+1
package com.itheima.test;

import java.util.Scanner;

public class IfTest1 {
    /*
        需求: 键盘录入考试成绩, 根据成绩所在的区间, 打印出不同的奖励机制

        95 ~ 100 : 奖励自行车一辆
        90 ~ 94 : 游乐场玩一次
        80 ~ 89 : 变形金刚一个
        80分以下 : 挨揍

        健壮性判断: 数据的合理性  0 ~ 100
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入考试成绩:");
        int score = sc.nextInt();

        if (score < 0 || score > 100) {
            System.out.println("请检查您输入的成绩, 是否是0~100之间");
        } else 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("挨揍");
        }
    }
}

package com.itheima.test;

import java.util.Scanner;

public class IfTest2 {
    /*
        if语句的嵌套, 实现考试奖励
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入考试成绩:");
        int score = sc.nextInt();

        if (score >= 0 && score <= 100) {

            // 代码要是能够进入这个大括号, 成绩绝对是 0 ~ 100 之间的
            // 只需要考虑, 该给什么奖励即可
            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("请检查您输入的成绩, 是否是0~100之间!");
        }
    }
}