關(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)文章
Java使用JSONObject需要的6個(gè)jar包下載地址
這篇文章主要介紹了Java使用JSONObject需要的6個(gè)jar包下載地址,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Spring集成Druid連接池及監(jiān)控配置的全過(guò)程
java程序很大一部分要操作數(shù)據(jù)庫(kù),為了提高性能操作數(shù)據(jù)庫(kù)的時(shí)候,有不得不使用數(shù)據(jù)庫(kù)連接池,下面這篇文章主要給大家介紹了關(guān)于Spring集成Druid連接池及監(jiān)控配置的相關(guān)資料,需要的朋友可以參考下2021-09-09Mybatis的@select和@SelectProvider注解方式動(dòng)態(tài)SQL語(yǔ)句解讀
這篇文章主要介紹了Mybatis的@select和@SelectProvider注解方式動(dòng)態(tài)SQL語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12分享Java程序員應(yīng)該知道的10個(gè)調(diào)試技巧
在本文中,作者將使用大家常用的的開(kāi)發(fā)工具Eclipse來(lái)調(diào)試Java應(yīng)用程序。但這里介紹的調(diào)試方法基本都是通用的,也適用于NetBeans IDE,我們會(huì)把重點(diǎn)放在運(yùn)行時(shí)上面2012-09-09java并發(fā)容器ConcurrentHashMap深入分析
這篇文章主要為大家介紹了java并發(fā)容器ConcurrentHashMap使用示例及深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05JavaWeb項(xiàng)目打開(kāi)網(wǎng)頁(yè)出現(xiàn)Session Error的異常解決方案
這篇文章主要介紹了JavaWeb項(xiàng)目打開(kāi)網(wǎng)頁(yè)出現(xiàn)Session Error的異常解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10maven項(xiàng)目打jar包并包含所有依賴詳細(xì)教程
maven打包生成的普通jar包,只包含該工程下源碼編譯結(jié)果,不包含依賴內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于maven項(xiàng)目打jar包并包含所有依賴的相關(guān)資料,需要的朋友可以參考下2023-05-05Java代碼審計(jì)的一些基礎(chǔ)知識(shí)你知道嗎
這篇文章主要介紹了基于Java的代碼審計(jì)功能的基礎(chǔ)知識(shí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09