java 關(guān)鍵字

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()方法。

  • 當(dāng)垃圾回收器(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.itdecent.cn/p/0ce2279c5691

static

  1. 修飾成員變量和成員方法: 被 static 修飾的成員屬于類,不屬于單個這個類的某個對象,被類中所有對象共享,可以并且建議通過類名調(diào)用。被static 聲明的成員變量屬于靜態(tài)成員變量,靜態(tài)變量 存放在 Java 內(nèi)存區(qū)域的方法區(qū)。調(diào)用格式:類名.靜態(tài)變量名 類名.靜態(tài)方法名()
  2. 靜態(tài)代碼塊: 靜態(tài)代碼塊定義在類中方法外, 靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—>非靜態(tài)代碼塊—>構(gòu)造方法)。 該類不管創(chuàng)建多少對象,靜態(tài)代碼塊只執(zhí)行一次.
  3. 靜態(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成員變量和方法。
  4. 靜態(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)。當(dāng)distance為正數(shù)時,將list后distance個元素整體移到前面。當(dāng)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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容