Java基礎(chǔ)之變量

學(xué)習(xí)目標(biāo)

1匈子、介紹變量命名規(guī)則、變量在JVM中的體現(xiàn)
2勃刨、介紹Java變量的類型(基本數(shù)據(jù)類型、引用類型)
3股淡、Java基礎(chǔ)數(shù)據(jù)溢出分析
4身隐、深入理解Java引用類型的級(jí)別(強(qiáng)引用、軟引用唯灵、弱引用贾铝、虛引用)
5、討論Number類(java.lang包中)及其子類
6埠帕、包裝類與基本數(shù)據(jù)類型的區(qū)別

Java版本

JDK8

介紹Java語(yǔ)言的幾種變量

Java語(yǔ)言定義的幾種變量
1垢揩、實(shí)例變量(非靜態(tài)字段)
2、靜態(tài)變量(類字段)
3敛瓷、局部變量
4叁巨、常量

package com.sample;
public class VariableSample {
    private String p1; // 實(shí)例變量
    private static String p2; // 類變量
    private static final String p3 = "p3"; // 常量

    public void play(){
        int a = 1; // 基本類型 - 局部變量
        String b = "b"; // 引用類型 - 局部變量
    }
}

變量命名規(guī)則
1、變量名稱區(qū)分大小寫(xiě)呐籽。慣例是用字母開(kāi)頭锋勺,而不是“$” “_”,雖然他們?cè)诩夹g(shù)上是合法的狡蝶。
2庶橱、字母開(kāi)頭,后續(xù)字符可能是 數(shù)字贪惹、字母悬包、下劃線美元符號(hào)。
3馍乙、選擇的名稱不能是 關(guān)鍵字保留字
4垫释、如果你選擇的名字只包含一個(gè)單詞丝格,則全部用小寫(xiě)字母拼出來(lái)。如果它包含多個(gè)單詞棵譬,請(qǐng)將每個(gè)后續(xù)單詞的首字母大寫(xiě)显蝌。

變量在JVM中的體現(xiàn)
堆:可供各個(gè)線程共享的運(yùn)行時(shí)內(nèi)存區(qū)域,也是所有類實(shí)例和數(shù)組對(duì)象分配內(nèi)存的區(qū)域;因此 在存放實(shí)例變量 和 類變量時(shí)曼尊,要考慮線程安全問(wèn)題酬诀。
棧:用于保存局部變量的值,包括:1骆撇、用于保存基本類型的值 2瞒御、保存類的實(shí)例,即堆對(duì)象的引用神郊。因?yàn)槊總€(gè)java虛擬機(jī)線程都有自己私有的Java虛擬機(jī)棧肴裙,因此 局部變量是線程安全的。
運(yùn)行時(shí)常量池:每一個(gè)運(yùn)行時(shí)常量池涌乳,都在java虛擬機(jī)的方法區(qū)中分配蜻懦。

Java變量的類型

1、基本數(shù)據(jù)類型
2夕晓、引用類型(reference type)

Java基本數(shù)據(jù)類型

基本數(shù)據(jù)類型 二進(jìn)制位數(shù) 默認(rèn)值 使用范圍
byte 8 0 -128~127
short 16 0 -32768~32767
int 32 0 -2 31~2 31 -1
long 64 0 -2 63~2 63 -1
float 32 0.0f 此類型不用于精確值宛乃,例如貨幣。為此蒸辆,您需要改為使用 java.math.BigDecimal
double 64 0.0d 此數(shù)據(jù)類型不應(yīng)用于精確值征炼,例如貨幣。為此吁朦,您需要改為使用 java.math.BigDecimal
boolean 1 false 只有兩個(gè)可能的值:true和false
char 16 '\u0000' 它的最小值為'\u0000'(或0)柒室,最大值為'\uffff'(或65,535)

Java基礎(chǔ)數(shù)據(jù)溢出分析
以byte為例,byte的數(shù)值是-128~127

package com.sample;
public class NumberSample {
    public static void main(String[] args){
        byte a = (byte)128;
        System.out.println(a);
    }
}

輸出結(jié)果:-128

那么計(jì)算機(jī)是如何計(jì)算溢出數(shù)據(jù)的呢逗宜?
1雄右、 byte是8位的二進(jìn)制,因此將128轉(zhuǎn)換為8位的二進(jìn)制源碼:1 0000000
2纺讲、 將原碼轉(zhuǎn)換為反碼

符號(hào)位 數(shù)值位
原碼 1 0000000
反碼 1 1111111

3擂仍、 計(jì)算補(bǔ)碼,反碼 + 1


image.png

