對象的自動清除
- 對象回收是由垃圾回收線程負(fù)責(zé)
- System.gc()方法可以要求系統(tǒng)進(jìn)行垃圾回收畸颅,僅僅是建議系統(tǒng)
- java沒有“析構(gòu)方法”堰塌,但Object的finalize()有類似方法
- 系統(tǒng)在回收時會自動調(diào)用對象的finalize()方法
protected void finalize() throws Throwable{}
- 子類的finalize方法可以在里面釋放系統(tǒng)資源移稳,一般來說聚霜,子類的finalize方法中應(yīng)該調(diào)用父類的finalize方法效五。
內(nèi)部類與匿名類
內(nèi)部類
- 定義在一個類的內(nèi)部
- 使用分為內(nèi)部使用和外部使用
- 內(nèi)部類總可以直接訪問外部類的字段及放啊
- 內(nèi)部類總訪問外部類的字段可以用“外部類名.this.字段”的方式
- 用static修飾內(nèi)部類噩茄,表明該內(nèi)部類實(shí)際是一種外部類
- 因?yàn)樗c外部類的實(shí)例無關(guān)
-
有人認(rèn)為static的類是嵌套類摄凡,不是內(nèi)部類
內(nèi)部類的使用
匿名類
- 它沒有類名续徽,在定義類的同時就生成該對象的一個實(shí)例,不取名字,直接用父類或接口的名字
- 一次性使用的類
例子:
new Handler(){
...
}
局部類
- 同局部變量一樣亲澡,方法中的內(nèi)部類
- 不能用public,private,protected,static修飾
- 但可以被final钦扭,abstract修飾
- 可以訪問器外部類的成員
- 不能夠訪問該方法的局部變量,除非是final局部變量床绪。
Lambda表達(dá)式
- 基本寫法
- (參數(shù)) -> 結(jié)果
例子:
- (參數(shù)) -> 結(jié)果
(String s) -> s.lenth();
x -> x*x;
() -> {System.out.println("aaa")}
- 大體上相當(dāng)于其它語言的”匿名函數(shù)”或”函數(shù)指針”
- 在java中它實(shí)際上是“匿名類的一個實(shí)例”
裝箱
基本類型的包裝類
- 它將基本類型包裝成Object
- integer i = new Integer(10);
Integer i=10;
實(shí)際為:Integer i=Integer.valueOf(10);
拆箱
int a=i;
實(shí)際為:a=i.intValue();
枚舉
可以在enum定義體中客情,添加字段其弊,方法,構(gòu)造方法
image
注解
- 又稱為注記膀斋,標(biāo)記梭伐,標(biāo)記,注釋
- 是在各種語法要素上加上附加信息仰担,以供編譯器或其他程序使用
- 常用注解:
@Override 表示覆蓋父類的方法
@Deprecated 表示過時的方法
@SuppressWarnings 標(biāo)識讓編譯器不產(chǎn)生警告
引用與指針
- 引用實(shí)質(zhì)就是指針
但是它是受控的糊识,安全的
比如:- 會檢查空指引
- 沒有指針運(yùn)算
- 不能訪問沒有引用到的內(nèi)存
- 自動回收垃圾
(1) 指針 》引用類型,引用本身就相當(dāng)于指針,可以用來修改對象的屬性摔蓝,調(diào)用對象的方法
(2)指針運(yùn)算 》數(shù)組
(3)函數(shù)指針 》接口技掏,lambda表達(dá)式
(4)指向結(jié)點(diǎn)的指針 》對象的引用
(5)使用JNI
- java Native interface
- 它允許java代碼和其他語言寫的代碼進(jìn)行交互
基本類型的相等
基本類型:
- 數(shù)值類型:轉(zhuǎn)換后比較
- 浮點(diǎn)數(shù),最好不直接用==
- Double.NAN==Double.NAN結(jié)果為false
- boolean型無法與int比較
注 valueOf() -128到127會有緩存项鬼,超過的話就沒有緩存了
枚舉類型
- 內(nèi)部進(jìn)行了唯一實(shí)例化哑梳,可以直接判斷
引用對象
- “==”是直接看兩個引用是否一樣
- 如果要判斷內(nèi)容是否一樣,則要重寫equals方法
- 如果重寫equals方法绘盟,則最好重寫hashCode方法鸠真,因?yàn)橐话阋詢?nèi)容的hashCode作為唯一性標(biāo)志
[圖片上傳失敗...(image-845e09-1522336106762)]
String對象的特殊性
- 判斷對象,一定不要用==龄毡,要用equals
-
但是字符串變量及字符串常量會進(jìn)行內(nèi)部化吠卷,相同的字符串常量是==的
String對象的特殊性
異常
- 異常又稱為例外,差錯
- 對應(yīng)著java運(yùn)行錯誤處理機(jī)制
基本寫法:
try{
語句組
}catch(Exception ex){
異常處理語句組沦零;
}
java中處理異常
- 拋出異常
- 運(yùn)行時系統(tǒng)在調(diào)用棧中查找:從生成異常的方法開始進(jìn)行回溯祭隔,直到找到
- 捕獲異常的代碼
異常的分類
- Throwable
- Error:JVM錯誤
- Exception
多異常的處理
- 子類異常要排在父類異常的前面
- finally語句
- 無論有無異常,都會執(zhí)行處理語句
受檢的異常
Exception分兩種
- RuntimeException及其子類路操,可以不明確處理
- 否則疾渴,稱為受檢的異常,受檢的異常,要求明確進(jìn)行語法處理,要么捕獲,要么拋出異常
自定義異常
創(chuàng)建用戶自定義異常類
- 繼承自Exception類或某個子Exception類
- 定義屬性和方法屯仗,或重載父類的方法
- 對于異常搞坝,不僅要進(jìn)行捕獲處理,有時候還需要將異常進(jìn)一步傳給調(diào)用者魁袜,一變讓調(diào)用者也能感受到這種異常桩撮,這是可以在catch語句塊或finally
語句塊中采取以下三種方式:
- 將當(dāng)前捕獲的異常再次拋出
- 重新生成一個異常,并拋出
- 重新生成一個新異常峰弹,該異常中包含了當(dāng)前異常的信息店量,如throw new Exception (“some message “,e)
斷言及程序的調(diào)試
斷言
- assert 表達(dá)式
- assert 表達(dá)式,信息
- 在調(diào)試程序時,如果表達(dá)式不為true,則程序會產(chǎn)生異常鞠呈,并輸出相關(guān)的錯誤信息
例
assert hypotenuse(3,4)==5:”算法不正確”融师;
它起到對程序的檢測作用
編譯及運(yùn)行
- 只有在JDK1.4及以上的版本才可以使用斷言
- 在運(yùn)行時,要使assert起作用粟按,則在運(yùn)行時诬滩,使用選項(xiàng)(-ea ,即-enableassetions)
如 java -ea - classpath.Assertion
程序的測試及Junit
- 在編寫程序代碼的同時霹粥,還編寫測試代碼來判斷這些程序是否正確,這個過程稱為“測試驅(qū)動”的開發(fā)過程
- 在java的測試過程灭将,經(jīng)常使用Junit框架
測試函數(shù)
@Test來標(biāo)注測試函數(shù)
fail(info) :表示信息出錯
assertEqauls(arg1,arg2):表示程序要保證兩個參數(shù)相等
assertNull(arg):表示參數(shù)要為null
程序的調(diào)試
- 語法錯誤(Syntax error):編輯疼鸟,編譯器發(fā)現(xiàn)
- 運(yùn)行錯誤(Runtime error):異常處理機(jī)制
- 邏輯錯誤(Logic error):調(diào)式(debug),單元測試(unit test)
程序的調(diào)試
- 在IDE中庙曙,項(xiàng)目中點(diǎn)右鍵空镜,debug as
- 進(jìn)入到調(diào)試視圖(debug perspective)
調(diào)試的手段
- 斷點(diǎn)(breakpoint)
- 跟蹤(trace)
- 監(jiān)視(watch)
在很有可能有錯誤的地方設(shè)置斷點(diǎn),然后跟蹤
java基礎(chǔ)類庫
- java.lang core
- java.util
- java.io
- java.awt
- java.net
- java.sql
Object類
- Object類是所有類的直接或間接父類
- 讓所有的類有了一致性
- equals()
- ==是引用相等捌朴,equals是內(nèi)容相等
- 如果覆蓋equals方法吴攒,一般也要覆蓋hashcode方法
- getClass()方法是final方法,它返回一個對象在運(yùn)行時所對應(yīng)的標(biāo)識
- toString返回對象的字符串表示
- finalize用于在垃圾收集前清除對象
- notify(),notifyAll(),wait()線程相關(guān)
System類
- System.getProperty(String name)獲取特定的系統(tǒng)屬性值
線程
- 進(jìn)程:一個程序的運(yùn)行
- 線程:程序中單個順序的流控制稱為線程
一個進(jìn)程中可以含有多個線程
一個進(jìn)程中的多個線程
特點(diǎn)
- 分享CPU(并發(fā)的或以時間片的方式)
- 共享內(nèi)存
- 線程體 — run()方法來實(shí)現(xiàn)的
- 線程啟動后砂蔽,系統(tǒng)就自動調(diào)用run()方法
使用
- 通過繼承Thread類
- 通過向Thread()構(gòu)造方法傳遞Runnable對象
- 可用匿名類實(shí)現(xiàn)Runnable或用lambda表達(dá)式
- 線程池封裝