北京網(wǎng)站建設(shè)天下公司公司網(wǎng)站建設(shè)北京
作者:孫玉昌,昵稱【一一哥】,另外【壹壹哥】也是我哦
CSDN博客專家、萬粉博主、阿里云專家博主、掘金優(yōu)質(zhì)作者
前言
在之前的文章中,壹哥給大家講解了Java的第一個(gè)案例HelloWorld,并詳細(xì)給大家介紹了Java的標(biāo)識(shí)符,而且現(xiàn)在我們也已經(jīng)知道該使用什么樣的工具進(jìn)行Java開發(fā)。那么接下來,壹哥會(huì)集中精力帶大家學(xué)習(xí)Java的各種細(xì)節(jié)內(nèi)容,比如什么是變量?Java里有哪些數(shù)據(jù)類型?請大家趕緊拿出小本本,做好筆記哦。
-----------------------------前戲已做完,精彩即開始----------------------------
全文大約【4000】字,不說廢話,只講可以讓你學(xué)到技術(shù)、明白原理的純干貨!本文帶有豐富案例及配圖視頻,讓你更好地理解和運(yùn)用文中的技術(shù)概念,并可以給你帶來具有足夠啟迪的思考......
一. 變量簡介
仔細(xì)回想一下,在你還沒有學(xué)習(xí)Java之前,你有沒有聽過【變量】這個(gè)詞?第一次聽到【變量】這個(gè)詞是在什么時(shí)候?有些童鞋可能會(huì)說,我以前沒聽過【變量】!其實(shí)大部分人都聽過!我們在中學(xué)時(shí),在數(shù)學(xué)課上就有【變量】這個(gè)詞了,比如一個(gè)常見的方程式y=x2+1。這里的x與y就是變量,請大家回憶一下數(shù)學(xué)里x變量表示什么含義?
在我們的Java語言中,同樣存在著【變量】的概念,并且該概念與數(shù)學(xué)方程里的變量含義類似。
1. 概念
在Java中,變量是程序里最基本的存儲(chǔ)單元,它由變量名、變量類型、作用域組成。從本質(zhì)上來說,變量其實(shí)就是內(nèi)存里的一小塊存儲(chǔ)區(qū)域,該區(qū)域只能存儲(chǔ)聲明變量時(shí)指定類型的數(shù)據(jù)。我們創(chuàng)建使用每個(gè)變量前,必須先聲明,在內(nèi)存中申請空間,然后對其進(jìn)行初始化賦值,接著就可以通過變量名來訪問和使用這塊內(nèi)存區(qū)域了。
進(jìn)一步解釋一下,變量其實(shí)就是一個(gè)可以存儲(chǔ)特定類型數(shù)據(jù)的容器。這個(gè)容器在內(nèi)存中有自己的地址,為了方便地找到這個(gè)地址,我們可以給每個(gè)地址起個(gè)”名字“,這就是”變量名“。每個(gè)變量的數(shù)據(jù)類型都是固定不變的,但變量中對應(yīng)數(shù)據(jù)的具體內(nèi)容,卻是可以改變的,所以”變量“指的就是內(nèi)容可以改變的量。
如果你對上面關(guān)于變量的解釋還不明白,壹哥再來給你舉個(gè)更通俗易懂的栗子。
假如我們是搞化學(xué)的,現(xiàn)在你手里有很多種化學(xué)元素,該如何存儲(chǔ)它們?我們知道,這些化學(xué)元素的性質(zhì)各不相同,不能一股腦地都放在一起,必須分類存儲(chǔ)。我們可以找到一些適合存儲(chǔ)這些化學(xué)元素的”瓶子“(容器),每種瓶子只能存儲(chǔ)不同類型(數(shù)據(jù)類型)的化學(xué)元素,不能混裝,否則就會(huì)發(fā)生化學(xué)反應(yīng)引起爆炸(報(bào)錯(cuò))。并且每種瓶子都有自己的存儲(chǔ)大小(容量),不可能一個(gè)瓶子里存儲(chǔ)無限多的化學(xué)元素?,F(xiàn)在的瓶子有很多,你要經(jīng)常找到并使用這些瓶子,就需要給這些瓶子編號(hào)命名(變量名),并且要有對應(yīng)的存放位置(內(nèi)存地址),不能隨便亂放。

