1.面向?qū)ο蟮娜齻€基本特征是:封裝波势、繼承、多態(tài)
封裝
封裝瘾英,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作孝凌,對不可信的進行信息隱藏方咆。
簡單的說,一個類就是一個封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實體蟀架。在一個對象內(nèi)部瓣赂,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問片拍。通過這種方式煌集,對象對內(nèi)部數(shù)據(jù)提供了不同級別的保護,以防止程序中無關(guān)的部分意外的改變或錯誤的使用了對象的私有部分捌省。
在Java中類中成員的屬性有:public苫纤, protected, <default>纲缓, private卷拘,這四個屬性的訪問權(quán)限依次降低。
封裝主要在于實現(xiàn)了我們能修改自己實現(xiàn)的代碼祝高,而不用調(diào)用修改程序的片段
封裝的優(yōu)點:良好的封裝能夠減少耦合栗弟,類內(nèi)部結(jié)構(gòu)可以自由修改,可以對成員變量進行準確控制工闺,隱藏信息實現(xiàn)細節(jié)乍赫。
為了實現(xiàn)良好的封裝,將類的成員聲明為priviate,通過public方法對變量進行訪問陆蟆,對一個變量的操作雷厂,一般有讀取和賦值的2個操作,為了實現(xiàn)這兩個操作叠殷,一個是getXX(XX表示成員要訪問變量的名字)用來讀取成員變量改鲫,另一個是setXX()用來對變量賦值
多態(tài)
多態(tài)是同一個行為具有不同表現(xiàn)形式或形態(tài)能力
多態(tài)是同一個接口,使用不同實例而執(zhí)行不同操作
多態(tài)是面向?qū)ο笳Z言重要特性,類似指針或引用派生類的對象钩杰,在具體訪問時實現(xiàn)方法的動態(tài)綁定
多態(tài)存在三個必要條件
繼承纫塌,重寫,父類引用指向子類對象
2.重寫和重載的區(qū)別
重寫:
重寫(Override)是父類與子類之間多態(tài)性的一種表現(xiàn)讲弄。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Override)依痊。子類的對象使用這個方法時避除,將調(diào)用子類中的定義,對它而言胸嘁,父類中的定義如同被“屏蔽”了瓶摆。
重載:
重載(Overload)是一個類中多態(tài)性的一種表現(xiàn)。如果在一個類中定義了多個同名的方法性宏,它們參數(shù)列表不同群井,則稱為方法的重載(Overload)
區(qū)別:重載實現(xiàn)于一個類中;重寫實現(xiàn)于子類中。
重載(Overload):是一個類中多態(tài)性的一種表現(xiàn)毫胜,指同一個類中不同的函數(shù)使用相同的函數(shù)名书斜,但是函數(shù)的參數(shù)個數(shù)或類型不同〗褪梗可以有不同的返回類型;可以有不同的訪問修飾符;可以拋出不同的異常荐吉。調(diào)用的時候根據(jù)函數(shù)的參數(shù)來區(qū)別不同的函數(shù)。
重寫(Override): 是父類與子類之間的多態(tài)性口渔,是子類對父類函數(shù)的重新實現(xiàn)样屠。函數(shù)名和參數(shù)與父類一樣,子類與父類函數(shù)體內(nèi)容不一樣缺脉。子類返回的類型必須與父類保持一致痪欲;子類方法訪問修飾符的限制一定要大于父類方法的訪問修飾(public>protected>default>private);子類重寫方法一定不能拋出新的檢查異彻ダ瘢或者比被父類方法申明更加寬泛的檢查型異常业踢。
重載
package com.etime09;
public class Goods { //創(chuàng)建一個商品類
private String ID;
private int price;
private String name;
private String manufactureDate;
//實現(xiàn)構(gòu)造函數(shù)的重載 參數(shù)個數(shù)或類型不同
public Goods() {
super();
// TODO Auto-generated constructor stub
}
public Goods(String iD) {
super();
ID = iD;
}
public Goods(String iD, int price) {
super();
ID = iD;
this.price = price;
}
public Goods(String iD, int price, String name) {
super();
ID = iD;
this.price = price;
this.name = name;
}
public Goods(String iD, int price, String name, String manufactureDate) {
super();
ID = iD;
this.price = price;
this.name = name;
this.manufactureDate = manufactureDate;
}
}
重寫
package com.etime09;
public class Person { //創(chuàng)建一個父類Person
private String name;
private int age;
//父類中寫一個eat()方法
public void eat() {
System.out.println("人都要吃飯");
}
}
---------------------------------------------
package com.etime09;
public class Student extends Person { //Student子類繼承Person父類
@Override
//重寫eat()方法 方法名,參數(shù)秘蛔,返回類型相同陨亡;方法體內(nèi)容不同
public void eat() {
System.out.println("學生喜歡吃肉");
}
}
多態(tài)
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。
多態(tài)就是同一個接口深员,使用不同的實例而執(zhí)行不同操作负蠕。
多態(tài)存在的三個必要條件:繼承,重寫倦畅,父類引用指向子類對象
當使用多態(tài)方式調(diào)用方法時遮糖,首先檢查父類中是否有該方法,如果沒有叠赐,則編譯錯誤欲账;如果有屡江,再去調(diào)用子類的同名方法。
多態(tài)的好處:可以使程序有良好的擴展赛不,并可以對所有類的對象進行通用處理惩嘉。
是否可以繼承string類? 不可以
3.JAVA 類支持多繼承嘛? 可以實現(xiàn)多接口嘛踢故? JAVA不支持多繼承文黎,但類可以實現(xiàn)多個接口,間接實現(xiàn)多繼承殿较,也可以通過內(nèi)部類
抽象類
抽象類必須用 abstract 修飾耸峭,子類必須實現(xiàn)抽象類中的抽象方法,如果有未實現(xiàn)的淋纲,那么子類也必須用 abstract 修飾劳闹。抽象類默認的權(quán)限修飾符為 public,可以定義為 public 或 procted洽瞬,如果定義為 private本涕,那么子類則無法繼承。抽象類不能創(chuàng)建對象
抽象類和普通類的區(qū)別
抽象類必須用public片任、procted 修飾(如果為private修飾偏友,那么子類則無法繼承,也就無法實現(xiàn)其抽象方法)对供。默認缺省為 public
抽象類無法創(chuàng)建對象
如果一個子類繼承抽象類位他,那么必須實現(xiàn)其所有的抽象方法。如果有未實現(xiàn)的抽象方法产场,那么必須定義為 abstract
接口
接口中的變量隱式的使用 public static final 修飾鹅髓,并且需要給出初始值。方法隱式的使用 public abstract 修飾(并且只能是 public 京景,如果是 private窿冯,procted,那么就編譯報錯)确徙。接口中的方法默認不能有具體的實現(xiàn)(JDK1.8開始可以有默認的實現(xiàn))
4.接口和抽象類的區(qū)別
1.抽象類只能繼承一次醒串,但是可以實現(xiàn)多個接口
接口和抽象類必須實現(xiàn)其中所有的方法,抽象類中如果有未實現(xiàn)的抽象方法鄙皇,那么子類也需要定義為抽象類芜赌。抽象類中可以有非抽象的方法
2.接口中的變量必須用 public static final 修飾,并且需要給出初始值伴逸。所以實現(xiàn)類不能重新定義缠沈,也不能改變其值。
3.接口中的方法默認是 public abstract,也只能是這個類型洲愤。不能是 static颓芭,接口中的方法也不允許子類覆寫,抽象類中允許有static 的方法柬赐。
接口和抽象都是繼承樹的上層亡问,共同點如下:
1.都是上層的抽象層
2.都不能實現(xiàn)實例化
3.都能包含抽象的方法,這些抽象的方法肛宋,用于描述類具備的功能
區(qū)別如下:
1.在抽象類中可以寫非抽象的方法玛界,從而避免在子類中重復書寫他們,這樣可以代碼的復用性悼吱,這是抽象類的優(yōu)勢,接口中只能有抽象方法
2.抽象級別(從高到低)良狈,接口》抽象類》實現(xiàn)類
3.接口的設(shè)計目的后添,是對類的行為進行約束,側(cè)重與動作薪丁,而抽象類的設(shè)計目的是代碼復用遇西,
4.抽象類是 is a 關(guān)系,而接口是 has a 關(guān)系(實現(xiàn)多接口)
5.簡要敘述下Java中修飾符的作用域及可見性严嗜?
public:修飾的成員可以在任何范圍內(nèi)直接訪問粱檀,只是一種最寬松的訪問控制等級。需要注意的漫玄,所謂的直接訪問仍需要先創(chuàng)建或獲得一個相應類的對象然后才可以使用”對象名.成員“的方式訪問其屬性或調(diào)用其方法茄蚯,但是出于信息封裝和隱藏的需要一般不提倡把成員聲明為public的,而構(gòu)造方法和需要外界直接調(diào)用的普通方法則適合聲明為public.
protected:修飾的成員可以在其所在類中睦优、同一包中及子類中(無論子類在不在同一個包)被直接訪問渗常,但不能在位于不同包中的非子類中被直接訪問,這里需要特別聲明:在位于不同包的子類中必須是子類的對象才能直接訪問其父類的protected成員汗盘,而父類自身的對象反而不能訪問其所在類中聲明的protected成員皱碘。
default:缺省訪問修飾符的成員只能在其所在類中或包中直接訪問,在不同包中即使是不同包的子類也不能直接訪問隐孽。
private:成員只能在所在類中被直接訪問癌椿,是4種訪問等級最高的一個。
equals() 和 “==” 操作用于對象的比較菱阵,檢查對象的相等性踢俄,前者是方法,后者是操作符送粱。
總結(jié):
1.一般使用==比較原生類型如:boolean,int,char等等褪贵,使用equals()比較對象
2.如果兩個引用指向相同的對象==返回true,equals()的返回依賴于具體業(yè)務(wù)實現(xiàn),一般重寫equals方法,同樣重寫hashcode方法脆丁,默認的equals實現(xiàn)是與“==”一樣的
3.字符串的使用對比使用equals()代替==操作符
6.一個static 方法內(nèi)可以調(diào)用非static方法嘛世舰?
不可以,因為非static要與關(guān)聯(lián)對象關(guān)聯(lián)在一起槽卫,必須創(chuàng)建一個對象后跟压,才能在對象上進行方法調(diào)用,當一個static方法被調(diào)用時歼培,可能還沒有創(chuàng)建任何實例對象震蒋,如果從一個static方法中,發(fā)出對非static方法的調(diào)用,static方法是靜態(tài)方法躲庄,是屬于類的方法查剖,非static方法是屬于對象的方法,所以在static方法中想要調(diào)用非static方法噪窘,要先創(chuàng)建一個對象笋庄,再有這個對象來調(diào)用非static方法。
7.Java靜態(tài)變量與實例變量的區(qū)別
(1) 在語法定義上區(qū)別:靜態(tài)變量前要加static關(guān)鍵字倔监,而實例變量前則不加
(2) 程序運行時的區(qū)別:實例變量屬于某個對象屬性直砂,必須創(chuàng)建了實例對象,其中實例變量才會被分配空間浩习,才能使用這個實例變量静暂。靜態(tài)變量不屬于某個實例對象,而屬于類谱秽,所以稱為類變量洽蛀,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象弯院,靜態(tài)變量就會被分配空間辱士,只分配一次,靜態(tài)變量就可以被使用听绳∷痰猓總之,實例變量必須創(chuàng)建對象后才能通過這個對象使用椅挣,靜態(tài)變量可以直接使用類來引用头岔。
8.int和Integer的區(qū)別
1、Integer是int的包裝類鼠证,int則是java的一種基本數(shù)據(jù)類型
2峡竣、Integer變量必須實例化后才能使用,而int變量不需要
3量九、Integer實際是對象的引用适掰,當new一個Integer時颂碧,實際上是生成一個指針指向此對象;而int則是直接存儲數(shù)據(jù)值
4类浪、Integer的默認值是null载城,int的默認值是0
9. StringBuilder,StringBuffer和String區(qū)別
1.三者在執(zhí)行速度方面的比較:StringBuilder > StringBuffer > String
(為啥字符串是最低的工作效率呢?String類型是不可改變的對象了费就,由于這種機制诉瓦,每當用String操作字符串時,實際上是在不斷的創(chuàng)建新的對象力细,而原來的對象就會變?yōu)槔唬牵没厥盏舨窃瑁上攵@樣執(zhí)行效率會有多底。)
- StringBuilder:線程非安全的
StringBuffer:線程安全的
(當我們在字符串緩沖去被多個線程使用時候眠蚂,JVM不能保證StringBuilder的操作是安全的煞聪,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的逝慧。當然大多數(shù)情況下就是我們是在單線程下進行的操作米绕,所以大多數(shù)情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因馋艺。)
對于三者使用的總結(jié):
1.如果要操作少量的數(shù)據(jù)用 = String
2.單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder
3.多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer
StringBuffer和StringBuilder的相同點就是,他們都是可變長度 的字符串迈套,他們兩者之間的方法使用幾乎可以互通捐祠。而且相比于字符串來說,StringBuffer和StringBuilder的執(zhí)行效率要高出很多桑李。
StringBuffer和StringBuilder的不同點我們可以從以下幾個方面來談
首先踱蛀,兩者的英文名稱就不一樣,StringBuffer是字符串緩沖贵白,StringBuilder是字符創(chuàng)生成器
其次率拒,StringBuffer是線程安全的,StringBuilder是非線程安全禁荒。正因為他們有這樣的線程不同點猬膨,所以導致StringBuilder的執(zhí)行效率遠比StringBuffer要強悍很多。StringBuffer起始于jdk 1.0呛伴、StringBuilder起始于jdk 1.5
當然了勃痴,這也需要分場景和業(yè)務(wù)需求,若果單線程下面操作字符串緩沖的話热康,我建議使用StringBuilder沛申。若果是多線程下字符串緩沖操作,我建議使用StringBuffer姐军。因為StringBuffer使用了線程同步铁材,他會對當前的線程進行一個小小的檢查尖淘,保證其安全運行。雖然執(zhí)行速度不高著觉,但是換回來了安全也是值得的村生,畢竟我們都知道,Java語言把安全看的比什么都要重要固惯。
10. JAVA 初始化原則
使用場景
在java程序中梆造,當實例化對象時,對象的所在類的所有成員變量首先要進行初始化葬毫,只有當所有類成員完成初始化后镇辉,才會調(diào)用對象所在類的構(gòu)造函數(shù)創(chuàng)建對象。
原則
變量優(yōu)先于塊贴捡、靜態(tài)優(yōu)先于非靜態(tài)忽肛。
父類優(yōu)先于派生類初始化。
按照成員變量定義的順序來進行初始化烂斋,即使變量定義散布于方法定義之中屹逛,它們?nèi)匀辉谌魏畏椒ǎò?gòu)造器)被調(diào)用前初始化。
初始化順序
父類靜態(tài)變量
父類靜態(tài)代碼塊
子類靜態(tài)變量
子類靜態(tài)代碼塊
父類非靜態(tài)變量
父類非靜態(tài)代碼塊
父類構(gòu)造函數(shù)
子類非靜態(tài)變量
子類非靜態(tài)代碼塊
子類構(gòu)造函數(shù)
11. 當try,catch中有return返回時汛骂,finally中代碼會執(zhí)行嘛
一罕模、無論有沒有異常,finally中的代碼都會執(zhí)行
二帘瞭、當try淑掌、catch中有return時,finally中的代碼依然會繼續(xù)執(zhí)行
三蝶念、finally是在return后面的表達式運算以后執(zhí)行的抛腕,此時并無返回運算以后的值,而是把值保存起來媒殉,無論finally對該值作任何的改變担敌,返回的值都不會改變,依然返回保存起來的值廷蓉。也就是說方法的返回值是在finally運算以前就肯定了的全封。
四、若是return的數(shù)據(jù)是引用數(shù)據(jù)類型桃犬,而在finally中對該引用數(shù)據(jù)類型的屬性值的改變起做用售貌,try中的return語句返回的就是在finally中改變后的該屬性的值。
五疫萤、finally代碼中最好不要包含return颂跨,程序會提早退出,也就是說返回的值不是try或catch中的值測試
先執(zhí)行try中的語句扯饶,包括return后面的表達式恒削,
有異常時,先執(zhí)行catch中的語句池颈,包括return后面的表達式,
而后執(zhí)行finally中的語句,若是finally里面有return語句,會提早退出钓丰,
最后執(zhí)行try中的return躯砰,有異常時執(zhí)行catch中的return。指針
在執(zhí)行try携丁、catch中的return以前必定會執(zhí)行finally中的代碼(若是finally存在)琢歇,若是finally中有return語句,就會直接執(zhí)行finally中的return方法梦鉴,因此finally中的return語句必定會被執(zhí)行的李茫。編譯器把finally中的return語句標識為一個warning.
11. final,finally和finalizie的區(qū)別
1.簡單區(qū)別:
final用于聲明屬性,方法和類肥橙,分別表示屬性不可交變魄宏,方法不可覆蓋,類不可繼承存筏。
finally是異常處理語句結(jié)構(gòu)的一部分宠互,表示總是執(zhí)行。
finalize是Object類的一個方法椭坚,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法予跌,供垃圾收集時的其他資源回收,例如關(guān)閉文件等善茎。
2.中等區(qū)別:
雖然這個單詞在Java中都存在匕得,但是并沒太多關(guān)聯(lián):
final:java中的關(guān)鍵字,修飾符巾表。
A).如果一個類被聲明為final,就意味著它不能再派生出新的子類略吨,不能作為父類被繼承集币。因此,一個類不能同時被聲明為abstract抽象類的和final的類翠忠。
B).如果將變量或者方法聲明為final鞠苟,可以保證它們在使用中不被改變.
1)被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取秽之,不可修改当娱。
2)被聲明final的方法只能使用,不能重載考榨。
finally:java的一種異常處理機制跨细。
finally是對Java異常處理模型的最佳補充。finally結(jié)構(gòu)使代碼總會執(zhí)行河质,而不管無異常發(fā)生冀惭。使用finally可以維護對象的內(nèi)部狀態(tài)震叙,并可以清理非內(nèi)存資源。特別是在關(guān)閉數(shù)據(jù)庫連接這方面散休,如果程序員把數(shù)據(jù)庫連接的close()方法放到finally中媒楼,就會大大降低程序出錯的幾率。
finalize:Java中的一個方法名戚丸。
Java技術(shù)使用finalize()方法在垃圾收集器將對象從內(nèi)存中清除出去前划址,做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒被引用時對這個對象調(diào)用的限府。它是在Object類中定義的夺颤,因此所的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作谣殊。finalize()方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的拂共。
12. JAVA遇到的異常錯誤
Java.lang.NullPointerException
這個異常大家肯定都經(jīng)常碰到,異常的解釋是"程序遇上了空指針"姻几,簡單地說就是調(diào)用了未經(jīng)初始化的對象或者是不存在的對象宜狐,這個錯誤經(jīng)常出現(xiàn)在創(chuàng)建圖片,調(diào)用數(shù)組這些操作中蛇捌,比如圖片未經(jīng)初始化抚恒,或者圖片創(chuàng)建時的路徑錯誤等等。對數(shù)組操作中出現(xiàn)空指針络拌,很多情況下是一些剛開始學習編程的朋友常犯的錯誤俭驮,即把數(shù)組的初始化和數(shù)組元素的初始化混淆起來了。數(shù)組的初始化是對數(shù)組分配需要的空間春贸,而初始化后的數(shù)組混萝,其中的元素并沒有實例化,依然是空的萍恕,所以還需要對每個元素都進行初始化(假如要調(diào)用的話)
2. java.lang.ClassNotFoundException
這個異常是很多原本在JB等開發(fā)環(huán)境中開發(fā)的程序員逸嘀,把JB下的程序包放在WTk下編譯經(jīng)常出現(xiàn)的問題,異常的解釋是"指定的類不存在"允粤,這里主要考慮一下類的名稱和路徑是否正確即可崭倘,假如是在JB下做的程序包,一般都是默認加上Package的类垫,所以轉(zhuǎn)到WTK下后要注重把Package的路徑加上司光。
3. java.lang.ArithmeticException
這個異常的解釋是"數(shù)學運算異常",比如程序中出現(xiàn)了除以零這樣的運算就會出這樣的異常悉患,對這種異常残家,大家就要好好檢查一下自己程序中涉及到數(shù)學運算的地方,公式是不是有不妥了售躁。
4. java.lang.ArrayIndexOutOfBoundsException
這個異常相信很多朋友也經(jīng)常碰到過跪削,異常的解釋是"數(shù)組下標越界"谴仙,現(xiàn)在程序中大多都有對數(shù)組的操作,因此在調(diào)用數(shù)組的時候一定要認真檢查碾盐,看自己調(diào)用的下標是不是超出了數(shù)組的范圍晃跺,一般來說,顯示(即直接用常數(shù)當下標)調(diào)用不太輕易出這樣的錯毫玖,但隱式(即用變量表示下標)調(diào)用就經(jīng)常出錯了掀虎,還有一種情況,是程序中定義的數(shù)組的長度是通過某些特定方法決定的付枫,不是事先聲明的烹玉,這個時候,最好先查看一下數(shù)組的length阐滩,以免出現(xiàn)這個異常二打。
5. java.lang.IllegalArgumentException
這個異常的解釋是"方法的參數(shù)錯誤",很多J2ME的類庫中的方法在一些情況下都會引發(fā)這樣的錯誤掂榔,比如音量調(diào)節(jié)方法中的音量參數(shù)假如寫成負數(shù)就會出現(xiàn)這個異常继效,再比如g.setColor(int red,int green,int blue)這個方法中的三個值,假如有超過255的也會出現(xiàn)這個異常装获,因此一旦發(fā)現(xiàn)這個異常瑞信,我們要做的,就是趕緊去檢查一下方法調(diào)用中的參數(shù)傳遞是不是出現(xiàn)了錯誤穴豫。
6. java.lang.IllegalAccessException
這個異常的解釋是"沒有訪問權(quán)限"凡简,當應用程序要調(diào)用一個類,但當前的方法即沒有對該類的訪問權(quán)限便會出現(xiàn)這個異常精肃。對程序中用了Package的情況下要注重這個異常秤涩。
13. JAVA中的異常框架
Throwable
Throwable是 Java 語言中所有錯誤或異常的超類司抱。
Throwable包含兩個子類: Error 和 Exception筐眷。它們通常用于指示發(fā)生了異常情況。
Throwable包含了其線程創(chuàng)建時線程執(zhí)行堆棧的快照状植,它提供了printStackTrace()等接口用于獲取堆棧跟蹤數(shù)據(jù)等信息。
Exception
Exception及其子類是 Throwable 的一種形式怨喘,它指出了合理的應用程序想要捕獲的條件津畸。
RuntimeException
RuntimeException是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。
編譯器不會檢查RuntimeException異常必怜。例如肉拓,除數(shù)為零時,拋出ArithmeticException異常梳庆。RuntimeException是ArithmeticException的超類暖途。當代碼發(fā)生除數(shù)為零的情況時卑惜,倘若既"沒有通過throws聲明拋出ArithmeticException異常",也"沒有通過try…catch…處理該異常"驻售,也能通過編譯露久。這就是我們所說的"編譯器不會檢查RuntimeException異常"!
如果代碼會產(chǎn)生RuntimeException異常欺栗,則需要通過修改代碼進行避免毫痕。例如,若會發(fā)生除數(shù)為零的情況迟几,則需要通過代碼避免該情況的發(fā)生消请!
Error
和Exception一樣,Error也是Throwable的子類类腮。它用于指示合理的應用程序不應該試圖捕獲的嚴重問題臊泰,大多數(shù)這樣的錯誤都是異常條件。
和RuntimeException一樣蚜枢,編譯器也不會檢查Error缸逃。比如說內(nèi)存溢出
Java異常分類:
1 被檢查的異常(Checked Exception),
2 運行時異常(RuntimeException)祟偷,
3 錯誤(Error)察滑。
(01) 運行時異常
定義: RuntimeException及其子類都被稱為運行時異常。
特點: Java編譯器不會檢查它修肠。也就是說贺辰,當程序中可能出現(xiàn)這類異常時,倘若既"沒有通過throws聲明拋出它"嵌施,也"沒有用try-catch語句捕獲它"饲化,還是會編譯通過。例如吗伤,除數(shù)為零時產(chǎn)生的ArithmeticException異常吃靠,數(shù)組越界時產(chǎn)生的IndexOutOfBoundsException異常,fail-fail機制產(chǎn)生的ConcurrentModificationException異常等足淆,都屬于運行時異常巢块。
雖然Java編譯器不會檢查運行時異常,但是我們也可以通過throws進行聲明拋出巧号,也可以通過try-catch對它進行捕獲處理族奢。
如果產(chǎn)生運行時異常,則需要通過修改代碼來進行避免丹鸿。例如越走,若會發(fā)生除數(shù)為零的情況,則需要通過代碼避免該情況的發(fā)生!
(02) 被檢查的異常
定義: Exception類本身廊敌,以及Exception的子類中除了"運行時異常"之外的其它子類都屬于被檢查異常铜跑。
特點: Java編譯器會檢查它。此類異常骡澈,要么通過throws進行聲明拋出锅纺,要么通過try-catch進行捕獲處理,否則不能通過編譯秧廉。例如伞广,CloneNotSupportedException就屬于被檢查異常。當通過clone()接口去克隆一個對象疼电,而該對象對應的類沒有實現(xiàn)Cloneable接口嚼锄,就會拋出CloneNotSupportedException異常。
被檢查異常通常都是可以恢復的蔽豺。
(03) 錯誤
定義: Error類及其子類区丑。
特點: 和運行時異常一樣,編譯器也不會對錯誤進行檢查修陡。
當資源不足沧侥、約束失敗、或是其它程序無法繼續(xù)運行的條件發(fā)生時魄鸦,就產(chǎn)生錯誤宴杀。程序本身無法修復這些錯誤的。例如拾因,VirtualMachineError就屬于錯誤旺罢。
按照Java慣例,我們是不應該是實現(xiàn)任何新的Error子類的绢记!
14. JAVA中的異潮獯铮框架
Java GC(Garbage Collection,垃圾收集蠢熄,垃圾回收)機制跪解,是Java與C++/C的主要區(qū)別之一,在使用JAVA的時候签孔,一般不需要專門編寫內(nèi)存回收和垃圾清理代 碼叉讥。這是因為在Java虛擬機中,存在自動內(nèi)存管理和垃圾清掃機制饥追。
電腦的內(nèi)存大小的不變的图仓,當我們使用對象的時候,如使用New關(guān)鍵字的時候判耕,就會在內(nèi)存中生產(chǎn)一個對象透绩,但是我們在使用JAVA開發(fā)的時候翘骂,當一個對象使用完畢之后我們并沒有手動的釋放那個對象所占用的內(nèi)存壁熄,就這樣在使用程序的過程中帚豪,對象越來越多,當內(nèi)存存放不了這么多對象的時候草丧,電腦就會崩潰了狸臣,JAVA為了解決這個問題就推出了這個自動清除無用對象的功能典予,或者叫機制亥揖,這就是GC,有個好聽是名字叫垃圾回收唧垦,其實就在用來幫你擦屁股的懂拾,好讓你安心寫代碼煤禽,不用管內(nèi)存釋放,對象清理的事情了岖赋。