Java虛擬機(jī)中有三種引用類型
1熬甚、類類型(class type)
2逢渔、數(shù)組類型(array type)
3、接口類型(interface type)
這些引用類型的值分別指向動(dòng)態(tài)創(chuàng)建的類實(shí)例乡括、數(shù)組實(shí)例 和 實(shí)現(xiàn)了某個(gè)接口的類實(shí)例 或 數(shù)組實(shí)例肃廓。

深入理解java引用類型的級(jí)別

當(dāng)內(nèi)存空間還足夠時(shí),則能保留在內(nèi)存之中诲泌;如果內(nèi)存空間在進(jìn)行垃圾收集后還是非常緊張盲赊,則可以拋棄這些對(duì)象。很多系統(tǒng)的緩存功能都符合這樣的應(yīng)用場(chǎng)景敷扫。因此在JDK1.2之后哀蘑,將引用分為下面四種級(jí)別,這四種引用強(qiáng)度由強(qiáng)到弱。
1绘迁、 強(qiáng)引用(Final Reference)
2合溺、 軟引用(Soft Reference)
3、 弱引用(Weak Reference)
4缀台、 虛引用(Phantom Reference)

image.png

強(qiáng)引用(Final Reference)
1棠赛、 類似 Object obj = new Object(); 這類的引用
2、 只要強(qiáng)引用還存在(a将硝、判斷對(duì)象的引用數(shù)量 b恭朗、可達(dá)性分析算法判斷對(duì)象的引用鏈?zhǔn)欠窨蛇_(dá)),垃圾收集器永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象依疼。
3痰腮、 JVM寧愿拋出OOM異常,也不會(huì)回收還存在的強(qiáng)引用所指向的對(duì)象律罢。

FinalReference.java源碼

package java.lang.ref;

/**
 * Final references, used to implement finalization
 */
class FinalReference<T> extends Reference<T> {

    public FinalReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
}

強(qiáng)引用只有一個(gè)構(gòu)造函數(shù)膀值,根據(jù)所給對(duì)象和隊(duì)列構(gòu)造一個(gè)強(qiáng)引用。

軟引用(Soft Reference)
1误辑、軟引用用來(lái)描述一些有用但并非必需的對(duì)象沧踏。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前巾钉,將會(huì)把這些對(duì)象列進(jìn)回收范圍之中進(jìn)行第二次回收翘狱。如果這次回收還沒(méi)有足夠內(nèi)存,才會(huì)拋出內(nèi)存溢出異常砰苍。
2潦匈、這點(diǎn)很好的解決了OOM問(wèn)題,并且這個(gè)特性很適合用來(lái)實(shí)現(xiàn)緩存:比如網(wǎng)頁(yè)緩存赚导、圖片緩存等茬缩。

例子:

package com.sample;

import java.lang.ref.SoftReference;

public class ParamSample {
    public static void main(String[] args)
    {
        SoftReference softReference = new SoftReference(new String("hello world")); // 軟引用
        System.out.println(softReference.get());
    }
}

弱引用(Weak Reference)
弱引用用來(lái)描述非必須對(duì)象,它的強(qiáng)度比軟引用更弱一些吼旧,被弱引用關(guān)聯(lián)的對(duì)象只能生存到下一次垃圾收集發(fā)生之前凰锡。當(dāng)垃圾收集器工作時(shí),無(wú)論當(dāng)前內(nèi)存是否足夠圈暗,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象掂为。

例子:

package com.sample;

import java.lang.ref.WeakReference;

public class ParamSample {
    public static void main(String[] args)
    {
        WeakReference weakReference = new WeakReference(new String("hello world"));
        System.out.println(weakReference.get()); // 垃圾回收之前,獲得弱引用的對(duì)象
        System.gc(); // 垃圾回收
        System.out.println(weakReference.get()); // 垃圾回收之后员串,獲得弱引用的對(duì)象
    }
}

虛引用(Phantom Reference)
1菩掏、 虛引用是最弱的一種引用關(guān)系。一個(gè)對(duì)象是否由虛引用的存在昵济,完全不會(huì)對(duì)其生存時(shí)間構(gòu)成影響,也無(wú)法通過(guò)虛引用來(lái)取得一個(gè)對(duì)象實(shí)例。
2访忿、 虛引用必須和引用隊(duì)列關(guān)聯(lián)使用瞧栗。

例子:

package com.sample;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class ParamSample {
    public static void main(String[] args)
    {
        ReferenceQueue referenceQueue = new ReferenceQueue();
        PhantomReference phantomReference = new PhantomReference(new String("hello world"),referenceQueue);
        System.out.println(phantomReference.get());
    }
}

討論Number類(java.lang包中)及其子類

大部分時(shí)間在代碼中都使用基本數(shù)據(jù)類型,然而為了代碼的靈活性海铆,Java平臺(tái)為每種基本數(shù)據(jù)類型提供包裝類迹恐。

image.png

