關(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解
實(shí)例如下:
class Person
{
String name;
int age;
void talk()
{
System.out.println("我是: "+name+", 今年: "+age+"歲");
}
}
public class TestJava2_1
{
public static void main(String args[])
{
Person p;
if (p == null)
{
p = new Person();
}
p.name = "張三";
p.age = 25;
p.talk();
}
}
為了更好的了解Java中變量的使用方式,我們做一個(gè)實(shí)驗(yàn)。將以上代碼保存為T(mén)estJava2_1.java文件,之后執(zhí)行 “javac TestJava2_1.java” 命令將代碼編譯成二進(jìn)制文件。
編譯時(shí)將報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容大致如下:
“TestJava2_1.java:59: 錯(cuò)誤: 可能尚未初始化變量p”
編譯器認(rèn)為引用數(shù)據(jù)類(lèi)型變量p未初始化,所以不可以判斷是否等于null,但我認(rèn)為編譯器對(duì)于此錯(cuò)誤的表述不太準(zhǔn)確。就算變量p沒(méi)有給予初始值,默認(rèn)值至少是存在的,那么用默認(rèn)值和null比較有什么不可以呢。我認(rèn)為正確的錯(cuò)誤表述應(yīng)該是 “變量p尚未分配內(nèi)存空間”?!癙erson p” 僅僅是聲明有一個(gè)引用數(shù)據(jù)類(lèi)型變量p,但并未給p分配任何內(nèi)存空間,這點(diǎn)和C/C++是不一樣的。
將變量p的聲明改為 “Person p = null” 后,執(zhí)行 “javac TestJava2_1.java” 就能夠成功編譯??梢?jiàn) “Person p = null” 語(yǔ)句除了賦予變量p初值外,還在賦值前為變量p分配了內(nèi)存空間。
從上面的實(shí)驗(yàn)中可以看出,Java中引用數(shù)據(jù)類(lèi)型變量的內(nèi)存分配在賦初值時(shí)進(jìn)行。用相同的方法測(cè)試Java中的基本數(shù)據(jù)類(lèi)型變量,同樣可以發(fā)現(xiàn)變量在聲明時(shí)并沒(méi)有分配內(nèi)存,真正的內(nèi)存分配是在賦初值時(shí)進(jìn)行的。
注上面的有錯(cuò)誤,如果是int a;
a變量是分配了內(nèi)存單元的。a默認(rèn)值是0;
所以基本類(lèi)型在聲明的時(shí)候就分配了內(nèi)存單元。
以上這篇關(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring+Quartz實(shí)現(xiàn)動(dòng)態(tài)任務(wù)調(diào)度詳解
這篇文章主要介紹了Spring+Quartz實(shí)現(xiàn)動(dòng)態(tài)任務(wù)調(diào)度詳解,最近經(jīng)?;趕pring?boot寫(xiě)定時(shí)任務(wù),并且是使用注解的方式進(jìn)行實(shí)現(xiàn),分成的方便將自己的類(lèi)注入spring容器,需要的朋友可以參考下2024-01-01
Spring?Boot?Actuator使用說(shuō)明
SpringBootActuator?是一個(gè)用于監(jiān)控和管理?Spring?Boot?應(yīng)用程序的強(qiáng)大工具,通過(guò)引入依賴(lài)并配置,可以啟用默認(rèn)的監(jiān)控接口,本文介紹Spring?Boot?Actuator的使用,感興趣的朋友一起看看吧2025-02-02
IDEA中thymeleaf語(yǔ)法沒(méi)有提示的問(wèn)題及解決
這篇文章主要介紹了IDEA中thymeleaf語(yǔ)法沒(méi)有提示的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中多線(xiàn)程與并發(fā)_volatile關(guān)鍵字的深入理解
這篇文章主要給大家介紹了關(guān)于Java中多線(xiàn)程與并發(fā)_volatile關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java用單向環(huán)形鏈表來(lái)解決約瑟夫環(huán)Josepfu問(wèn)題
如果把單鏈表的最后一個(gè)節(jié)點(diǎn)的指針指向鏈表頭部,而不是指向NULL,那么就構(gòu)成了一個(gè)單向循環(huán)鏈表,通俗講就是把尾節(jié)點(diǎn)的下一跳指向頭結(jié)點(diǎn)2021-10-10
Java獲得當(dāng)前時(shí)間前指定幾個(gè)小時(shí)具體時(shí)間的方法示例
這篇文章主要介紹了Java獲得當(dāng)前時(shí)間前指定幾個(gè)小時(shí)具體時(shí)間的方法,涉及java使用Calendar針對(duì)日期時(shí)間的相關(guān)運(yùn)算與轉(zhuǎn)換操作技巧,需要的朋友可以參考下2017-08-08

