Java学习笔记2.2.1 常量与变量 - 变量

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.2.1 常量与变量 - 变量相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 学会变量的定义
  2. 了解变量的数据类型
  3. 掌握变量类型转换的方式
  4. 明确变量的作用域

编写程序对数据进行加工处理,原始数据、中间结果以及最终结果都需要存放,而变量就是内存里用来存放各种数据的容器。对于变量,顾名思义,也就是说一个变量里存放的数据在程序执行过程中是可以不断变化的。在程序执行期间,数据保持不变的容器,那就是常量了。

一、变量定义

(一)语法格式

  • 在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。

(二)案例演示

  • 创建c02.s02.p01包,在包里创建Example01

(三)变量在内存中的状态变化图

  • 经过赋值语句y = x + 3;,变量x的值没有变化,变量y的值变成3
  • 运行c02.s02.p01.Example01类,查看结果

二、变量数据类型

  • Java是一门强类型的编程语言,它对变量的数据类型有严格的限定。在定义变量时必须先声明变量的数据类型,在为变量赋值时必须赋予和变量同一种类型的值,否则程序在编译期间就会出现类型匹配错误的问题。

    Java有8种基本数据类型:byte、short、int、long、float、double、char、boolean。

(一)整数类型变量

类型名占用空间取值范围
byte8位(1个字节) − 2 7 ~ 2 7 − 1 -2^7 ~ 2^7-1 27271
short16位(2个字节) − 2 15 ~ 2 15 − 1 -2^15 ~ 2^15-1 2152151
int32位(4个字节) − 2 31 ~ 2 31 − 1 -2^31 ~ 2^31-1 2312311
long64位(8个字节) − 2 63 ~ 2 63 − 1 -2^63 ~ 2^63-1 2632631
  • 在为一个long类型的变量赋值时,所赋值的后面要加上一个字母“L”(或小写“l”),说明赋值为long类型。如果赋的值未超出int型的取值范围,则可以省略字母“L”(或小写“l”)。

(二)浮点数类型变量

类型名占用空间取值范围
float32位(4个字节)1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+38
double64位(8个字节)4.9E-324 ~ 1.7E+308,-4.9E-324 ~ -1.7E+308
  • 一个小数会被默认为double类型的值,因此在为一个float类型的变量赋值时,所赋值的后面一定要加上字母“F”(或者小写“f”),而为double类型的变量赋值时,可以在所赋值的后面加上字符“D”(或小写“d”),也可以不加。

(三)字符类型变量

  • 字符类型变量用于存储一个单一字符,在Java中用char表示。
  • Java中每个char类型的字符变量都会占用2个字节。
  • 在给char类型的变量赋值时,需要用一对英文半角格式的单引号('')把字符括起来,如'a',也可以将char类型的变量赋值为0~65535范围内的整数,计算机会自动将这些整数转化为所对应的字符,如数值97对应的字符为'a',转换可以查看ASCII码表。

(四)布尔类型变量

  • 布尔类型变量用来存储布尔值,在Java中用boolean表示,该类型的变量只有两个值,即truefalse。注意,两个布尔型常量首字母都是小写,跟Python语言不同,Python的布尔型常量首字母大写: TrueFalse

(五)演示变量数据类型

  • c02.s02.p01包里创建Example02
package c02.s02.p01;

/**
 * 功能:演示基本数据类型
 * 作者:Java课程项目组
 * 日期:2022年02月28日
 */
public class Example02 
    public static void main(String[] args) 
        // 数值型变量
        byte b = 127;
        short s = 32767;
        int i = 2147483647;
        long l = 9223372036854775807L;
        float f = 3.4028235E38f;
        double d = 1.7976931348623157E308;
        System.out.println(b + " " + s + " " + i + " " + l + " " + f + " " + d);
        // 数值型变量范围
        System.out.println("Byte.MIN_VALUE = " + Byte.MIN_VALUE);
        System.out.println("Byte.MAX_VALUE = " + Byte.MAX_VALUE);
        System.out.println("Short.MIN_VALUE = " + Short.MIN_VALUE);
        System.out.println("Short.MAX_VALUE = " + Short.MAX_VALUE);
        System.out.println("Integer.MIN_VALUE = " + Integer.MIN_VALUE);
        System.out.println("Integer.MAX_VALUE = " + Integer.MAX_VALUE);
        System.out.println("Long.MIN_VALUE = " + Long.MIN_VALUE);
        System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
        System.out.println("Float.MIN_VALUE = " + Float.MIN_VALUE);
        System.out.println("Float.MAX_VALUE = " + Float.MAX_VALUE);
        System.out.println("Double.MIN_VALUE = " + Double.MIN_VALUE);
        System.out.println("Double.MAX_VALUE = " + Double.MAX_VALUE);

        // 字符型变量
        char c1 = 'a';
        char c2 = 'A';
        int c1asc = c1;
        int c2asc = c2;
        System.out.println(c1 + "的ASCII:" + c1asc);
        System.out.println(c2 + "的ASCII:" + c2asc);

        // 转义字符
        System.out.println("你喜欢Java吗?\\n那还用说!\\n为什么喜欢呢?\\nJava排名第三!");
        System.out.println("张峰\\t\\t李玟\\t\\t王刚");

        // 布尔型变量
        boolean b1 = true;
        boolean b2 = false;
        System.out.println("b1 = " + b1 + "\\nb2 = " + b2);
    

  • 运行程序,查看结果

