zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【JVM】Java变量的种类(提高版)

2023-03-14 22:41:48 时间

· Java变量按数据类型分,有:①基本数据类型;②引用数据类型;

· Java变量按声明位置分,有:①成员变量;②局部变量;

见下图:

032130621623f891321493de134d44a1.png

一、按数据类型分


1.1、基本数据类型


    8种基本数据类型是Java语言内嵌的,这个最熟悉不过了,必须张口就来。主要区分一下各个数据类型的表示范围:

类型长度表示范围
byte1字节[-27 , 27-1]
short2字节[-215 , 215-1]
int4字节[-231 , 231-1]
long8字节[-263 , 263-1]
float4字节[1.4E-45~3.4E+38 , -3.4E+38~-1.4E-45]
double8字节[4.9E-324~1.7E+308 , -1.7E+308~-4.9E-324]
char2 字节ISO 单一字符集
boolean1 字节truefalse

之所以叫基本数据类型,是因为以上8个类型在JVM中都是以数值直接存储在内存中的。其中,char类型以‘uxxxx’存储,Boolean以‘0’或‘非0’存储。

1.2、引用数据类型


引用数据类型,在内存中保存的时内存地址而不是具体的值。一般地,引用存放在JVM栈(Java Virtual Machine Stack)中,而引用所指的对象是保存在JVM堆(Java Virtual Machine Heap)中的。当引用类型变量不被使用时,Java内部的垃圾回收器GC会自动回收。

二、按在类中声明位置分


【注】Java中没有全局变量。全局变量是C++中概念。

2.1、成员变量


    成员变量,在使用前,会经过默认初始化赋值。

· 静态变量/类变量

    静态变量也就是被关键字static修饰的变量,被static修饰之后,该变量自然提升为类所属的变量,也叫做类变量。

    对于此变量,在class文件被类加载器加载之后,首先在链接阶段会为静态变量赋默认值,如果静态变量的类型是8个基本数据类型,默认值为0(Boolean中0即false),如果是引用数据类型,会赋值默认值为null。

   而在初始化阶段,如果静态变量有显式赋值的话,才会为静态变量显式赋值。

· 实例变量

    实例变量是依附与实例化对象的成员变量,随着对象的创建,会在JVM堆空间分配实例变量的空间,并且默认赋值。

2.2、局部变量


    局部变量,是类中方法里面定义的变量。在JVM栈中,一个栈帧(Stack Frame)对应一个类的方法,而栈帧中通过局部变量表来保存局部变量,要求局部变量必须初始化。所以,如果需要使用此局部变量,必须显式赋值后,才可使用。

2.3、详见代码示例


/**
 * @program: zcJava
 * @author: cqHuang
 * @create: 2021-07-21 22:50
 **/

public class TestVar {
    private static int num;//成员变量 -- 基本数据型 静态变量
    private static int num_1;//成员变量 -- 基本数据型 静态变量
    private static String type;//成员变量 -- 引用型 静态变量
    private String name;//成员变量 -- 实例变量

    static {
        num = 2; // 这里 显式赋值了。
    }

    public void method(){
        int age = 1 ;//局部变量
        System.out.println(age);//age不显示赋值,编译会报错
    }

    public static void main(String[] args) {
        //静态变量,在链接阶段默认赋值 0或null
        //在默认赋值之后,如果变量还被显式赋值,那么在初始化阶段进行显示赋值
        System.out.println(TestVar.num);// 2
        System.out.println(TestVar.num_1);// 0
        System.out.println(TestVar.type);// null

        //实例变量,在对象创建时分配空间、默认赋值
        TestVar t = new TestVar();
        System.out.println(t.name);// null
    }
}