zoukankan      html  css  js  c++  java
  • 第一章 –– Java基础语法

    第一章 –– Java基础语法

    一丶运算的前提是数据类型必须一致(掌握)

    (1) 观点一:(掌握)

    // A: byte short char-int-long-float-double 默认大小转化时向最大的数据类型靠近, (除了 下面的观点的数据类型外)

    // B: byte short char 在运算时默认转化成int 类型进行运算

    // A: byte short char-int-long-float-double

    // B: byte short char 在运算时默认转化成int 类型进行运算

     
     
     
    14
    14
     
     
     
     
     
    1
     @Test
    2
     public void test1()
    3
     {
    4
      byte b = 4;
    5
      int i = 3;
    6
    
    
    7
    //  int sum = b + i;
    8
    //  byte sum = b + i;
    9
      short s = 2;
    10
      byte b1 = 1;
    11
      // (1) 验证成功, byte short char 在运算时默认转化成int 类型进行运算
    12
    //  short sum = s + b1;
    13
      System.out.println("sum = " + sum);
    14
     }
     
     

     

     

     注意: double和float精度不正确问题,二进制问题,使用大数据类型BigDecimal

    (2) 面试题:(掌握)

    /*

     面试题:

      byte b1=3,b2=4,b;

      b=b1+b2;

      b=3+4;

      哪句是编译失败的呢?为什么呢?

      b = b1 + b2;是有问题的。

      因为变量相加,会首先看类型问题,最终把结果赋值的也会考虑类型问题。

      常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错。

    */

     
     
     
    11
    11
     
     
     
     
     
    1
    class DataTypeDemo6 {
    2
     public static void main(String[] args) {
    3
      //定义了三个byte类型的变量,b1,b2,b3
    4
      //b1的值是3,b2的值是4,b没有值
    5
      byte b1 = 3,b2 = 4,b;
    6
    
    
    7
      //b = b1 + b2; //这个是类型提升,所有有问题
    8
    
    
    9
      b = 3 + 4; //常量,先把结果计算出来,然后看是否在byte的范围内,如果在就不报错。
    10
     }
    11
    }
     
     

     

    注意:(掌握)

    常量之间的运算结果是在编译成字节码文件时便被计算完毕, 成为一个新的常量例如: int a = 3 + 7 编译后便成为 int a = 10, 即使是  int a = 0;  a = 3 + 7;, 在编译时也会变成 int a = 3 + 7; 这就是编译器的优化效果, 但是常量是存在数据类型,  c++ 方面便可简单的看出来  const int a = 10; 这个便是常量, java中也是存在常量   例如 : private final String str = "aaaa"还存在常量对象, private final String str1 = new String("aaa");还有  float  double 类型的常量可以看出来常量存在数据类型. 0.01f这些都是常量

     

    (3)案例思考题:(掌握)

     
     
     
     
    17
    17
     
     
     
     
     
    1
    // 思考题5
    2
     // 'a' = 97
    3
     @Test
    4
     public void test6()
    5
     {
    6
      System.out.println('a');
    7
      // 这个将被虚拟机设置成 98
    8
      System.out.println('a' + 1);
    9
      // 这个在编译期间就被编译成 "helloa1"
    10
      System.out.println("hello" + 'a' + 1);
    11
      // "98hello"
    12
      System.out.println('a' + 1 + "hello");
    13
      // 5 + 5 = 55
    14
      System.out.println("5 + 5 = " + 5 + 5);
    15
      // 10= 5 + 5
    16
      System.out.println(5 + 5 + "= 5 + 5");
    17
     }
     
     
     
     
     
     
    9
    9
     
     
     
     
     
    1
     // 思考题4
    2
     // byte b = (byte)120; -127 ~ 126;
    3
     @Test
    4
     public void test5()
    5
     {
    6
      // byte b = -126;
    7
      byte b = (byte)130;
    8
      System.out.println(b);
    9
     }
     
     

     

     

     
     
     
    17
    17
     
     
     
     
     
    1
     // 思考题3:
    2
     // byte b1 = 3, b2 = 4, b;
    3
     // b = b1 + b2;
    4
     // b = 3 + 4;
    5
     @Test
    6
     public void test4()
    7
     {
    8
       byte b1 = 3, b2 = 4, b;
    9
       // b1 b2 在运行时, 类型提升了, 所以有问题
    10
    //  b = b1 + b2;
    11
       // 常量, 先把结果计算出来, 然后看是否在 byte 的范围内,
    12
       // 如果不在就报错
    13
       b = 3 + 4;
    14
       System.out.println(b);
    15
       b = 10;
    16
       System.out.println(b);
    17
     }
     
     

     

     

     
     
     
     
    13
    13
     
     
     
     
     
    1
     // 思考题2:
    2
     // 下面这两种方法有没有区别??
    3
     // float f = (float)12.345;
    4
     // float f = 12.345f;
    5
    
    
    6
     // 一个是强制转化, 一个是原先就是 float 类型
    7
     @Test
    8
     public void test3()
    9
     {
    10
      // 但是我在反编译之后发现 这下面两句都一样的处理方式
    11
       float f = (float)12.345;
    12
       float f1 = 12.345f;
    13
     }
     
     

     

     

     
     
    10
    10
     
     
     
     
     
    1
     // 思考题1:
    2
     // double d = 12.345;
    3
     // float f = d; ???
    4
     @Test
    5
     public void test2()
    6
     {
    7
      double d = 12.345;
    8
      float f = (float) d;
    9
      System.out.println(f);
    10
     }
     
     

     

     

     
     
    16
    16
     
     
     
     
     
    1
     // A: byte short char-int-long-float-double
    2
     // B: byte short char 在运算时默认转化成int 类型进行运算
    3
     @Test
    4
     public void test1()
    5
     {
    6
      byte b = 4;
    7
      int i = 3;
    8
    
    
    9
      //    int sum = b + i;
    10
      //    byte sum = b + i;
    11
      short s = 2;
    12
      byte b1 = 1;
    13
      // (1) 验证成功, byte short char 在运算时默认转化成int 类型进行运算
    14
    //  short sum = s + b1;
    15
    //  System.out.println("sum = " + sum);
    16
     }
     
     

     

     

    (4) 交换两个变量的方式, 面试题(掌握)

     
     
     
    32
    32
     
     
     
     
     
    1
    // 思考题1
    2
     // 交换两个变量值的话题, 解决方案, 平时使用和面试使用
    3
     @Test
    4
     public void test1()
    5
     {
    6
      int a = 10;
    7
      int b = 20;
    8
    
    
    9
    // 方式一: 使用第三发变量存储 工作中使用...
    10
    
    
    11
    //  int tmp = a;
    12
    //  a = b;
    13
    //  b = tmp;
    14
    //  System.out.println("a = " + a + " b = " + b);
    15
    
    
    16
    // 方式二: 面试专用, 使用 a ^ b ^ b ==> a 的方法
    17
    // 效率最高
    18
    //  a = a ^ b;
    19
    //  b = a ^ b;  // b = a == (a ^ b) ^ b;
    20
    //  a = a ^ b;  // a = b == (a ^ b) ^ a
    21
    //  System.out.println("a = " + a + " b = " + b);
    22
    
    
    23
    // 方式三: 用变量相加减的方法
    24
    //  a = a + b;
    25
    //  b = a - b;
    26
    //  a = a - b;
    27
    //  System.out.println("a = " + a + " b = " + b);
    28
    
    
    29
      // 方式四: 一句话搞定
    30
      b = (a + b) - (a = b);
    31
      System.out.println("a = " + a + " b = " + b);
    32
     }
     
     

     

     

    (5) 运算符与和或(掌握)

     

     
     
    28
    28
     
     
     
     
     
    1
    // 逻辑 && || 和 位 的 & 和 | 区分
    2
        // && 和 || 的短路效果
    3
        // && 出现左边是 false 右边就不执行了
    4
        // || 出现左边是 true 右边就不执行了
    5
        @Test
    6
        public void test2()
    7
        {
    8
            boolean a = false;
    9
            boolean b = true;
    10
            System.out.println("(1)");
    11
            System.out.println("a = " + a);
    12
            System.out.println("b = " + b);
    13
            if (a != true || (b = false))
    14
            {
    15
                // 输出的值 是 true
    16
                System.out.println("b = " + b);
    17
            }
    18
    
    
    19
            a = false;
    20
            b = true;
    21
            System.out.println("(2)");
    22
            System.out.println("a = " + a);
    23
            System.out.println("b = " + b);
    24
            if (b == false && (a = true))
    25
            {
    26
                System.out.println("a = " + a);
    27
            }
    28
        }
     
     

     

     

    (6) 面试题

     
     
     
    20
    20
     
     
     
     
     
    1
    /*
    2
         * 面试题1
    3
         * (1)
    4
         * short s = 1;
    5
         * s = s + 1;
    6
         * (2)
    7
         *  short s = 1;
    8
         * s += 1;
    9
         * */
    10
    @Test
    11
        public void test1()
    12
        {
    13
            short s = 1;
    14
            // 还是同一个问题
    15
            // 变量(short char byte )在运算的时候会被上升为 int
    16
            // 类型, 这个时候计算完毕, 但是赋值失败, 类型不符合
    17
            //      s = s + 1;
    18
            s += 1;
    19
            System.out.println(s);
    20
        }
     
     

     

     

    (7) 位移运算符(要会)

    // << 左移: 左边最高位置丢弃, 右边补齐0

    // >> 右移: 最高位是0 左边补齐 0; 最高位是1 左边补齐1

    // >>> 无符号右移: 无论最高位是 0 还是 1, 左边补齐 0

     
     
     
    44
    44
     
     
     
     
     
    1
    @Test
    2
        public void test1()
    3
        {
    4
            //<< 把<<左边的数据乘以2的移动次幂
    5
            System.out.println(3 << 2);// 12
    6
            
    7
            //>> 把>>左边的数据除以2的移动次幂
    8
            System.out.println(24 >> 2);// 6
    9
            System.out.println(24 >>> 2);// 6
    10
            
    11
            System.out.println(-24 >> 2);// 6
    12
            System.out.println(-24 >>> 2);// 乱码
    13
        }
    14
        /*
    15
        计算出3的二进制:11
    16
            00000000 00000000 00000000 00000011
    17
        (00)000000 00000000 00000000 0000001100
    18
            
    19
        >>的移动:  
    20
        计算出24的二进制:11000
    21
            原码:10000000 00000000 00000000 00011000
    22
            反码:11111111 11111111 11111111 11100111
    23
            补码:11111111 11111111 11111111 11101000
    24
            
    25
            11111111 11111111 11111111 11101000
    26
            1111111111 11111111 11111111 111010(00) 补码
    27
            
    28
            补码:1111111111 11111111 11111111 111010
    29
            反码:1111111111 11111111 11111111 111001
    30
            原码:1000000000 00000000 00000000 000110
    31
            
    32
            结果:-6
    33
            
    34
        >>>的移动:
    35
            计算出24的二进制:11000
    36
            原码:10000000 00000000 00000000 00011000
    37
            反码:11111111 11111111 11111111 11100111
    38
            补码:11111111 11111111 11111111 11101000
    39
            
    40
            11111111 11111111 11111111 11101000
    41
            0011111111 11111111 11111111 111010(00)
    42
            
    43
            结果:
    44
    */
     
     

     

     

     

    (8) 面试题

     

    /*    

        面试题:

        请用最有效率的方式写出计算2乘以8的结果?

            2 * 8

            

            2 << 3

            */

     

    (9) 三目运算符(要会)

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

    // 1. 获得两个数的最大值

        // 2. 获得三个数的最大值

        // 3. 比较两个整数是否相等

        

      

     
     
    34
    34
     
     
     
     
     
    1
    @Test
    2
        public void test3()
    3
        {
    4
            // 3. 比较两个整数是否相等
    5
            int m = 20;
    6
            int n = 10;
    7
            boolean flag = (m == n) ? true : false;
    8
            System.out.println(flag);
    9
        }
    10
        @Test
    11
        public void test2()
    12
        {
    13
            // 2. 获得三个数的最大值
    14
            int x = 10;
    15
            int y = 30;
    16
            int z = 20;
    17
            
    18
            // (1)
    19
            int tmp = (x > y) ? x : y;
    20
            int max = (tmp > y) ? tmp : y;
    21
            System.out.println("max = " + max);
    22
            // (2) 一步到位
    23
            int max1 = (x > y) ? (x > z ? x : z) : (y > z ? y : z);
    24
            System.out.println("max1 = " + max1);
    25
        }
    26
        @Test
    27
        public void test1()
    28
        {
    29
            // 1. 获得两个数的最大值
    30
            int x = 10;
    31
            int y = 20;
    32
            int max = (x > y) ? x : y;
    33
            System.out.println("max = " + max);
    34
        }
     
     
     

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

     

    注意:

     
     
     
    4
    4
     
     
     
     
     
    1
    // 写一个程序需要考虑:
    2
        // (1) 成功的数据
    3
        // (2) 错误的错误
    4
        // (3) 边界问题
     
     
    
    
    

    switch的使用方法

    1. switch(表达式)中表达式的返回值必须是下述几种类型之一:byteshortcharint,枚举,String

     

    2. case子句中的值必须是常量,且所有case子句中的值应是不同的;

     

    3. default子句是可任选的,当没有匹配的case时,执行default

     

    4. break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾

    5. 附加跳出多层循环的方法,  goto tab;

     

     

     

    、方法的重载(overload)

    1、重载的概念

    在同一个类中允许存在一个以上的同名方法只要它们的参数个数或者参数类型不同即可

    2、重载的特点

    与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。------ 这个和函数签名有关, 函数签名只要函数名和函数参数, 并没有函数的返回值

    3. 重载示例

    //返回两个整数的和

     
     
     
    1
    1
     
     
     
     
     
    1
     int add(int x,int y){return x+y;}
     
     

    //返回三个整数的和

     
     
     
    1
    1
     
     
     
     
     
    1
    int add(int x,int y,int z){return x+y+z;}
     
     

    //返回两个小数的和

     
     
     
    1
    1
     
     
     
     
     
    1
     double add(double x,double y){return x+y;}
     
     

     

     
     
     
    9
    9
     
     
     
     
     
    1
    public class PrintStream{
    2
    public static void print(int i) {……}
    3
    public static void print(float f) {……}
    4
    private static void print(String s) {……}
    5
    public static void main(String[] args){
    6
        print(3)
    7
        print(1.2f)
    8
        print(“hello!)
    9
    }
     
     

     

    4. 判断方式:

    void show(int a,char b,double c){}构成重载的有:

     
     
     
    7
    7
     
     
     
     
     
    1
    a)void show(int x,char y,double z){}   //no
    2
    b)int show(int a,double c,char b){}   //yes
    3
    c)  void show(int a,double c,char b){}  //yes
    4
    d)  boolean show(int c,char b){}  //yes
    5
    e)  void show(double c){}  //yes
    6
    f)  double show(int x,char y,double z){}  //no
    7
    g)  void shows(){double c}  //no
     
     

     

     函数重载只看参数个数和类型,不看返回值。

     

    例子:

     

    int biggest(int a,int b,int c);

    {

    ......

    }

    float biggest(float a,float b)

    {

    ......

    }

    float biggest(float a,float b,float c)

    {

    ......

    }

     

    以上三个函数都可以。

    但不能出现只是返回值不同的重载。

    int biggest(int a,int b);

    {

    ......

    }

    float biggest(int a,int b)

    {

    ......

    }

    、体会可变个数的形参

    //下面采用数组形参来定义方法

     
     
     
    1
    1
     
     
     
     
     
    1
    public static void test(int a ,String[] books);
     
     

    //以可变个数形参来定义方法

     
     
     
    1
    1
     
     
     
     
     
    1
    public static void test(int a ,String…books);
     
     

    说明:

    1.可变参数:方法参数部分指定类型的参数个数是可变多个

    2.声明方式:方法名(参数的类型名...参数名)

    3.可变参数方法的使用与方法参数部分使用数组是一致的

    4.方法的参数部分有可变形参,需要放在形参声明的最后

     

     
     
    17
    17
     
     
     
     
     
    1
    public void test(String[] msg){
    2
        System.out.println(“含字符串数组参数的test方法 ");
    3
    }
    4
    public void test1(String book){
    5
        System.out.println(****与可变形参方法构成重载的test1方法****");
    6
    }
    7
    public void test1(String ... books){
    8
        System.out.println("****形参长度可变的test1方法****");
    9
    }
    10
    public static void main(String[] args){
    11
        TestOverload to = new TestOverload();
    12
        //下面两次调用将执行第二个test方法
    13
        to.test1();
    14
        to.test1("aa" , "bb");
    15
        //下面将执行第一个test方法
    16
        to.test(new String[]{"aa"});
    17
    }
     
     

     

     

     

    、方法的参数传递

    1. 方法,必须有其所在类或对象调用才有意义。若方法含有参数:

    Ø形参:方法声明时的参数

    Ø实参:方法调用时实际传给形参的参数值

    2. Java的实参值如何传入方法呢?

           Java里方法的参数传递方式只有一种:值传递  即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响

    六、字段名和属性名的概念

     
    Bean层的属性名和变量名
        属性名便是在方法 set 和 get 之后的名字便是属性名
        属性名不再是变量的名字
     
     
    3
     
     
     
     
     
    1
    Bean层的属性名和变量名
    2
        属性名便是在方法 set  get 之后的名字便是属性名
    3
        属性名不再是变量的名字
     
     
     
     
     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    在python3.7下怎么安装matplotlib与numpy
    kNN(从文本文件中解析数据)
    k-近邻算法(kNN)笔记
    第二章--k-近邻算法(kNN)
    C++学习笔记一 —— 两个类文件互相引用的处理情况
    (转) C++中基类和派生类之间的同名函数的重载问题
    初试 Matlab 之去除水印
    (转) linux之sort用法
    vim 简单配置
    hdu 5358 First One
  • 原文地址:https://www.cnblogs.com/bangiao/p/9502192.html
Copyright © 2011-2022 走看看