• Java03


    Java语言基础(数据类型中补充的几个小问题)

    1:在定义Long或者Float类型变量的时候,要加L或者f。
    整数默认是int类型,浮点数默认是double。

    byte,short在定义的时候,他们接收的其实是一个int类型的值。
    这个是自己做了一个数据检测的,如果不再它们的范围内,就报错。

    2:byte值的问题
    byte b1 = 127;
    byte b2 = (byte)128; //-128
    byte b3 = (byte)129; //-127
    byte b4 = (byte)130; //-126

    byte的范围:-128 ~ 127

    128:10000000
    -128:10000000 (这里的1即是符号位,也是数值位)

    3:数据类型转换之默认转换
    byte,short,char -- int -- long -- float -- double

    long: 8个字节
    float:4个字节

    A:它们底层的存储结构不同。
    B:float表示的数据范围比long的范围要大
    long:2^63-1
    float:3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1

    4:Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
    可以。因为java语言中的字符占用两个字节。

    Java语言采用的是Unicode编码。

    P5603.02_Java语言基础(算术运算符的基本用法)

    OperatorDemo.java

    /*
        运算符:
            就是对常量和变量进行操作的符号。
            
        分类:算术运算符,赋值运算符,比较运算符,逻辑运算符,位运算符,三目运算符
    
        算术运算符:
            +,-,*,/,%,++,--
            
        注意事项:
            A:整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型
            B:/获取的是除法操作的商,%获取的是除法操作的余数
    */
    
    class OperatorDemo {
        public static void main(String[] args) {
            //定义变量
            int x = 3;  //把3赋值给int类型的变量x
            int y = 4;
            
            System.out.println(x+y);
            System.out.println(x-y);
            System.out.println(x*y);
            System.out.println(x/y); //整数相除只能得到整数
            
            //我就想得到小数,该肿么办呢?
            //只需要把操作的数据中任意的一个数据变为浮点数
            System.out.println(x*1.0/y);
            
            //%的应用
            System.out.println(x%y); //得到的是余数
        }
    }

    编译:

    javac OperatorDemo.java

    运行:(省略.class)

    java OperatorDemo

    OperatorDemo2.java

    /*
        ++,--运算符的使用:
            单独使用:
                放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
            参与运算使用:
                放在操作数的前面,先自增或者自减,然后再参与运算。
                放在操作数的后面,先参与运算,再自增或者自减。
                
        作用:就是对变量进行自增1或者自减1。
    */
    class OperatorDemo2 {
            public static void main(String[] args) {
                //定义两个变量
                int x = 3;
                int y = 4;
                
                //字符串的拼接
                //System.out.println("x:"+x);  //x:3 类型字符串 字符串加谁结果都是字符串
                //System.out.println("y:"+y);
                
                System.out.println("x:"+x+",y:"+y);
                
                //单独使用
                //x++;  4 自增1
                //y--;
                ++x;
                --y;
                //System.out.println(x);
                System.out.println("x:"+x+",y:"+y);
                
                //意外的类型,常量是不可以这样做的
                //System.out.println(10++);
                
                System.out.println("-------------------");
                //参与运算使用
                int a = 3;
                int b = 4;
                
                //int c = a++;
                //int d = b--;
                
                int c = ++a;
                int d = --b;
                
                System.out.println("a:"+a); //4, 4
                System.out.println("b:"+b); //3, 3
                System.out.println("c:"+c); //3, 4
                System.out.println("d:"+d); //4, 3
            }
    }

    OperatorTest.java

    /*
        ++,--的练习题
        
        第一题:
        int a = 10;
        int b = 10;
        int c = 10;
    
        a = b++;
        c = --a;
        b = ++a;
        a = c--;
        请分别计算出a,b,c的值
        
        第二题:
        int x = 4;
        int y = (x++)+(++x)+(x*10);
        请分别计算出x,y的值
    */
    class OperatorTest {
        public static void main(String[] args) {
            int a = 10;
            int b = 10;
            int c = 10;
    
            a = b++; //a=10,b=11,c=10
            c = --a; //a=9,b=11,c=9
            b = ++a; //a=10,b=10,c=9
            a = c--; //a=9,b=10,c=8
            
            System.out.println("a:"+a);
            System.out.println("b:"+b);
            System.out.println("c:"+c);
            System.out.println("--------------");
            
            int x = 4;
            int y = (x++)+(++x)+(x*10);
            //4+6+60
            //x=5,6
            
            System.out.println("x:"+x);
            System.out.println("y:"+y);
        }
    }

    OperatorDemo3.java

    /*
        +的用法:
            A:加法
            B:正号
            C:字符串连接符
    */
    class OperatorDemo3 {
        public static void main(String[] args) {
            //加法
            System.out.println(3+4);
            
            //正号
            System.out.println(+4);
            
            System.out.println('a'); // 97
            System.out.println('a'+1); //这里是加法 97+1
            
            //字符串连接符
            System.out.println("hello"+'a'+1); // helloa1
            System.out.println('a'+1+"hello"); // 98hello
        }
    }

    赋值运算符

    /*
        赋值运算符:
            基本的赋值运算符:=
                把=右边的数据赋值给左边。
                
            扩展的赋值运算符:+=,-=,*=,/=,%=
                += 把左边和右边做加法,然后赋值给左边。
    */
    class OperatorDemo {
        public static void main(String[] args) {
            //定义一个变量
            int x = 10;
            
            //其他用法
            int a,b; 
            a = b = 10;
            System.out.println(a); 
            System.out.println(b);
            System.out.println("-----------");
    
            //定义一个变量
            int y = 10;
            
            y += 20;
            
            System.out.println(y);
            
        }
    }
    /*
        面试题:
            short s=1;s = s+1; 
            
            short s=1;s+=1;
            上面两个代码有没有问题,如果有,那里有问题。
            
            为什么第二个木有问题呢?
                扩展的赋值运算符其实隐含了一个强制类型转换。
                
                s += 1;
                不是等价于 s = s + 1;
                而是等价于 s = (s的数据类型)(s + 1);
    */
    class OperatorTest {
        public static void main(String[] args) {
            //short s = 1;
            //s = s + 1; // 可能损失精度 s先转成int
            //System.out.println(s);
            
            short s = 1;
            s += 1; //好像是 s = s + 1;
            System.out.println(s);
        }
    }

    关系运算符

    /*
        比较运算符:
            ==,!=,>,>=,<,<=
            
        特点:
            无论你的操作是简单还是复杂,结果是boolean类型。
            
        注意事项:
            "=="不能写成"="。
    */
    class OperatorDemo {
        public static void main(String[] args) {
            int x = 3;
            int y = 4;
            int z = 3;
        
            System.out.println(x == y);
            System.out.println(x == z);
            System.out.println((x+y) == (x+z));
            System.out.println("------------");
            
            System.out.println(x != y);
            System.out.println(x > y);
            System.out.println(x >= y);
            System.out.println(x < y);
            System.out.println(x <= y);
            System.out.println("------------");
            
            int a = 10;
            int b = 20;
            
            //boolean flag = (a == b);
            //boolean flag = (a = b); //这个是有问题的,不兼容的类型
            //System.out.println(flag);
            
            int c = (a = b); //把b赋值给a,然后把a留下来
            System.out.println(c);
        }
    }

    逻辑运算符

    /*
        逻辑运算符:
            &,|,^,!
            &&,||
            
        特点:
            逻辑运算符一般用于连接boolean类型的表达式或者值。
                
            表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子。
                算术表达式:a + b
                比较表达式:a == b
                
        结论:
            &逻辑与:有false则false。
            |逻辑或:有true则true。
            ^逻辑异或:相同为false,不同为true。
                举例:情侣关系。男男,男女,女男,女女
            !逻辑非:非false则true,非true则false。
                特点:偶数个不改变本身。
    */
    class OperatorDemo {
        public static void main(String[] args) {
            int a = 3;
            int b = 4;
            int c = 5;
            
            //&逻辑与
            System.out.println((a > b) & (a > c)); //false & false = false
            System.out.println((a > b) & (a < c)); //false & true = false
            System.out.println((a < b) & (a > c)); //true & false = false
            System.out.println((a < b) & (a < c)); //true & true = true
            System.out.println("---------------");
            
            //|逻辑或
            System.out.println((a > b) | (a > c)); //false | false = false
            System.out.println((a > b) | (a < c)); //false | true = true
            System.out.println((a < b) | (a > c)); //true | false = true
            System.out.println((a < b) | (a < c)); //true | true = true
            System.out.println("---------------");
            
            //^逻辑异或
            System.out.println((a > b) ^ (a > c)); //false ^ false = false
            System.out.println((a > b) ^ (a < c)); //false ^ true = true
            System.out.println((a < b) ^ (a > c)); //true ^ false = true
            System.out.println((a < b) ^ (a < c)); //true ^ true = false
            System.out.println("---------------");
            
            //!逻辑非
            System.out.println(!(a > b)); //!false = true
            System.out.println(!(a < b)); //!true = false
            System.out.println(!!(a > b)); //!!false = false
            System.out.println(!!!(a > b)); //!!false = true
        }
    }
    /*
        &&和&的区别? 同理||和|的区别?
            A:最终结果一样。
            B:&&具有短路效果。左边是false,右边不执行。
            
        开发中常用的逻辑运算符:
            &&,||,!
    */
    class OperatorDemo2 {
        public static void main(String[] args) {
            int a = 3;
            int b = 4;
            int c = 5;
            
            //&&双与
            System.out.println((a > b) && (a > c)); //false && false = false
            System.out.println((a > b) && (a < c)); //false && true = false
            System.out.println((a < b) && (a > c)); //true && false = false
            System.out.println((a < b) && (a < c)); //true && true = true
            System.out.println("----------------");
            
            int x = 3;
            int y = 4;
            
            //boolean b1 = ((x++ == 3) & (y++ == 4)); // x=4,y=5,b1=true
            //boolean b1 = ((x++ == 3) && (y++ == 4)); // x=4,y=5,b1=true
            //boolean b1 = ((++x == 3) & (y++ == 4)); // x=4,y=5,b1=false 先++再运算4==3 false
            boolean b1 = ((++x == 3) && (y++ == 4)); // x=4,y=4,b1=false 先++再运算4==3 false &&短路不执行后面运算 y还是=4
            System.out.println("x:"+x);
            System.out.println("y:"+y);
            System.out.println(b1);
        }
    }

    位运算符

    /*
        位运算符:
            &,|,^,~
            <<,>>,>>>
            
            & 
            当他左右是数值是位运算
            当他左右是bool是逻辑运算
    
        注意:
            要做位运算,首先要把数据转换为二进制。
    */
    class OperatorDemo {
        public static void main(String[] args) {
            //&,|,^,~
            
            int a = 3;
            int b = 4;
            
            System.out.println(3 & 4);
            System.out.println(3 | 4);
            System.out.println(3 ^ 4);
            System.out.println(~3);
        }
    }
    /*
        分析:因为是位运算,所以我们必须先把数据换算成二进制。
        
        3的二进制:11
            00000000 00000000 00000000 00000011
        4的二进制:100
            00000000 00000000 00000000 00000100
        
        &位与运算:有0则0。
            00000000 00000000 00000000 00000011
           &00000000 00000000 00000000 00000100
            -----------------------------------
            00000000 00000000 00000000 00000000
            结果是:0
            
        |位或运算:有1则1。
            00000000 00000000 00000000 00000011
           |00000000 00000000 00000000 00000100
            -----------------------------------
            00000000 00000000 00000000 00000111
            结果是:7
            
        ^位异或运算:相同则0,不同则1。
            00000000 00000000 00000000 00000011
           &00000000 00000000 00000000 00000100
            -----------------------------------
            00000000 00000000 00000000 00000111
            结果是:7
            
        ~按位取反运算符:0变1,1变0
            00000000 00000000 00000000 00000011 // 整数原反补都一样,计算用的是补码
           ~11111111 11111111 11111111 11111100 (补码)
           
           补码:11111111 11111111 11111111 11111100
           反码:11111111 11111111 11111111 11111011 // 补码到反码-1
           原码:10000000 00000000 00000000 00000100 // 反码到原码 符号位()不变,其他0变1,1变0
            结果是:-4
    */

    ^位异或特点

    /*
        ^的特点:一个数据对另一个数据位异或两次,该数本身不变。
       可做加密
    */ class OperatorDemo2 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println(a ^ b ^ b); //10 System.out.println(a ^ b ^ a); //20 } }

    面试题

    /*
        面试题:
            请自己实现两个整数变量的交换
            注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
    */
    class OperatorTest {
        public static void main(String[] args) {
            int a = 10;
            int b = 20;
            
            System.out.println("a:"+a+",b:"+b);
            
            //方式1:使用第三方变量(开发中用的)
            /*
            int c = a;
            a = b;
            b = c;
            System.out.println("a:"+a+",b:"+b);
            System.out.println("------------");
            */
            
            //方式2:用位异或实现(面试用)
            //左边:a,b,a
            //右边:a ^ b
            /*
            a = a ^ b;
            b = a ^ b; //a ^ b ^ b = a
            a = a ^ b; //a ^ b ^ a = b
            System.out.println("a:"+a+",b:"+b);
            */
            
            //方式3:用变量相加的做法
            /*
            a = a + b; //a=30
            b = a - b; //b=10
            a = a - b; //a=20
            System.out.println("a:"+a+",b:"+b);
            */
            
            //方式4:一句话搞定
            b = (a+b) - (a=b); //b=30-20=10,a=20
            System.out.println("a:"+a+",b:"+b);
        }
    }
    /*
        <<:左移    左边最高位丢弃,右边补齐0
        >>:右移    最高位是0,左边补齐0;最高为是1,左边补齐1
        >>>:无符号右移 无论最高位是0还是1,左边补齐0
        
        面试题:
            请用最有效率的方式写出计算2乘以8的结果?
                2 * 8
                乘法到底层最终都会转成位移
                2 << 3
    
    */
    class OperatorDemo3 {
        public static void main(String[] args) {
            //<< 把<<左边的数据乘以2的移动次幂
            System.out.println(3 << 2); //3*2^2 = 3*4 = 12;
        
            //>> 把>>左边的数据除以2的移动次幂
            System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
            System.out.println(24 >>> 2);
            
            System.out.println(-24 >> 2); 
            System.out.println(-24 >>> 2);
        }
    }
    /*
        计算出3的二进制:11
            00000000 00000000 00000000 00000011
        (00)000000 00000000 00000000 0000001100
            
        >>的移动:    
        计算出24的二进制:11000
            原码:10000000 00000000 00000000 00011000
            反码:11111111 11111111 11111111 11100111
            补码:11111111 11111111 11111111 11101000
            
            11111111 11111111 11111111 11101000
            1111111111 11111111 11111111 111010(00) 补码
            
            补码:1111111111 11111111 11111111 111010
            反码:1111111111 11111111 11111111 111001
            原码:1000000000 00000000 00000000 000110
            
            结果:-6
            
        >>>的移动:
            计算出24的二进制:11000
            原码:10000000 00000000 00000000 00011000
            反码:11111111 11111111 11111111 11100111
            补码:11111111 11111111 11111111 11101000
            
            11111111 11111111 11111111 11101000
            0011111111 11111111 11111111 111010(00)
            
            结果:
    */

    三目运算符

    /*
        单目运算符:~3
        双目运算符:3 + 4
    
        三目运算符:
            格式:比较表达式?表达式1:表达式2;
            
            比较表达式:结果是一个boolean类型。
            
            执行流程:
                根据比较表达式的计算返回一个true或者false。
                如果是true,就把表达式1作为结果。
                如果是false,就把表达式2作为结果。
    */
    class OperatorDemo {
        public static void main(String[] args) {
            int x = 100;
            int y = 200;
            
            int z = ((x > y)? x: y);
            
            //int z = ((x < y)? x: y);
            
            //int z = ((x == y)? x: y);
            
            //报错
            //int z = ((x = y)? x : y);
            
            System.out.println("z:"+z);
        }
    }
    /*
        练习:
            获取两个整数中的最大值
            获取三个整数中的最大值
            比较两个整数是否相同
    */
    class OperatorTest {
        public static void main(String[] args) {
            //获取两个整数中的最大值
            int x = 100;
            int y = 200;
            
            int max = (x > y? x: y);
            System.out.println("max:"+max);
            System.out.println("--------");
            
            //获取三个整数中的最大值
            int a = 10;
            int b = 30;
            int c = 20;
            
            //分两步:
            //A:先比较a,b的最大值
            //B:拿a,b的最大值在和c进行比较
            int temp = ((a > b)? a: b);
            //System.out.println(temp);
            int max1 = (temp > c? temp: c);
            System.out.println("max1:"+max1);
            
            //一步搞定
            //int max2 = (a > b)?((a > c)? a: c):((b > c)? b: c);
            //这种做法不推荐。
            //int max2 = a > b?a > c? a: c:b > c? b: c;
            //System.out.println("max2:"+max2);
            System.out.println("--------");
            
            //比较两个整数是否相同
            int m = 100;
            int n = 200;
            
            //boolean flag = (m == n)? true: false;
            boolean flag = (m == n);
            System.out.println(flag);
        }
    }

    键盘录入

    /*
        为了让程序的数据更符合开发的数据,我们就加入了键盘录入。
        让程序更灵活一下。
        
        那么,我们如何实现键盘数据的录入呢?
            A:导包
                格式:
                    import java.util.Scanner; 
                位置:
                    在class上面。
            B:创建键盘录入对象
                格式:
                    Scanner sc = new Scanner(System.in);
            C:通过对象获取数据    
                格式:
                    int x = sc.nextInt();
    */
    import java.util.Scanner;
    
    class ScannerDemo {
        public static void main(String[] args) {
            //创建键盘录入数据对象
            Scanner sc = new Scanner(System.in);
            
            System.out.println("请你输入一个数据:");
            int x = sc.nextInt();
            
            System.out.println("你输入的数据是:"+x);
        }
    }
    /*
        键盘录入练习:
            键盘录入两个数据,并对这两个数据求和,输出其结果
    */
    import java.util.Scanner;
    
    class ScannerTest {
        public static void main(String[] args) {
            //键盘录入两个数据,并对这两个数据求和,输出其结果
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            System.out.println("请输入第一个数据:");
            int x = sc.nextInt();
            
            System.out.println("请输入第二个数据:");
            int y = sc.nextInt();
            
            //把键盘录入的数据进行相加即可
            int sum = (x + y);
            System.out.println("sum:"+sum);
        }
    }
    /*
        键盘录入练习:键盘录入两个数据,获取这两个数据中的最大值
    */
    
    import java.util.Scanner;
    
    class ScannerTest2 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            System.out.println("请输入第一个数据:");
            int a = sc.nextInt();
            
            System.out.println("请输入第二个数据:");
            int b = sc.nextInt();
            
            //获取这两个数据中的最大值
            int max = (a > b? a: b);
            System.out.println("max:"+max);
        }
    }

    顺序结构

    /*
        流程控制语句:可以控制程序的执行流程。
        
        分类:
            顺序结构
            选择结构
            循环结构
            
        顺序结构:
            从上往下,依次执行。
    */
    class ShunXuJieGouDemo {
        public static void main(String[] args) {
            System.out.println("程序开始了");
            
            System.out.println("我爱Java");
            
            System.out.println("程序结束了");
        }
    }

    选择结构

    /*
        选择结构:
            if语句
            switch语句
            
        if语句:
            格式1
            格式2
            格式3
            
        if语句的格式:
            if(比较表达式) {
                语句体;
            }
            
            执行流程:
                先计算比较表达式的值,看其返回值是true还是false。
                如果是true,就执行语句体;
                如果是false,就不执行语句体;
    */
    class IfDemo {
        public static void main(String[] args) {
            int x = 10;
            
            if(x == 10) {
                System.out.println("x等于10");
            }
            
            if(x == 20) {
                System.out.println("x等于20");
            }
            
            System.out.println("over");
        }
    }
    /*
        if语句的注意事项:
            A:比较表达式无论简单还是复杂,结果必须是boolean类型
            B:if语句控制的语句体如果是一条语句,大括号可以省略;
              如果是多条语句,就不能省略。建议永远不要省略。
            C:一般来说:有左大括号就没有分号,有分号就没有左大括号
    */
    class IfDemo2 {
        public static void main(String[] args) {
            int x = 10;
            
            if(x == 10) {
                System.out.println("x等于10");
            }
            
            if((x > 5) || (x == 10)) {
                System.out.println("x大于或者等于10");
            }
            System.out.println("-------------------");
            
            int a = 100;
            
            /*
            if(a == 100) {
                System.out.println("a的值是100");
            }
            */
            
            if(a != 100) {
                System.out.println("a的值是100");
                System.out.println("over");
            }
            System.out.println("-------------------");
            
            int b = 100;
            if(b != 100);  //这里其实是有语句体的,只不过是空语句体。
            
            //代码块
            {
                System.out.println("b的值是100");
                System.out.println("over");
            }
        }
    }
    /*
        if语句格式2:
            if(比较表达式) {
                语句体1;
            }else {
                语句体2;
            }
        执行流程:
            首先计算比较表达式的值,看其返回值是true还是false。
            如果是true,就执行语句体1;
            如果是false,就执行语句体2;
            
        注意:else后面是没有比较表达式的,只有if后面有。
    */
    class IfDemo3 {
        public static void main(String[] args) {
            //判断两个数据是否相等
            
            int a = 10;
            int b = 20;
            
            if(a == b) {
                System.out.println("a等于b");
            }else {
                System.out.println("a不等于b");
            }
        }
    }
    /*
        if语句格式2的练习:
            A:获取两个数据中较大的值
            B:判断一个数据是奇数还是偶数,并输出是奇数还是偶数
    */
    import java.util.Scanner;
    
    class IfTest {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //获取两个数据中较大的值
            System.out.println("请输入第一个数据:");
            int a = sc.nextInt();
            
            System.out.println("请输入第二个数据:");
            int b = sc.nextInt();
            
            //定义一个变量接收最大值
            int max;
            
            if(a > b) {
                max = a;
            }else {
                max = b;
            }
            
            System.out.println("max:"+max);
            System.out.println("----------------");
            
            //判断一个数据是奇数还是偶数
            System.out.println("请输入你要判断的数据:");
            int x = sc.nextInt();
            
            if(x%2 == 0) {
                System.out.println(x+"这个数据是偶数");
            }else {
                System.out.println(x+"这个数据是奇数");
            }
        }
    }
    /*
        由于if语句的第二种格式刚才也完成了三元运算符可以完成的效果。
        所以,我们就认为他们可以完成一样的操作。
        但是,他们就一点区别没有吗?肯定不是。
        
        区别:
            三元运算符实现的,都可以采用if语句实现。反之不成立。
            
            什么时候if语句实现不能用三元改进呢?
                当if语句控制的操作是一个输出语句的时候就不能。
                为什么呢?因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。
    */
    class IfDemo4 {
        public static void main(String[] args) {
            //获取两个数据的最大值
            int a = 10;
            int b = 20;
            
            //用if语句实现
            int max1;
            if(a > b) {
                max1 = a;
            }else {
                max1 = b;
            }
            System.out.println("max1:"+max1);
            
            //用三元改进
            int max2 = (a > b)? a: b;
            System.out.println("max2:"+max2);
            System.out.println("----------");
            
            //判断一个数据是奇数还是偶数,并输出是奇数还是偶数
            int x = 100;
            
            if(x%2 == 0) {
                System.out.println("100是一个偶数");
            }else {
                System.out.println("100是一个奇数");
            } 
            
            //用三元改进
            //这种改进是错误的。
            //String s = (x%2 == 0)?System.out.println("100是一个偶数");:System.out.println("100是一个奇数");;
        }
    }
    /*
        if语句的格式3:
            if(比较表达式1) {
                语句体1;
            }else if(比较表达式2) {
                语句体2;
            }else if(比较表达式3) {
                语句体3;
            }
            ...
            else {
                语句体n+1;
            }
            
        执行流程:
            首先计算比较表达式1看其返回值是true还是false,
            如果是true,就执行语句体1,if语句结束。
            如果是false,接着计算比较表达式2看其返回值是true还是false,
            
            如果是true,就执行语句体2,if语句结束。
            如果是false,接着计算比较表达式3看其返回值是true还是false,
            ...
            
            如果都是false,就执行语句体n+1。
    */
    import java.util.Scanner;
    
    class IfDemo5 {
        public static void main(String[] args) {
            //需求:键盘录入一个成绩,判断并输出成绩的等级。
            /*
                90-100 优秀
                80-90  好
                70-80  良
                60-70  及格
                0-60   不及格
            */
            
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //录入数据
            System.out.println("请输入你的考试成绩:");
            int score = sc.nextInt();
            
            /*
            if(score>=90 && score<=100) {
                System.out.println("优秀");
            }else if(score>=80 && score<90) {
                System.out.println("好");
            }else if(score>=70 && score<80) {
                System.out.println("良");
            }else if(score>=60 && score<70) {
                System.out.println("及格");
            }else {
                System.out.println("不及格");
            }
            */
            //这样写已经满足我的基本要求,但是可能别人在使用的时候,不会按照你要求的数据给出了。
            //在做一个程序的基本测试的时候,一定要考虑这样的几个问题:
            //正确数据,错误数据,边界数据。
            //而我们刚才写的程序并没有处理错误数据,所以这个程序不是很好,要改进
            /*
            if(score>=90 && score<=100) {
                System.out.println("优秀");
            }else if(score>=80 && score<90) {
                System.out.println("好");
            }else if(score>=70 && score<80) {
                System.out.println("良");
            }else if(score>=60 && score<70) {
                System.out.println("及格");
            }else if(score>=0 && score<60){
                System.out.println("不及格");
            }else {
                System.out.println("你输入的成绩有误");
            }
            */
            
            //另一种判断改进
            if(score<0 || score>100) {
                System.out.println("你输入的成绩有误");
            }else if(score>=90 && score<=100) {
                System.out.println("优秀");
            }else if(score>=80 && score<90) {
                System.out.println("好");
            }else if(score>=70 && score<80) {
                System.out.println("良");
            }else if(score>=60 && score<70) {
                System.out.println("及格");
            }else {
                System.out.println("不及格");
            }
        }
    }
    /*
        三种if语句分别适合做什么事情呢?
            格式1:适合做单个判断
            格式2:适合做两个判断
            格式3:适合做多个判断
            
        需求:
            键盘录入x的值,计算出y的并输出。
            
            x>=3    y = 2x + 1;
            -1<=x<3    y = 2x;
            x<=-1    y = 2x – 1;
            
        分析:
            A:由于数据要键盘录入,所以必须使用Scanner。
            B:由于是三种判断,所以我们选择if语句格式3。
    */
    import java.util.Scanner;
    
    class IfTest2 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            System.out.println("请输入x的值:");
            int x = sc.nextInt();
            
            //定义一个y
            int y;
            
            //用if语句格式3进行判断
            if(x >= 3) {
                y = 2*x + 1;
            }else if(x>=-1 && x<3) {
                y = 2*x;
            }else {
                y = 2*x - 1;
            }
            
            System.out.println("y:"+y);
        }
    }
    /*
        键盘录入月份的值,输出对应的季节。
        
        春    3,4,5
        夏    6,7,8
        秋    9,10,11
        冬    12,1,2
        
        分析:
            A:键盘录入月份的值,所以我们要使用Scanner。
            B:我们应该判断这个月份在那个季节,而这个判断情况较多,所以,用if语句格式3。
            
        if语句的使用场景:
            A:针对表达式是一个boolean类型的判断
            B:针对一个范围的判断
    */
    import java.util.Scanner;
    
    class IfTest3 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //录入数据
            System.out.println("请你输入一个月份:");
            int month = sc.nextInt();
            
            //第三种格式实现即可
            if(month<1 || month>12) {
                System.out.println("你输入的月份有误");
            }else if(month == 1) {
                System.out.println("冬季");
            }else if(month == 2) {
                System.out.println("冬季");
            }else if(month == 3) {
                System.out.println("春季");
            }else if(month == 4) {
                System.out.println("春季");
            }else if(month == 5) {
                System.out.println("春季");
            }else if(month == 6) {
                System.out.println("夏季");
            }else if(month == 7) {
                System.out.println("夏季");
            }else if(month == 8) {
                System.out.println("夏季");
            }else if(month == 9) {
                System.out.println("秋季");
            }else if(month == 10) {
                System.out.println("秋季");
            }else if(month == 11) {
                System.out.println("秋季");
            }else {
                System.out.println("冬季");
            }
            System.out.println("--------------");
            
            //这个程序确实是符合了我们的需求,但是就是看起来比较麻烦
            //那么,我们能不能改进一下呢?
            //month == 3
            //month == 4
            //month == 5
            //我们发现,上面三个都是春季。
            //而他们本身每一个都是一个boolean表达式
            //所以,我们就可以考虑使用逻辑运算符给他们连接起来改进
            if(month<1 || month>12) {
                System.out.println("你输入的月份有误");
            }else if(month==3 || month==4 || month==5) {
                System.out.println("春季");
            }else if(month==6 || month==7 || month==8) {
                System.out.println("夏季");
            }else if(month==9 || month==10 || month==11) {
                System.out.println("秋季");
            }else {
                System.out.println("冬季");
            }
            System.out.println("--------------");
            
            //这个时候,程序代码以及可以了。
            //但是呢,假如我要求你输入一个月份,判断是上半年还是下半年。
            //这个时候,我们的判断条件连接就是6个boolean表达式
            //我们可能还有更多的连接
            //这个时候,其实我们还有另外的一种改进方案:
            //month == 3
            //month == 4
            //month == 5
            //month>=3 && month<=5
            //用范围也是可以改进的。
            if(month<1 || month>12) {
                System.out.println("你输入的月份有误");
            }else if(month>=3 && month<=5) {
                System.out.println("春季");
            }else if(month>=6 && month<=8) {
                System.out.println("夏季");
            }else if(month>=9 && month<=11) {
                System.out.println("秋季");
            }else {
                System.out.println("冬季");
            }
            System.out.println("--------------");
        }
    }
    /*
        获取三个数据中的最大值
        
        由此案例主要是为了讲解if语句是可以嵌套使用的。而且是可以任意的嵌套。
    */
    class IfTest4 {
        public static void main(String[] args) {
            int a = 10;
            int b = 30;
            int c = 20;
            
            //三元实现
            //int temp = (a>b)? a: b;
            //int max = (temp>c)? temp: c;
            //System.out.println("max:"+max);
            //System.out.println("--------");
            
            //用if语句实现
            int max;
            if(a > b) {
                if(a > c) {
                    max = a;
                }else {
                    max = c;
                }
            }else {
                if(b > c) {
                    max = b;
                }else {
                    max = c;
                }
            }
            System.out.println("max:"+max);
        }
    }

    1:运算符(掌握)
    (1)算术运算符
    A:+,-,*,/,%,++,--
    B:+的用法
    a:加法
    b:正号
    c:字符串连接符
    C:/和%的区别
    数据做除法操作的时候,/取得是商,%取得是余数
    D:++和--的用法
    a:他们的作用是自增或者自减
    b:使用
    **单独使用
    放在操作数据的前面和后面效果一样。
    a++或者++a效果一样。
    **参与操作使用
    放在操作数的前面:先自增或者自减,再参与操作
    int a = 10;
    int b = ++a;
    放在操作数的后面:先参与操作,再自增或者自减
    int a = 10;
    int b = a++;
    (2)赋值运算符
    A:=,+=,-=,*=,/=,%=等
    B:=叫做赋值运算符,也是最基本的赋值运算符
    int x = 10; 把10赋值给int类型的变量x。
    C:扩展的赋值运算符的特点
    隐含了自动强制转换。

    面试题:
    short s = 1;
    s = s + 1;

    short s = 1;
    s += 1;
    请问上面的代码哪个有问题?
    (3)比较运算符
    A:==,!=,>,>=,<,<=
    B:无论运算符两端简单还是复杂最终结果是boolean类型。
    C:千万不要把==写成了=
    (4)逻辑运算符
    A:&,|,^,!,&&,||
    B:逻辑运算符用于连接boolean类型的式子
    C:结论
    &:有false则false
    |:有true则true
    ^:相同则false,不同则true。
    情侣关系。
    !:非true则false,非false则true

    &&:结果和&是一样的,只不过有短路效果。左边是false,右边不执行。
    ||:结果和|是一样的,只不过有短路效果。左边是true,右边不执行。
    (5)位运算符(了解)
    A:^的特殊用法
    一个数据针对另一个数据位异或两次,该数不变
    B:面试题
    a:请实现两个变量的交换
    **采用第三方变量
    **用位异或运算符
    左边a,b,a
    右边a^b
    b:请用最有效率的方式计算出2乘以8的结果
    2<<3
    (6)三元运算符
    A:格式
    比较表达式?表达式1:表达式2;
    B:执行流程:
    首先计算比较表达式的值,看是true还是false。
    如果是true,表达式1就是结果。
    如果是false,表达式2就是结果。
    C:案例:
    a:比较两个数据是否相等
    b:获取两个数据中的最大值
    c:获取三个数据中的最大值

    2:键盘录入(掌握)
    (1)实际开发中,数据是变化的,为了提高程序的灵活性,我们加入键盘录入数据。
    (2)如何实现呢?目前就记住
    A:导包
    import java.util.Scanner;
    位置:在class的上边
    B:创建对象
    Scanner sc = new Scanner(System.in);
    C:获取数据
    int x = sc.nextInt();
    (3)把三元运算符的案例加入键盘录入改进。

    3:流程控制语句
    (1)顺序结构 从上往下,依次执行
    (2)选择结构 按照不同的选择,执行不同的代码
    (3)循环结构 做一些重复的代码

    4:if语句(掌握)
    (1)三种格式
    A:格式1
    if(比较表达式) {
    语句体;
    }

    执行流程:
    判断比较表达式的值,看是true还是false
    如果是true,就执行语句体
    如果是false,就不执行语句体

    B:格式2
    if(比较表达式) {
    语句体1;
    }else {
    语句体2;
    }

    执行流程:
    判断比较表达式的值,看是true还是false
    如果是true,就执行语句体1
    如果是false,就执行语句体2

    C:格式3
    if(比较表达式1) {
    语句体1;
    }else if(比较表达式2){
    语句体2;
    }
    ...
    else {
    语句体n+1;
    }

    执行流程:
    判断比较表达式1的值,看是true还是false
    如果是true,就执行语句体1
    如果是false,就继续判断比较表达式2的值,看是true还是false
    如果是true,就执行语句体2
    如果是false,就继续判断比较表达式3的值,看是true还是false
    ...
    如果都不满足,就执行语句体n+1
    (2)注意事项
    A:比较表达式无论简单还是复杂,结果是boolean类型
    B:if语句控制的语句体如果是一条语句,是可以省略大括号的;如果是多条,不能省略。
    建议:永远不要省略。
    C:一般来说,有左大括号,就没有分号,有分号,就没有左大括号。
    D:else后面如果没有if,是不会出现比较表达式的。
    E:三种if语句其实都是一个语句,只要有一个执行,其他的就不再执行。
    (3)案例:
    A:比较两个数是否相等
    B:获取两个数中的最大值
    C:获取三个数中的最大值(if语句的嵌套)
    D:根据成绩输出对应的等级
    E:根据月份,输出对应的季节
    F:根据x计算对应y的值并输出
    (4)三元运算符和if语句第二种格式的关系
    所有的三元运算符能够实现的,if语句的第二种格式都能实现。
    反之不成立。

    如果if语句第二种格式控制的语句体是输出语句,就不可以。
    因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。

    运算符的优先级(从高到低)

    优先级

    描述

    运算符

    1

    括号

    ()、[]

    2

    正负号

    +、-

    3

    自增自减,非

    ++、--、!

    4

    乘除,取余

    *、/、%

    5

    加减

    +、-

    6

    移位运算

    <<、>>、>>>

    7

    大小关系

    >、>=、<、<=

    8

    相等关系

    ==、!=

    9

    按位与

    &

    10

    按位异或

    ^

    11

    按位或

    |

    12

    逻辑与

    &&

    13

    逻辑或

    ||

    14

    条件运算

    ?:

    15

    赋值运算

    =、+=、-=、*=、/=、%=

    16

    位赋值运算

    &=、|=、<<=、>>=、>>>=

     

    如果在程序中,要改变运算顺序,可以使用()。

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    C#-----类DateTime的常用方法
    C#-----字节数组(byte[])和字符串相互转换
    maven执行update命令时报org/apache/maven/shared/filtering/MavenFilteringException错误
    关于dubbo服务的xml配置文件报错的问题
    The method getTextContent() is undefined for the type Node
    jetty各个版本对应的jdk版本
    dubbo启动报java.lang.ClassNotFoundException: javassist.ClassPath
    MAC下安装多版本JDK和切换几种方式
    安装第三方jar包的两种方式
    使用 Nexus 搭建私服仓库时我犯的一个小错误
  • 原文地址:https://www.cnblogs.com/hanbowen/p/10453874.html
Copyright © 2020-2023  润新知