現(xiàn)在你搞懂變量的含義了嗎?
2. 分類
在Java中,根據(jù)不同的分類標(biāo)準(zhǔn),變量也被分成了很多種:
如果是按照數(shù)據(jù)類型來劃分,變量可以分為基本類型的變量和引用類型的變量。
如果是按照作用范圍來劃分,變量可以分為局部變量、成員(實(shí)例)變量和類(靜態(tài))變量。
當(dāng)然,現(xiàn)在你可能對什么是基本類型、引用類型、局部變量、成員變量、類變量等概念還都很懵逼。請暫時(shí)不用管這些,腦子中有個(gè)印象即可,壹哥在后面會(huì)再詳細(xì)給你介紹這些概念都是怎么回事,我們先集中精力來學(xué)習(xí)變量的定義與使用案例。
二. 變量的定義與案例
1. 命名規(guī)則與規(guī)范
壹哥在前面講解Java標(biāo)識(shí)符時(shí)給大家講過,Java的標(biāo)識(shí)符有一定的命名規(guī)則和規(guī)范。并不是你想怎么命名就怎么命名,必須遵循一定的要求。我們再來回顧一下Java標(biāo)識(shí)符的命名規(guī)則與規(guī)范,規(guī)則如下:
①. Java標(biāo)識(shí)符由 字母(含英、中、日、俄等)、數(shù)字、下劃線"_" 和 美元符號(hào)$ (音: dollar)組成,如age、G7、_value、$salary;
②. 不能以數(shù)字開頭,如123abc;
③. 嚴(yán)格區(qū)分大小寫,如class與Class是不同的;
④. 長度無限制(一般不要超過15個(gè)字符);
⑤. 不能是Java中的保留字和關(guān)鍵字。
Java的變量名也是一種標(biāo)識(shí)符,所以必須遵循以上這些規(guī)則!另外還有一些命名規(guī)范需要我們盡量遵守,比如:
變量名盡量要做到見名知意。在實(shí)際開發(fā)時(shí)盡量不要寫a、b、c這種名稱;
變量名的首字母要小寫。如果名稱由多個(gè)單詞組成,第一個(gè)單詞的首字母應(yīng)小寫,剩下的單詞首字母應(yīng)大寫(駝峰式命名法),例如 xxxYyyZzz、numCounter。
復(fù)習(xí)完變量的命名規(guī)則與規(guī)范后,我們就開始定義變量吧。
2. 基本語法
在Java語言中,所有的變量在使用前都必須先聲明再使用,否則就會(huì)報(bào)錯(cuò)。一般定義變量的基本語法格式如下:
type 變量名1 [ = value1][, 變量名2 [= value2] ...] ;
這里的type表示Java的數(shù)據(jù)類型,同一條語句中可以用逗號(hào)隔開多個(gè)同類型的變量。這里的”=“等號(hào)表示賦值,不是通常數(shù)學(xué)里等號(hào)的意思,其作用是把”=“后面的值賦給前面的變量。語句的最后使用英文的 ";" 分號(hào)來表示語句結(jié)束。
3. 實(shí)現(xiàn)步驟
根據(jù)上面的定義語法,我們定義一個(gè)變量的基本步驟可以分成如下3步:
1. 聲明變量,就是申請一塊內(nèi)存地址;
2.變量初始化,就是給變量賦值;
3.使用變量。
雖然變量的定義步驟,基本上就是以上這3步,但在實(shí)際開發(fā)時(shí)卻也有幾種不同的具體寫法,接下來壹哥就通過幾個(gè)案例來給大家展示不同的變量定義寫法。
3.1 定義方式一
我們首先來看第一種寫法,這種寫法完全符合變量定義的3步走策略,但是寫起來有點(diǎn)啰嗦。
/*** @author 一一哥Sun * QQ:2312119590 * CSDN、掘金、知乎找我哦*/
public class VariableDemo {public static void main(String[] args) {//注意:在java中,變量一定要初始化后才能使用!//變量聲明方式1://1.聲明變量int a;//2.給變量初始化賦值,初始化的意思是第一次給某個(gè)變量賦值a = 10;//3.使用變量System.out.println(a);}
}
在上面的代碼中,我們定義了一個(gè)int整型的變量,變量名稱為a,初始值為10。如果我們不寫初始值,就相當(dāng)于系統(tǒng)給它指定了默認(rèn)值,默認(rèn)值是0。但我們在使用變量之前,必須要給變量進(jìn)行初始化賦值,否則編譯器就會(huì)自動(dòng)檢測出錯(cuò)誤,從而會(huì)報(bào)錯(cuò)!錯(cuò)誤信息如下所示:The local variable a may not have been initialized

3.2 定義方式二
下面是第二種定義變量的寫法,相比第一種寫法簡單一些,直接把變量的聲明和初始化放在一起,所以這種方式用的較多。
/*** @author 一一哥Sun * QQ:2312119590 * CSDN、掘金、知乎找我哦*/
public class VariableDemo {public static void main(String[] args) {// 注意:在java中,變量一定要初始化后才能使用!//變量聲明方式2://1.聲明變量和初始化int a = 10;//2.使用變量System.out.println("a的值為:" + a);}
}
3.3 定義方式三
我們也可以采用以下寫法,即在一條語句中連續(xù)定義多個(gè)變量。但大家要注意,我們在一條語句中連續(xù)定義多個(gè)變量時(shí),應(yīng)該給每個(gè)變量都進(jìn)行初始化賦值,否則在編譯之前開發(fā)工具就會(huì)直接報(bào)錯(cuò)!
/*** @author 一一哥Sun * QQ:2312119590 * CSDN、掘金、知乎找我哦*/
public class VariableDemo {public static void main(String[] args) {// 注意:在java中,變量一定要初始化后才能使用!//變量聲明方式3//連續(xù)定義多個(gè)變量int a = 1,b = 3,c = 10;System.out.println("a的值為:"+a); System.out.println("b的值為:"+b); System.out.println("c的值為:"+c); }
}
3.4 定義方式四
我們可以在第3種定義變量的寫法基礎(chǔ)上進(jìn)一步簡化。同樣是把多個(gè)變量定義在一條語句內(nèi),但a、b變量未初始化,c變量進(jìn)行了初始化。這種寫法在語法上是沒問題的。但a和b這兩個(gè)變量不能直接使用,因?yàn)闆]有初始化,如果直接使用會(huì)產(chǎn)生錯(cuò)誤。c變量可以直接使用,因?yàn)檫M(jìn)行了初始化賦值!
/*** @author 一一哥Sun * QQ:2312119590 * CSDN、掘金、知乎找我哦*/
public class VariableDemo {public static void main(String[] args) {// 注意:在java中,變量一定要初始化后才能使用!//變量聲明方式4//連續(xù)定義多個(gè)變量int a,b,c = 10;//a、b變量未初始化,如果直接使用會(huì)報(bào)錯(cuò)//System.out.println("a的值為:" + a);//System.out.println("b的值為:" + b);//c變量初始賦值為10,可以直接使用System.out.println("c的值為:"+c); }
}
通過上面幾個(gè)小案例,壹哥給大家講解了變量定義的4種寫法。至于你愿意用哪種寫法,其實(shí)都可以,這個(gè)主要是看個(gè)人的寫作習(xí)慣,它們之間并沒有特別大的性能差異。
4. 進(jìn)階案例
學(xué)習(xí)完上面幾個(gè)最基本的案例之后,壹哥再給大家設(shè)計(jì)幾個(gè)進(jìn)階案例,進(jìn)一步加深對于變量的掌握。
4.1 變量重新賦值
壹哥在前面跟大家說過,變量就是值可以被改變的量,所以變量的一個(gè)重要特點(diǎn)就是可以重新賦值!例如,我們先給變量x賦值100,再賦值200。
/*** @author 一一哥Sun * QQ:2312119590 * CSDN、掘金、知乎找我哦*/
public class VariableDemo02 {//進(jìn)階案例public static void main(String[] args) {//定義int類型變量x,并賦初始值100int x = 100;//打印該變量的值,觀察是否為100System.out.println("x原值="+x);//重新給x變量賦值為200,改變x的值x = 200;//打印該變量的值,觀察是否為200System.out.println("x新值="+x);}
}
我們第一次定義變量x時(shí),需要指定變量的類型int,因此定義語句是int x = 100;。而第二次重新賦值時(shí),因?yàn)樽兞縳已經(jīng)存在了,不用再重復(fù)定義,因此不用再重復(fù)指定變量類型int,直接使用語句x = 200;即可。
4.2 變量之間賦值
變量不但可以重新賦值,還可以把一個(gè)變量賦值給另外的變量,我們來看下面的例子:
/*** @author 一一哥Sun * QQ:2312119590 * CSDN、掘金、知乎找我哦*/
public class VariableDemo02 {//進(jìn)階案例public static void main(String[] args) {//定義變量x,同時(shí)賦值為100int x = 100;//打印x的值System.out.println("x = " + x);//變量x賦值給另一個(gè)變量y//int y = x;//打印y的值//System.out.println("y = " + y);//變量x同時(shí)賦值給多個(gè)變量int y = x, z = x;System.out.println("y = " + y+",z = "+z);}
}
三. 變量原理
通過上面的幾個(gè)案例,你現(xiàn)在應(yīng)該對變量的使用有了基本的掌握。在搞清楚變量該怎么用之后,壹哥再簡單給大家分析一下變量在內(nèi)存中的分配情況,這也是變量的基本工作原理,我們求職時(shí)面試官就喜歡考察這一塊的內(nèi)容哦。
回想一下,我們之前定義變量的基本過程,比如int x=100;:
1. 首先需要指明該變量的數(shù)據(jù)類型,比如本文中說到的int整型;
2.然后要給該變量設(shè)置一個(gè)變量名,比如變量名稱x;
3.接著我們還要給變量賦值,比如 x=100。
在以上定義變量并賦值的過程中,x是變量名。JVM虛擬機(jī)會(huì)給該變量在內(nèi)存中分配一個(gè)位置0x002(這個(gè)地址值是我隨便寫的,計(jì)算機(jī)底層會(huì)按自己的規(guī)律生成),然后計(jì)算機(jī)底層就會(huì)根據(jù)該位置來找到x變量的真實(shí)存儲(chǔ)位置。這個(gè)內(nèi)存中的地址值,相當(dāng)于是x變量的”門牌號(hào)“,別人可以根據(jù)這個(gè)地址值找到x變量。對于基本類型的x變量來說,它的整型值100會(huì)存儲(chǔ)在一個(gè)叫做”棧“的結(jié)構(gòu)里,關(guān)于”?!暗脑敿?xì)內(nèi)容,壹哥會(huì)在后面的文章中再單獨(dú)說明。一句話,創(chuàng)建變量時(shí),需要在內(nèi)存中申請一塊空間。內(nèi)存管理系統(tǒng)會(huì)根據(jù)變量的類型來為變量分配存儲(chǔ)空間,分配的空間只能用來儲(chǔ)存該類型數(shù)據(jù)。大家可以參考壹哥繪制的示意圖來理解整型變量x的內(nèi)存結(jié)構(gòu):

