Java 类变量有默认值,可以不初始化;
但局部变量没有默认值,必须要初始化
先看下面这道选择题(选择B)
下面有关 java 实例变量 , 局部变量 , 类变量和 final 变量的说法,错误的是? ( )
A.实例变量指的是类中定义的变量,即类成员变量,如果没有初始化,会有默认值
B.局部变量指的是在方法中定义的变量,如果没有初始化,会有默认值
C. 类变量指的是用 static 修饰的属性
D. final 变量指的是用 final 修饰的变量
首先看类变量和局部变量的区别
类变量(实例变量):定义在类中,方法体之外。成员变量前面加 static 修饰符
局部变量:定义在方法体,构造方法,语句块中的变量。
在Java虚拟机中
Java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存放局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。这句话就说明了局部变量在创建时就必须进行初始化以确定分配内存大小。
Java堆存放所有对象的实例,几乎所有的对象实例都在这里分配内存。在hotspot虚拟机中,内存分配后,虚拟机需要将分配到的内存空间都初始化为零值。这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到的这些字段的数据类型所对应的零值。
代码验证一下局部变量必须初始化之后才可以使用,否则就会报错
/**
* @ Author zhangsf
* @CreateTime 2020/2/23 - 11:35 AM
*/
package FactoryPattern;
public class D1{
public static void main(String[] args){
int i; //定义一个局部变量,没有赋值
System.out.println("i is" + i);
}
}
而类变量定义后可以不初始化,因为它有默认值
变量类型 | 默认值 |
---|---|
int,byte,short,long | 0 |
char | 一个空格 |
float,double | 0.0 |
引用值(比如String) | null |
定义类变量(静态变量)x1-x8(包含Java中的8种基本数据类型)
不初始化但是它编译成功运行结果可以看出类变量有默认值,
并且是各个类型类变量的默认值
char类型初始值空格输出为一个空格