final
修飾符(關(guān)鍵字)如果一個類被聲明為final惯吕,意味著它不能再派生出新的子類原探,不能作為父類被繼承誊役。因此一個類不能既被聲明為 abstract的倍试,又被聲明為final的。將變量或方法聲明為final绑蔫,可以保證它們在使用中不被改變运沦。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取配深,不可修改茶袒。被聲明為final的方法也同樣只能使用,不能重載
finally
異常處理時提供 finally 塊來執(zhí)行任何清除操作凉馆。如果拋出一個異常,那么相匹配的 catch 子句就會執(zhí)行,然后控制就會進入
finally 塊(如果有的話)澜共。一般異常處理塊需要向叉。
finalize
方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作嗦董。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的母谎。
finalize() 方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的。 Java中所有類都從Object類中繼承finalize()方法京革。
當垃圾回收器(garbage colector)決定回收某對象時奇唤,就會運行該對象的finalize()方法。Java中是沒有析構(gòu)函數(shù)的匹摇。C++的析構(gòu)函數(shù)是在對象消亡時運行的咬扇。但是在Java中很不幸,如果內(nèi)存總是充足的廊勃,那么垃圾回收可能永遠不會進行懈贺,也就是說filalize()可能永遠不被執(zhí)行,顯然指望它做收尾工作是靠不住的坡垫。
那么finalize()究竟是做什么的呢梭灿?它最主要的用途是回收特殊渠道申請的內(nèi)存。Java程序有垃圾回收器冰悠,所以一般情況下內(nèi)存問題不用程序員操心堡妒。但有一種JNI(Java Native Interface)調(diào)用non-Java程序(C或C++),finalize()的工作就是回收這部分的內(nèi)存溉卓。
構(gòu)造代碼塊
- 構(gòu)造代碼塊的作用是給對象進行初始化皮迟。
- 對象一建立就運行構(gòu)造代碼塊了,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行的诵。這里要強調(diào)一下万栅,有對象建立,才會運行構(gòu)造代碼塊西疤,類不能調(diào)用構(gòu)造代碼塊的烦粒,而且構(gòu)造代碼塊與構(gòu)造函數(shù)的執(zhí)行順序是前者先于后者執(zhí)行。
- 構(gòu)造代碼塊與構(gòu)造函數(shù)的區(qū)別是:構(gòu)造代碼塊是給所有對象進行統(tǒng)一初始化代赁,而構(gòu)造函數(shù)是給對應(yīng)的對象初始化扰她,因為構(gòu)造函數(shù)是可以多個的,運行哪個構(gòu)造函數(shù)就會建立什么樣的對象芭碍,但無論建立哪個對象徒役,都會先執(zhí)行相同的構(gòu)造代碼塊。也就是說窖壕,構(gòu)造代碼塊中定義的是不同對象共性的初始化內(nèi)容忧勿。
靜態(tài)代碼塊
- 它是隨著類的加載而執(zhí)行杉女,只執(zhí)行一次,并優(yōu)先于主函數(shù)鸳吸。具體說熏挎,靜態(tài)代碼塊是由類調(diào)用的。類調(diào)用時晌砾,先執(zhí)行靜態(tài)代碼塊坎拐,然后才執(zhí)行主函數(shù)的
- 靜態(tài)代碼塊其實就是給類初始化的,而構(gòu)造代碼塊是給對象初始化的
- 靜態(tài)代碼塊中的變量是局部變量养匈,與普通函數(shù)中的局部變量性質(zhì)沒有區(qū)別
- 一個類中可以有多個靜態(tài)代碼塊
public class StaticCode {
static int cnt=6;
static{
cnt+=9;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(cnt);
}
static{
cnt/=3;
}
}
//運行結(jié)果:5
public class StaticCode {
public StaticCode(){//構(gòu)造函數(shù)
System.out.println("A的構(gòu)造函數(shù)");
}
{//構(gòu)造代碼塊
System.out.println("A的構(gòu)造代碼塊");
}
static {//靜態(tài)代碼塊
System.out.println("A的靜態(tài)代碼塊");
}
public static void main(String[] args) {
StaticCode a=new StaticCode();
}
}
//運行結(jié)果
A的靜態(tài)代碼塊
A的構(gòu)造代碼塊
A的構(gòu)造函數(shù)
序列化
一個類的對象要想序列化成功哼勇,必須滿足兩個條件:
- 該類必須實現(xiàn) java.io.Serializable 對象。
- 該類的所有屬性必須是可序列化的呕乎。如果有一個屬性不是可序列化的积担,則該屬性必須注明是短暫的。
implements Serializable
- ObjectOutputStream和ObjectInputStream實現(xiàn)序列化和反序列化
- 在類中增加writeObject 和 readObject 方法可以實現(xiàn)自定義序列化策略
native
- 一個native方法就是一個Java調(diào)用非Java代碼的接口楣嘁。一個native方法是指該方法的實現(xiàn)由非Java語言實現(xiàn).
- 在定義一個native方法時磅轻,并不提供實現(xiàn)體(比較像定義一個Java Interface),因為其實現(xiàn)體是由非Java語言在外面實現(xiàn)的逐虚。
JNI
- Java本機接口(Java Native Interface)聋溜,是一個本機編程接口,它是Java軟件開發(fā)工具箱(Java Software Development Kit叭爱,SDK)的一部分撮躁。
- JNI允許Java代碼使用以其他語言編寫的代碼和代碼庫。Invocation API(JNI的一部分)可以用來將Java虛擬機(JVM)嵌入到本機應(yīng)用程序中买雾,從而允許程序員從本機代碼內(nèi)部調(diào)用Java代碼把曼。
[圖片上傳失敗...(image-ca25d1-1557841284036)]
class HelloWorld {
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().hello();
}
https://blog.csdn.net/qq_23994787/article/details/79066336
自動拆箱和自動裝箱
自動裝箱就是Java自動將原始類型值轉(zhuǎn)換成對應(yīng)的對象,比如將int的變量轉(zhuǎn)換成Integer對象漓穿,這個過程叫做裝箱嗤军,反之將Integer對象轉(zhuǎn)換成int類型值,這個過程叫做拆箱晃危。
自動裝箱時編譯器調(diào)用valueOf將原始類型值轉(zhuǎn)換成對象叙赚,同時自動拆箱時,編譯器通過調(diào)用類似intValue(),doubleValue()這類的方法將對象轉(zhuǎn)換成原始類型值僚饭。
http://www.reibang.com/p/0ce2279c5691
static
- 修飾成員變量和成員方法: 被 static 修飾的成員屬于類震叮,不屬于單個這個類的某個對象,被類中所有對象共享鳍鸵,可以并且建議通過類名調(diào)用苇瓣。被static 聲明的成員變量屬于靜態(tài)成員變量,靜態(tài)變量 存放在 Java 內(nèi)存區(qū)域的方法區(qū)偿乖。調(diào)用格式:類名.靜態(tài)變量名 類名.靜態(tài)方法名()
- 靜態(tài)代碼塊: 靜態(tài)代碼塊定義在類中方法外, 靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—>非靜態(tài)代碼塊—>構(gòu)造方法)击罪。 該類不管創(chuàng)建多少對象哲嘲,靜態(tài)代碼塊只執(zhí)行一次.
- 靜態(tài)內(nèi)部類(static修飾類的話只能修飾內(nèi)部類): 靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類之間存在一個最大的區(qū)別: 非靜態(tài)內(nèi)部類在編譯完成之后會隱含地保存著一個引用,該引用是指向創(chuàng)建它的外圍類外邓,但是靜態(tài)內(nèi)部類卻沒有撤蚊。沒有這個引用就意味著:1. 它的創(chuàng)建是不需要依賴外圍類的創(chuàng)建。2. 它不能使用任何外圍類的非static成員變量和方法损话。
- 靜態(tài)導(dǎo)包(用來導(dǎo)入類中的靜態(tài)資源,1.5之后的新特性): 格式為:import static 這兩個關(guān)鍵字連用可以指定導(dǎo)入某個類中的指定靜態(tài)資源槽唾,并且不需要使用類名調(diào)用類中靜態(tài)成員丧枪,可以直接使用類中靜態(tài)成員變量和成員方法。
靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類之間存在一個最大的區(qū)別庞萍,我們知道非靜態(tài)內(nèi)部類在編譯完成之后會隱含地保存著一個引用拧烦,該引用是指向創(chuàng)建它的外圍類,但是靜態(tài)內(nèi)部類卻沒有钝计。沒有這個引用就意味著:
- 它的創(chuàng)建是不需要依賴外圍類的創(chuàng)建恋博。
- 它不能使用任何外圍類的非static成員變量和方法。
instanceof(對象是否是類的實例)
是Java的保留關(guān)鍵字私恬。它的作用是測試它左邊的對象是否是它右邊的類的實例债沮,返回boolean類型的數(shù)據(jù)”久可以用在繼承中的子類的實例是否為父類的實現(xiàn)疫衩。
public interface A {}
public class B implements A{
public static void main(String[] args) {
// TODO Auto-generated method stub
A a=null;
B b=null;
System.out.println(a instanceof A); //false
System.out.println(b instanceof B); //false
System.out.println(a instanceof B); //false
System.out.println(b instanceof A); //false
a=new B();
System.out.println(a instanceof A); //true
System.out.println(a instanceof B); //true
b=new B();
System.out.println(b instanceof A); //true
System.out.println(b instanceof B); //true
}
}
class.forname():動態(tài)加載類
class.newInstance():靜態(tài)方法來實例
Collections工具類方法
- void reverse(List list)//反轉(zhuǎn)
- void shuffle(List list)//隨機排序
- void sort(List list)//按自然排序的升序排序
- void sort(List list, Comparator c)//定制排序,由Comparator控制排序邏輯
- void swap(List list, int i , int j)//交換兩個索引位置的元素
- void rotate(List list, int distance)//旋轉(zhuǎn)荣德。當distance為正數(shù)時闷煤,將list后distance個元素整體移到前面。當distance為負數(shù)時涮瞻,將 list的前distance個元素整體移到后面鲤拿。
查找刪除
- int binarySearch(List list, Object key)//對List進行二分查找,返回索引署咽,注意List必須是有序的
- int max(Collection coll)//根據(jù)元素的自然順序近顷,返回最大的元素。 類比int min(Collection coll)
- int max(Collection coll, Comparator c)//根據(jù)定制排序艇抠,返回最大元素幕庐,排序規(guī)則由Comparatator類控制。類比int min(Collection coll, Comparator c)
- void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素家淤。
- int frequency(Collection c, Object o)//統(tǒng)計元素出現(xiàn)次數(shù)
- int indexOfSubList(List list, List target)//統(tǒng)計target在list中第一次出現(xiàn)的索引异剥,找不到則返回-1,類比int lastIndexOfSubList(List source, list target).
- boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替換舊元素
Array 工具類方法
- 排序 : sort()
- 查找 : binarySearch()
- 比較: equals()
- 填充 : fill()
- 轉(zhuǎn)列表: asList()
- 轉(zhuǎn)字符串 : toString()
- 復(fù)制: copyOf()
泛型
ArrayList<Integer> arrayInteger = new ArrayList<Integer>();
ArrayList<String> arrayString = new ArrayList<String>();
System.out.println(arrayInteger.equals(arrayString)); //輸出true
泛型它不會影響java虛擬機生成的匯編代碼絮重,在編譯階段冤寿,虛擬機就會把泛型的類型擦除歹苦,還原成沒有泛型的代碼,頂多編譯速度稍微慢一些督怜,執(zhí)行速度是完全沒有什么區(qū)別的殴瘦。這就是為什么,Java的泛型被稱為“偽泛型”的原因
通配符泛型<?>
- 如果只指定了<?>号杠,而沒有extends蚪腋,則默認是允許Object及其下的任何Java類了。也就是任意類姨蟋。
- 通配符泛型不單可以向下限制屉凯,如<? extends Collection>,還可以向上限制眼溶,如<? super Double>悠砚,表示類型只能接受Double及其上層父類類型,如Number堂飞、Object類型的實例灌旧。
- 泛型類定義可以有多個泛型參數(shù),中間用逗號隔開绰筛,還可以定義泛型接口枢泰,泛型方法。這些都與泛型類中泛型的使用規(guī)則類似别智。
Class<T>在實例化的時候宗苍,T要替換成具體類
Class<?>它是個通配泛型,?可以代表任何類型
<? extends T>受限統(tǒng)配薄榛,表示T的一個未知子類
<? super T>下限統(tǒng)配讳窟,表示T的一個未知父類
https://blog.csdn.net/ikownyou/article/details/65630385
Enumeration
- hasMoreElemnet
- nextElemet
Iterator
- hasNext
- next