-----------------------------正片已結(jié)束,來根事后煙----------------------------
四. 結(jié)語
至此,壹哥就把變量的基本內(nèi)容給大家講解完畢了,最后我們再來總結(jié)一下今天的重點(diǎn):
變量是存放在內(nèi)存中的一個(gè)存儲(chǔ)區(qū)域,該區(qū)域有自己的名稱和類型;
變量由變量名、變量類型、作用域組成;
變量需要先聲明、初始化后再使用;
注意變量的命名規(guī)則和規(guī)范;
掌握定義四變量的幾種實(shí)現(xiàn)寫法;
理解變量的內(nèi)存分配。
如果你還有其他疑問,可以在評論區(qū)留言或私信壹哥哦。另外如果你獨(dú)自學(xué)習(xí)覺得有很多困難,也可以加入到壹哥的學(xué)習(xí)互助群,大家一起交流學(xué)習(xí)。
五. 配套視頻
如果你不習(xí)慣閱讀技術(shù)文章,或是對文中的技術(shù)概念不能很好地理解,可以來看看壹哥幫你篩選出的視頻教程。與本文配套的Java學(xué)習(xí)視頻,鏈接如下:
https://player.bilibili.com/player.html?bvid=BV1FK4y1x7Ny&p=8&page=8
六. 今日作業(yè)
1. 第一題
變量使用的三要素是什么? 請?jiān)谠u論區(qū)給出你的答案。
2. 第二題
變量的命名規(guī)則有哪些?請?jiān)谠u論區(qū)給出你的答案吧。
3. 第三題
編寫幾段代碼,定義幾個(gè)變量并賦值,輸出結(jié)果看看是否正確。