美文网首页
Java基础02_变量_数据类型_类型转换_运算符

Java基础02_变量_数据类型_类型转换_运算符

作者: 小马哥China | 来源:发表于2020-03-02 17:01 被阅读0次

    主要内容

    • 变量
    • Java数据类型
    • Java数据类型转换
    • 运算符

    学习目标

    • 掌握变量的定义、初始化、使用及注意事项
    • 掌握Java基本数据类型的使用(4类8种)
    • 掌握数据类型的转换及其中的注意事项

    第一节 变量

    1.1 概念

    变量: 程序运行时候可以变化的量.

    思考过没有, 变量用来干什么?

    答案: 变量本质就是对"实际量"的一个指代, 就是一个代词. 和我们在数学中见到的函数变量一样, 函数的本质是因变量随着自变量的变化而变化, 所以使用x,y之类的变量来表示这个变化的数; 编程中的变量也是同样道理.

    1.2 变量的定义

    概述: 在使用变量之前, 我们首先要在程序中告诉机器, 给我们创建一个什么类型的变量, 这个声明的过程也叫做变量的定义.

    方式1(定义并初始化变量):

    ​ 数据类型 变量名 = 值;

        public static void main(String[] args){
            System.out.println("定义变量的方式1: ");
    
            //定义一个字符串类型的变量
            String studentName = "小马哥";
    
            //定义一个整形变量
            int stuAge = 30;
        }
    

    方式2(先定义变量, 用的时候再初始化):

    ​ 数据类型 变量名;

    ​ 变量名 = 值;

        public static void main(String[] args){
            System.out.println("定义变量的方式2: ");
            
            //定义一个字符串类型的变量
            String studentName;         
            //定义一个整形变量
            int stuAge;       
    
            /*
            其它代码
            */
            
            //变量初始化
            stuAge = 30;
            studentName = "小马哥";
        }
    

    1.3 变量的使用

    变量定义和初始化的目的是为了使用的, 如何使用呢? 直接调用变量的名字.

    //使用"定义并初始化"之后的变量: 打印
    System.out.println("学员姓名: "+studentName);
    System.out.println("学员年龄: "+stuAge);
    

    1.4 注意事项

    学习提示: 以下各个注意事项, 先自己测试思考总结到你自己的笔记上, 然后对比讲义的实验结果.

    • 1,变量使用之前,必须初始化;
    • 2,使用变量的时候,必须有这个变量;
    • 3,变量在相同的作用域下不能重名;
    • 4,在不同的作用域中,变量不能互相使用
    • 5,变量可以同时定义,但是初始化赋值只能单独的

    代码演示:

    试验1: 使用变量前, 不进行初始化的后果

    public class Demo03_warning1{
        public static void main(String[] args){
    //      1,变量使用之前,必须初始化;
            String name;
            System.out.println(name);
        }
    }
    

    ​ 运行结果:

    D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning1.java
    Demo03_warning1.java:5: 错误: 可能尚未初始化变量name
                    System.out.println(name);
                                       ^
    1 个错误
    

    ​ 结果解释:

    ​ Demo03_warning1.java:5: 错误: 可能尚未初始化变量name

    ​ 代表在 Demo03_warning1.java 文件的第 5 行代码出现错误

    试验2: 使用变量之前, 没有定义变量的结果

    public class Demo03_warning2{
        public static void main(String[] args){
            //2,使用变量的时候,必须有这个变量;
            System.out.println(studentName);
            System.out.println(contry);
        }
    }
    

    ​ 运行结果:

    Demo03_warning2.java:3: 错误: 找不到符号
                    System.out.println(studentName);
                                       ^
      符号:   变量 studentName
      位置: 类 Demo03_warning2
    Demo03_warning2.java:4: 错误: 找不到符号
                    System.out.println(contry);
                                       ^
      符号:   变量 contry
      位置: 类 Demo03_warning2
    2 个错误
    

    试验3: 变量在相同的作用域下不能重名;(定义多个重名变量试试)

    public class Demo03_warning3{
        public static void main(String[] args){
            //3, 测试定义重复的变量
            int age = 10;
            int age = 100;
            System.out.println(age);
        }
    }
    

    ​ 运行结果:

    D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning3.java
    Demo03_warning3.java:4: 错误: 已在方法 main(String[])中定义了变量 age
                    int age = 100;
                        ^
    1 个错误
    

    试验4: 当前作用域无法使用其它作用域内的变量

    public class Demo3_warning4{
        public static void main(String[] args){
    //      4,在不同的作用域中,变量不能互相使用
            {
                //Block1中定义一个变量
                String strInBlock1 = "hello java";
            }
            {
                //Block2中是否可以使用
                System.out.println(strInBlock1);
            }
        }
    }
    

    ​ 运行结果:

    D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning4.java
    Demo03_warning4.java:10: 错误: 找不到符号
                            System.out.println(strInBlock1);
                                               ^
      符号:   变量 strInBlock1
      位置: 类 Demo03_warning4
    1 个错误
    

    试验5: 变量可以同时定义,但是初始化赋值只能单独的

    public class Demo03_warning5{
        public static void main(String[] args){
            
            //方式1: 一行定义并初始化多个变量
            int x2=10,y2=20,z2=30;
    
            //方式2: 定义和初始化分开
            //1,定义多个变量一行定义多个变量
            int x1,y1,z1;
            //2,分别初始化多个变量
            x1=10;y1=20;z1=30; //写在一行和不写在一行没区别, 有分号就相当于分在三行.
    
            //错误的写法: 但是不能如下这样
            int x3,y3,z3 = 10,20,30;
        }
    }
    

    ​ 运行结果

    D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo03_warning5.java
    Demo03_warning5.java:14: 错误: 需要<标识符>
                    int x3,y3,z3 = 10,20,30;
                                      ^
    1 个错误
    

    第二节 Java数据类型

    2.1 概述

    ​ 有没有想过一个问题: 程序在内存中运行的时候, CPU处理的所有数据都统一成一种类型不可以吗? 为什么要给数据划分类型? 为什么还要划分成基本的, 复杂的多种类型呢?

    ​ 答案: 如果几百个G的数据到加载到内存中, 还有可能实现, 几百个TB或者几百个PB的数据呢? 所以, 内存永远是不够大的, 针对不同的数据分配不同大小的内存空间, 实际是为了节省内存空间. 这个不同大小的空间体现在你写程序的时候, 就是不同的数据类型.

    2.2 变量种类

      • 基本数据类型: (四类,八种)

        • 整形 byte(1), short(2), int(4), long(8) 默认类型int类型
        • 浮点型 float(4), double(8) 默认类型double类型
        • 字符型 char(2)
        • 布尔型 boolean(1)
      • 复杂数据类型, 引用数据类型:

        • 数组,字符串
        • 接口
    • 操作: 练习定义并使用各种类型的变量

    2.3 注意事项

    ​ 1, 整形数据类型默认为int类型

    ​ 2, 浮点型的数据类型默认为double类型

    在定义long型的时候,想要表示long型,那么值后面加一个字母l或者L

    在定义float型的时候,为了表示float型,那么值后面加一个字母f或者F

    第三节 Java数据类型转换

    3.1 概述

    ​ 为什么要进行数据类型的转换?

    ​ 直观来看, 进行一个赋值操作 int num = 3.14;发现赋值运算符=两边的数据类型的不统一的. 一个是int另外一个是float.计算机要如何操作呢, 罢工吗?

    ​ 遇到两边取值范围(本质上是两种类型的数据占用内存空间不一样大), Java定义了两种类型转换的方式.

    3.2 类型转换的种类

    • ​ 自动类型转换

      也被称作隐式类型转换, 由Java自动完成, 条件是赋值运算符的左边为大范围类型, 右边是小范围类型

      语法格式: 大类型 变量名 = 小类型;

      // java会自动将10这个int常量转换为long类型赋值给amount变量
      long amount = 10;       //左边是long类型, 右边是int类型
      //long amount = 10L;    //常量使用L结尾标识后, 这样才是两边数据类型一致
      
      // java会自动将100这个int常量转换为float类型赋值给number变量
      float number = 100;     //左边是float类型, 右边是int类型
      //float number = 100F;  //常量使用F结尾标识后, 代表这是一个float型常量, 两边数据类型一致
      
    • ​ 强制类型转换

      上面是将小数据范围的数赋值给大数据范围的变量, 没有什么数值损失, 反之呢?这就需要我们程序员强制转换了, java不会自动承担这个类型转换带来的后果. 于是强制转换需要我们程序员明确操作.

      语法格式: 小数据类型 变量名 = (小数据范围类型) 大数据类型范围的数据

      首先测试, 程序员不采取任何操作什么现象

      public class Demo04_dataType2{
          public static void main(String[] args){
              //大范围的float类型常量3.14,赋值给小范围的变量number
              int number = 3.14F;
          }
      }
      

      运行结果: 不兼容的类型: 从float转换到int可能会有损失这就是前面说的, java不给你承担损失, 抛出错误.

      D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo04_dataType2.java
      Demo04_dataType2.java:4: 错误: 不兼容的类型: 从float转换到int可能会有损失
                      int number = 3.14F;
                                   ^
      1 个错误
      

      正确的方式

      public class Demo04_dataType2{
          public static void main(String[] args){
              //大范围的float类型常量3.14,赋值给小范围的变量number
              int number = (int)3.14F;
              System.out.println(number);
          }
      }
      

      运行结果

      D:\OnlineEdu\Task02 数据类型 运算符\code>javac Demo04_dataType2.java
      
      D:\OnlineEdu\Task02 数据类型 运算符\code>java Demo04_dataType2
      3
      

      结果解析: 经过强制类型转换, java会确定程序员对精度损失的结果是有考虑的.

    3.3 注意事项

    ​ 1, 一般不要轻易使用强制类型转换(除非避免不了),因为会出现精度损失,数据溢出.

    ​ 2, 特别注意: byte,short,char参加算术运算, 但是在没有超范围的情况下,会首先被提升为int

    ​ byte num1 = 10;

    ​ byte num2 = 20;

    ​ byte sum = num1+num2

    ​ 这里第三行会出现问题: 首先num1+num2的时候会自动提升为int类型

    ​ char a = 'A'

    ​ 当char类型参加运算的时候,会去ASCII码表中,寻找char类型数据对应的整数

    字符码表是什么?

    ASCII码表

    ​ 美国人整的,每个字符都对应了一个整数,128个字符表示

    UNICODE码表:万国码表,包含了所有国家的字符

    注意: char数据类型在运算时候会被自动转换为int,再去参加运算

    第四节 运算符

    4.1 种类

    ​ 算术运算符、赋值运算符、比较运算符、逻辑运算符、三目运算符

    4.2 算术运算符

    种类 符号 举例
    + 1+1, num1+num2 (除去加法这种算术运算, 还用来做字符串拼接)
    - 2-1, num1- num2
    * 10 * 10, num1 * num2
    / 101 / 10, num1 / num2 (作用保留整数部分, 除数不能为0)
    求余取模 % 101 % 10 , num1 % num2 (作用求余数)
    自加 ++i 变量++i ( 作用先自加1, 再参与运算 )
    自减 --i 变量 --i ( 作用先自减1, 再参与运算 )
    自加 i++ 变量 i++ ( 作用先参与其它运算, 后自加1 )
    自减 i-- 变量 i-- ( 作用先参与其它运算, 后自减1 )

    注意:

    ​ 1, 自加自减

    ​ 2, 字符串与其它数据类型的拼接运算

    4.3 赋值运算符

    分类: 1, 基本赋值; 2, 复合赋值.

    种类 符号 举例
    基本赋值 = num = 100;
    加赋值 += num += 1; 等价于 num = num +1;
    减赋值 -= num -= 10; 等价于 num = num -10;
    乘赋值 *= num *= 5; 等价于 num = num * 5
    除赋值 /= num /= 10; 等价于 num = num /10;
    模赋值 %= num %= 10; 等价于 num = num %10;

    注意:

    ​ byte,short,char在参与运算的时候,会被提升为int类型

    ​ byte num1 = 125;

    ​ byte num2 = 125;

    ​ byte result = 0;

    ​ result = num1+num2;

    ​ System.out.println(result);

    ​ 倒数第二行就会出现错误: 不兼容的类型: 从int转换到byte可能会有损失

    ​ 但是在复合赋值中:byte,short,char在参与运算的时候,不用程序员手动强制类型转换

    4.4 比较运算符

    作用: 如果比较的结果为真, 返回true; 反之结果返回false.

    种类 符号 举例
    相等比较 ==
    大于比较 >
    小于比较 <
    大于等于比较 >=
    小于等于比较 <=
    不等比较 !=

    4.5 逻辑运算符

    种类 符号 举例
    短路与 && i>0 && i<100 作用: 如果与判断左边为false, 右边不做判断
    短路或 || gender=="男" || age<35 作用: 如果与判断左边为true, 右边不做判断
    ! ! true, !(name==null) 作用: !true=false; !false = true
    & i>0 & i<100 作用: 无论左边是true还是false, 都计算右边
    | gender=="男"| age<35 作用: 无论左边是true还是false, 都计算右边

    4.6 三目运算符

    语法: 布尔表达式?表达式1:表达式2

    流程:

    ​ 计算布尔表达式的逻辑值

    ​ 如果是true,执行表达式1;

    ​ 如果是false,执行表达式2

    例子: 判断分数是否及格?

    int score = 100;
    String result = score>=60 ? "及格" : "不及格";
    System.out.println(result);
    

    相关文章

      网友评论

          本文标题:Java基础02_变量_数据类型_类型转换_运算符

          本文链接:https://www.haomeiwen.com/subject/nhgvkhtx.html