學(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
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)
強(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ù)類型提供包裝類迹恐。
注意: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。