三、变量类型转换

  • 在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换和强制类型转换。

(一)自动类型转换

1、简单说明

  • 自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。当把一个类型取值范围小的数值直接赋给另一个取值范围大的数据类型变量时,系统就会进行自动类型转换。
  • 自动类型转换就好比将小瓶水倒入到大瓶的换装过程。我们将小瓶水倒入到大瓶中时,由于小瓶的容量比大瓶的容量小,所以倒入的水永远不可能溢出大瓶。
  • Java中支持不同数据类型之间的自动转换

2、案例演示

  • c02.s02.p01包里创建Example03
package c02.s02.p01;

/**
 * 功能:测试自动类型转换
 * 作者:Java课程项目组
 * 日期:2022年02月28日
 */
public class Example03 
    public static void main(String[] args) 
        byte b = 3;
        int i0 = b; // 允许字节型自动转换成整型
        System.out.println("i0 = " + i0);
        char c = 'a'; // 对应的ASCII码是97
        int i = c; // 允许字符型自动转换成整型
        System.out.println("i = " + i);
        long l = i; // 允许整型自动转换成长整型
        System.out.println("l = " + l);
        float f = l; // 允许长整型自动转换成浮点型
        System.out.println("f = " + f);
        double d = f; // 允许浮点型自动转换成双精度
        System.out.println("d = " + d);
    

  • 运行程序,查看结果

(二)强制类型转换

  • 强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式地声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。

  • 强制类型转换就好比将大瓶水倒入到小瓶中一样,如果大瓶中的水的容量小于小瓶的大小,那么水是可以完全倒入的;否则多出来的水就会溢出。所以系统默认不支持这种行为,只能由开发者自己决定是否进行强制类型转换。

  • 在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换情况,如将一个int类型的数转为byte类型,这样做极容易造成数据精度的丢失。

  • 出现丢失精度的原因是,变量b为int类型,在内存中占用4个字节,而byte类型的数据在内存中占用1个字节,当将变量b的类型强转为byte类型后,前面3个高位字节的数据已经丢失,这样数值就发生了改变。

(三)表达式类型自动提升

1、简单说明

  • 表达式是指由变量和运算符组成的一个算式。变量在表达式中进行运算时,也有可能发生自动类型转换,这就是表达式数据类型的自动提升,如byteshortchar类型的变量在运算期间类型会自动提升为int,然后再进行运算。

2、案例演示

  • c02.s02.p01包里创建Example04
package c02.s02.p01;

/**
 * 功能:测试表达式类型自动提升
 * 作者:Java课程项目组
 * 日期:2022年02月28日
 */
public class Example04 
    public static void main(String[] args) 
        byte b = 23;
        short s = 120;
        char c = 'a';

        int sum = b + s + c;

        System.out.println("sum = " + sum);
    

  • 运行程序,查看结果

  • 如何判断b+ s + c表达式里的各个变量类型已经自动提升到int类型?

  • 由此可以看到,变量bsc自动提升为int类型,其和也是int类型,赋给shortbyte类型变量,都是要报错的。

(四)强制类型转换

1、语法格式

目标类型 变量名 = (目标类型)值;

2、案例演示

  • c02.s02.p01包里创建Example05
package c02.s02.p01;

/**
 * 功能:测试强制类型转换
 * 作者:Java课程项目组
 * 日期:2022年02月28日
 */
public class Example05 
    public static void main(String[] args) 
        // 声明部分
        double score = 98.5;
        float s = (float) score; // 将双精度强制转换成浮点型
        long l = (long) score; // 将双精度强制转换成长整型
        int n = (int) score; // 去尾取整
        int m = (int) (score + 0.5); // 四舍五入取整
        int k = (int) (score + 1); // 进位取整

        // 输出部分
        System.out.println("score = " + score);
        System.out.println("s = " + s);
        System.out.println("l = " + l);
        System.out.println("n = " + n);
        System.out.println("m = " + m);
        System.out.println("k = " + k);
    

  • 运行程序,查看结果

四、变量作用域

(一)作用域概念

1、简单说明

  • 变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。

2、案例演示

  • c02.s02.p01包里创建Example06
  • 可以看到,在代码块里可以访问在代码块之前的变量x。但是,我们来看一下,在代码块后能否访问在代码块里定义的变量y呢?
  • 可以看到,变量y的作用域只在代码块里,出了代码块,变量y就不再存在了,因此提示“无法解析符号y”。

(二)三个级别作用域

1、简单说明

  • 从低到高,代码块级别 ⟹ \\Longrightarrow 方法级别 ⟹ \\Longrightarrow 类级别

2、案例演示

  • c02.s02.p01包里创建Example07

  • 低级别范围可以访问高级别变量,反之则不能访问,编译器会报错。

五 、课后作业

任务1、简述Java基本数据类型

  • 说明每种类型的关键字、占用多少个字节、取值范围

任务2、输入两个实数,编程计算其和差积商。

  • 提示:加减乘除运算符号分别是+-*/

以上是关于Java学习笔记2.2.1 常量与变量 - 变量的主要内容,如果未能解决你的问题,请参考以下文章

java学习笔记—— 变量常量方法

Java学习笔记之三java中的变量和常量

swift 学习笔记之---常量与变量

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:单个变量的声明与赋值

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:常量的初始化规则与枚举

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:常量的初始化定义