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

主要内容

  • 变量
  • 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_变量_数据类型_类型转换_运算符)