注意:BigDecimal并BigInteger用于高精度計(jì)算。AtomicInteger并AtomicLong用于多線程應(yīng)用程序卧斟。

有如下原因要使用Number對(duì)象而不是原始數(shù)據(jù):
1殴边、通常用于處理數(shù)字集合。
2珍语、要使用類定義的常量(如MIN_VALUE和)MAX_VALUE锤岸,它們提供數(shù)據(jù)類型的上限和下限。
3板乙、 使用類方法將值轉(zhuǎn)換為其他基本類型以及從其他基本類型轉(zhuǎn)換值是偷,轉(zhuǎn)換為字符串和從字符串轉(zhuǎn)換,以及在數(shù)字系統(tǒng)(十進(jìn)制募逞,八進(jìn)制蛋铆,十六進(jìn)制,二進(jìn)制)之間進(jìn)行轉(zhuǎn)換放接。
綜上所述:當(dāng)需要對(duì)數(shù)據(jù)做一些處理時(shí)刺啦,可以使用Number類及其子類提供的一些方法,以免重復(fù)造輪子纠脾。

自動(dòng)裝箱

自動(dòng)裝箱是Java編譯器在基元類型和它們相應(yīng)的對(duì)象包裝類之間進(jìn)行的自動(dòng)轉(zhuǎn)換玛瘸。例如,將int轉(zhuǎn)換為Integer乳乌,double轉(zhuǎn)換為Double等等捧韵。

Java編譯器在原始值為以下情況時(shí)應(yīng)用自動(dòng)裝箱:
1、作為參數(shù)傳遞給期望相應(yīng)包裝類的對(duì)象的方法汉操。
2再来、分配給相應(yīng)包裝類的變量。

拆箱

將包裝類型(Integer)的對(duì)象轉(zhuǎn)換為其相應(yīng)的基元(int)值稱為拆箱

Java編譯器應(yīng)用拆箱:
1磷瘤、作為參數(shù)傳遞給需要相應(yīng)基元類型值的方法芒篷。
2、分配給相應(yīng)基元類型的變量采缚。

包裝類 與 基本數(shù)據(jù)類型的區(qū)別
1针炉、包裝類是對(duì)象,擁有方法和字段扳抽,對(duì)象的調(diào)用都是通過(guò)引用對(duì)象的地址篡帕,基本類型不是殖侵。
2、包裝類型是引用的傳遞镰烧,基本類型是值的傳遞拢军。
3、聲明方式不同怔鳖,基本數(shù)據(jù)類型不需要new關(guān)鍵字茉唉,而包裝類型需要new在堆內(nèi)存中進(jìn)行new來(lái)分配內(nèi)存空間 。
4结执、存儲(chǔ)位置不同度陆,基本數(shù)據(jù)類型直接將值保存在值棧中,而包裝類型是把對(duì)象放在堆中献幔,然后通過(guò)對(duì)象的引用來(lái)調(diào)用他們 懂傀。
5、初始值不同斜姥,int的初始值為 0 鸿竖、 boolean的初始值為false 而包裝類型的初始值為null。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铸敏,一起剝皮案震驚了整個(gè)濱河市缚忧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杈笔,老刑警劉巖闪水,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蒙具,居然都是意外死亡球榆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)禁筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)持钉,“玉大人,你說(shuō)我怎么就攤上這事篱昔∶壳浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵州刽,是天一觀的道長(zhǎng)空执。 經(jīng)常有香客問(wèn)我,道長(zhǎng)穗椅,這世上最難降的妖魔是什么辨绊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮匹表,結(jié)果婚禮上门坷,老公的妹妹穿的比我還像新娘宣鄙。我一直安慰自己,他們只是感情好拜鹤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布框冀。 她就那樣靜靜地躺著,像睡著了一般敏簿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宣虾,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天惯裕,我揣著相機(jī)與錄音,去河邊找鬼绣硝。 笑死蜻势,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹉胖。 我是一名探鬼主播握玛,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甫菠!你這毒婦竟也來(lái)了挠铲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寂诱,失蹤者是張志新(化名)和其女友劉穎拂苹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體痰洒,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓢棒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丘喻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脯宿。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泉粉,靈堂內(nèi)的尸體忽然破棺而出连霉,到底是詐尸還是另有隱情,我是刑警寧澤搀继,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布窘面,位于F島的核電站,受9級(jí)特大地震影響叽躯,放射性物質(zhì)發(fā)生泄漏财边。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一点骑、第九天 我趴在偏房一處隱蔽的房頂上張望酣难。 院中可真熱鬧谍夭,春花似錦、人聲如沸憨募。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菜谣。三九已至珠漂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尾膊,已是汗流浹背媳危。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冈敛,地道東北人待笑。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抓谴,于是被迫代替她去往敵國(guó)和親暮蹂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容