Java程序中的引用变量并不需要进行所谓的初始化操作,需要进行的是引用变量所引用的对象。
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
初始化變數分:
宣告變數
將變數賦值
分配記憶體也分:
分配堆裡的記憶體
分配棧裡的記憶體
所以呢,這個問題比較泛。 首先來個栗子:
int a;//分配jvm中的栈内存,形成一个引用 a = 1;//分配jvm中的堆内存
再舉個栗子:
String str = new String(“hello”);
str 這個引用放在堆疊上
new 建立出來的物件實例放在堆上
「hello」這個字面量放在靜態儲存區
繼續上面的栗子:
String str1 = str;//此时,str1也是一个引用,放在栈上。指向堆里的hello
想了解更多,可以看看我的一篇專欄文章。開頭簡單的講到了 Java Memory Model。
不對。 int i; //此時以為變數i分配空間,i有值i=1; //賦值
初始化只是為這個變數賦予有意義的值。
初始化變數就是為這個變數 分配內存,這句話對不?
至少在 C++ 中是不對的。
根據我的理解,在 C++ 中,一個變數要使用,一般需要以下三步驟:
宣告 declaration 「宣告」可以引入變數所使用的標識符,但不會分配記憶體空間。例如extern int i;,表示i這個標識符在之後的程式中是一個整數。
extern int i;
i
定義definition “定義”除了同聲明一樣引入變量所使用的標識符外,還會根據變量的類型分配相應的空間,但不會初始化(更準確的說,是會進行“默認初始化”,見下文)。例如int i;,就定义了一个整型变量i並為其分配了空間。
int i;
初始化 initialization 「初始化」是指在定義變數時,為其賦值。例如int i = 1;,就定义了一个整型变量i並為其分配了空間,而且把它的值設為 1。
int i = 1;
關於上文「預設初始化」的一點解釋:
「預設初始化」(default initialization)簡單來說是這樣一個過程,當使用T x;定义变量时,如果T是一个类,就调用这个类的默认构造函数来初始化x,如果T是一個內建類型(built-in type),則不進行初始化。更具體的可以參考 C++ 標準中的規定。
T x;
T
x
至少還要呼叫建構函式
不全對,C++物件的static不會先分配記憶體
在Java中也不對,Object o;//這個也是會分配內存,分配o這個物件的內存,o = new Object(); //初始化,引用的物件
不對一般給變數分配空間是在變數定義的時候,而初始化是給這塊空間賦初值,並不是必須的,兩者不等價
不正確,通俗來說,初始化變數只是讓這個變數有意義,有意義就可以就行相關操作
初始化變數分:
宣告變數
將變數賦值
分配記憶體也分:
分配堆裡的記憶體
分配棧裡的記憶體
所以呢,這個問題比較泛。
首先來個栗子:
再舉個栗子:
str 這個引用放在堆疊上
new 建立出來的物件實例放在堆上
「hello」這個字面量放在靜態儲存區
繼續上面的栗子:
想了解更多,可以看看我的一篇專欄文章。開頭簡單的講到了 Java Memory Model。
不對。
int i; //此時以為變數i分配空間,i有值
i=1; //賦值
初始化只是為這個變數賦予有意義的值。
至少在 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++ 標準中的規定。至少還要呼叫建構函式
不全對,C++物件的static不會先分配記憶體
在Java中也不對,
Object o;//這個也是會分配內存,分配o這個物件的內存,
o = new Object(); //初始化,引用的物件
不對
一般給變數分配空間是在變數定義的時候,而初始化是給這塊空間賦初值,並不是必須的,兩者不等價
不正確,通俗來說,初始化變數只是讓這個變數有意義,有意義就可以就行相關操作