· Java变量按数据类型分,有:①基本数据类型;②引用数据类型;
· Java变量按声明位置分,有:①成员变量;②局部变量;
见下图:
一、按数据类型分
1.1、基本数据类型
8种基本数据类型是Java语言内嵌的,这个最熟悉不过了,必须张口就来。主要区分一下各个数据类型的表示范围:
类型 | 长度 | 表示范围 |
byte | 1字节 | [-27 , 27-1] |
short | 2字节 | [-215 , 215-1] |
int | 4字节 | [-231 , 231-1] |
long | 8字节 | [-263 , 263-1] |
float | 4字节 | [1.4E-45~3.4E+38 , -3.4E+38~-1.4E-45] |
double | 8字节 | [4.9E-324~1.7E+308 , -1.7E+308~-4.9E-324] |
char | 2 字节 | ISO 单一字符集 |
boolean | 1 字节 | true 或 false |
之所以叫基本数据类型,是因为以上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 } }