Java程序中的引用变量并不需要进行所谓的初始化操作,需要进行的是引用变量所引用的对象。
初始化变量就是为这个变量 分配内存,这句话对不?
至少在 C++ 中是不对的。
根据我的理解,在 C++ 中,一个变量要使用,一般需要以下三步:
声明 declaration
“声明”可以引入变量所使用的标识符,但不会分配内存空间。比如extern int i;
,表示i
这个标识符在之后的程序中是一个整数。
定义 definition
“定义”除了同声明一样引入变量所使用的标识符外,还会根据变量的类型分配相应的空间,但不会初始化(更准确的说,是会进行“默认初始化”,见下文)。比如int i;
,就定义了一个整型变量i
并为其分配了空间。
初始化 initialization
“初始化”是指在定义变量时,为其赋值。比如int i = 1;
,就定义了一个整型变量i
并为其分配了空间,而且把它的值设为 1。
关于上文“默认初始化”的一点解释:
“默认初始化”(default initialization)简单来说是这样一个过程,当使用T x;
定义变量时,如果T
是一个类,就调用这个类的默认构造函数来初始化x
,如果T
是一个内置类型(built-in type),则不进行初始化。更具体的可以参照 C++ 标准中的规定。
15 回答8.4k 阅读
8 回答6.2k 阅读
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
初始化变量分:
声明变量
给变量赋值
分配内存也分:
分配堆里的内存
分配栈里的内存
所以呢,这个问题比较泛。
首先来个栗子:
再举个栗子:
str 这个引用放在栈上
new 创建出来的对象实例放在堆上
“hello”这个字面量放在静态存储区
继续上面的栗子:
想了解更多,可以看看我的一篇专栏文章。开头简单的讲到了 Java Memory Model。