亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

【期末考試季】JAVA進(jìn)階復(fù)習(xí)提綱

Jokcy / 2762人閱讀

摘要:泛型類(lèi)型對(duì)象之間沒(méi)有關(guān)系,就算之間互為父子關(guān)系,也沒(méi)有任何關(guān)系。泛型類(lèi)的靜態(tài)上下文中類(lèi)型變量無(wú)效。不能捕獲或拋出泛型類(lèi)的實(shí)例。

前言

作為一塊后端沒(méi)有太多經(jīng)驗(yàn)的年糕,下周要考試了,所以我必須得來(lái)好好復(fù)習(xí)一下我的JAVA進(jìn)階課/(ㄒoㄒ)/~~。這個(gè)學(xué)期主要是學(xué)了:

泛型

反射

線(xiàn)程

JDBC

JAVA WEB基礎(chǔ)

Servlet

session&cookie

過(guò)濾器&監(jiān)聽(tīng)器

泛型

定義:Java的參數(shù)化類(lèi)型被稱(chēng)為泛型。
出現(xiàn)原因:JAVA不支持多繼承,雖然有接口,但還是有約束,必須要實(shí)現(xiàn)接口的方法。
注意點(diǎn):

虛擬機(jī)沒(méi)有泛型類(lèi)型對(duì)象。比如定義了ArrayList,實(shí)際上并沒(méi)有這個(gè)class的存在。

泛型類(lèi)型對(duì)象之間沒(méi)有關(guān)系,就算T之間互為父子關(guān)系,也沒(méi)有任何關(guān)系。

不能用基本類(lèi)型實(shí)例化類(lèi)型參數(shù)。

運(yùn)行時(shí)類(lèi)型查詢(xún)只適用于原始類(lèi)型。if( a instanceof Pair) //error

不能創(chuàng)建參數(shù)化的數(shù)組。聲明類(lèi)型為Pair[]的變量仍是合法的。不過(guò)不能用new Pair[10]初始化這個(gè)變量,但可以用(Pair[])new Pair來(lái)賦值,可能會(huì)找不到類(lèi)。

不能實(shí)例化類(lèi)型變量。如new T(), new T[...]T.class都是無(wú)效的。

泛型類(lèi)的靜態(tài)上下文中類(lèi)型變量無(wú)效。

不能捕獲或拋出泛型類(lèi)的實(shí)例。

    List  l1=new ArrayList();  
    List  l2=new ArrayList();
    System.out.println(l1.getClass()==l2.getClass());  //true

    Collection c= new ArrayList();
    if(c instanceof ArrayList){}  //報(bào)錯(cuò)
定義方式 泛型類(lèi)
public class 類(lèi)名

使用舉例:

Apple a1 = new Apple("蘋(píng)果"); 
Apple a2 = new Apple(5.67);

注意:不能多帶帶用來(lái)修飾靜態(tài)變量和靜態(tài)方法(方法定義具體看后面)。

泛型接口派生類(lèi)、子類(lèi):

一定要指明T的類(lèi)型,或者不寫(xiě)(編譯器會(huì)警告,默認(rèn)為是Object)

public class  A1  extends Apple{}
public class  A2  extends Apple{}  //等同于

泛型方法
public   void ArrayToCollection(T[] a, Collection c){
    //...
}

方法中的泛型參數(shù)無(wú)須顯式傳入實(shí)際類(lèi)型參數(shù)。編譯器根據(jù)實(shí)參推斷類(lèi)型形參的值。
為了讓編譯器能夠準(zhǔn)確的推斷出泛型方法中的形參類(lèi)型,不能產(chǎn)生多種可能性。

比如:我寫(xiě)了一個(gè)選出三個(gè)變量中中間的那個(gè)值的函數(shù)。我可以傳入字符串比較,也可以傳數(shù)字,但數(shù)字同時(shí)有Comparable和Number兩個(gè)接口,這樣它無(wú)法確定T應(yīng)該是哪個(gè),應(yīng)該寫(xiě)成public static > Pair minmax(T[] a)。
限定多個(gè)用&連接,比如T extends Comparable&Serializable。

類(lèi)型通配符

泛型必須傳入具體的類(lèi)型,但如果不確定,就可以用類(lèi)型通配符,用?表示。?代表可以使任意類(lèi)型
如:

public void test(List  c){
  for (int i = 0; i < c.size(); i++) {   
    System.out.println(c.get(i));  
  }
}

關(guān)系:
List是List的子類(lèi),且List、List...都是List的子類(lèi)。

限定:

設(shè)置上限:? extends Shape,必須是Shape/Shape的子類(lèi)才可以。

設(shè)置下限:? super Apple,必須是Apple/Apple的父類(lèi)才可以。

易錯(cuò):
1.List集合是只讀的。不能往List中添加除null的任何東西。
[原因]我們假設(shè)可以添加的話(huà):

List  is = Arrays.asList("one", "two", "three"); 
List   list=is;

list.add(new String("four"));//Ok
list.add(new Integer(4));//如果假設(shè)成立,則是OK的

那么混入了其他類(lèi)型的變量我們也沒(méi)有辦法判斷,所以要禁止添加。

2.?不是類(lèi)型變量,不可以代替類(lèi)型來(lái)使用。

public static void swap(Pair p){
      ? t=p.getFirst(); //錯(cuò)誤
}
類(lèi)的加載

定義:當(dāng)程序主動(dòng)使用某個(gè)類(lèi)時(shí),如果該類(lèi)還未被加載到內(nèi)存中,系統(tǒng)會(huì)通過(guò)加載、連接、初始化三個(gè)步驟來(lái)該類(lèi)進(jìn)行初始化,如果沒(méi)有意外,JVM將會(huì)連續(xù)完成這三個(gè)步驟,即類(lèi)的加載/初始化。

三個(gè)步驟:

加載——找到.class文件并把這個(gè)文件包含的字節(jié)碼加載到內(nèi)存中

連接——分為驗(yàn)證、準(zhǔn)備和解析

初始化——類(lèi)中靜態(tài)屬性和靜態(tài)塊的執(zhí)行

JVM進(jìn)程終止的情況:

運(yùn)行到最后正常結(jié)束

運(yùn)行到使用System.exit()/Runtime.getRuntime().exit()

遇到未捕獲的異?;蝈e(cuò)誤

所在平臺(tái)強(qiáng)制結(jié)束JVM進(jìn)程。

步驟-加載

調(diào)用ClassLoader的findClass方法,可從不同來(lái)源中加載類(lèi)的二進(jìn)制數(shù)據(jù),通常由如下來(lái)源:

本地文件系統(tǒng)

JAR包,例:JDBC編程用到的數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)

網(wǎng)絡(luò)加載,例:Applet

其他文件生成,例:JSP文件生成對(duì)應(yīng)的Class類(lèi)

運(yùn)行時(shí)計(jì)算生成,例:動(dòng)態(tài)代理技術(shù)

步驟-連接

驗(yàn)證:檢查被加載的類(lèi)是否有正確的內(nèi)部結(jié)構(gòu),并和其他類(lèi)一致。包括文件格式驗(yàn)證、元數(shù)據(jù)驗(yàn)證、字節(jié)碼驗(yàn)證、符合引用驗(yàn)證

準(zhǔn)備:為類(lèi)的靜態(tài)屬性分配內(nèi)存和指定初始值(通常情況下為默認(rèn)初始值)。這些變量所使用的的內(nèi)存在方法區(qū)被分配。

解析:將常量池中的符號(hào)引用替換為直接引用的過(guò)程。主要針對(duì)類(lèi)和接口、字段、類(lèi)方法、接口方法、方法類(lèi)型、方法句柄和調(diào)用點(diǎn)限定符。

注意:

public static int value = 123,變量value在準(zhǔn)備階段的值是0,注意是分配默認(rèn)值。假設(shè)一個(gè)變量的定義如下:

public static final int value = 123;變量value在準(zhǔn)備階段的值是123,因?yàn)檫@是一個(gè)常量,存放在方法區(qū)的常量池中。

解析過(guò)程不一定發(fā)生在初始化之前,可以發(fā)生在初始化之后再開(kāi)始。

步驟-初始化

編譯器自動(dòng)收集類(lèi)中所有類(lèi)變量的賦值動(dòng)作和靜態(tài)語(yǔ)句塊中的語(yǔ)句,收集的順序由語(yǔ)句在源文件中出現(xiàn)的順序所決定的。

public class Test {
    static int a = 5;  //準(zhǔn)備階段的初值為0,初始化賦值為5
    static int b; //準(zhǔn)備階段的初值為0
    static int c; //準(zhǔn)備階段的初值為0
    static{   
     //初始化階段的賦值為6
      b = 6; 
     }
}

初始化一個(gè)類(lèi)的步驟

類(lèi)沒(méi)有被加載,先加載并連接該類(lèi)。

類(lèi)的直接父類(lèi)還被初始化,先初始化其直接父類(lèi)。

類(lèi)中有初始化語(yǔ)句,系統(tǒng)依次執(zhí)行這些初始化語(yǔ)句。

初始化類(lèi)的5中情況

創(chuàng)建類(lèi)的實(shí)例;讀取或設(shè)置一個(gè)類(lèi)的靜態(tài)字段(放入常量池的除外);調(diào)用一個(gè)類(lèi)的靜態(tài)方法。

使用java.lang.reflect包方法進(jìn)行反射調(diào)用(如果沒(méi)有進(jìn)行過(guò)初始化)。例:Class.forName("SuperClass")

父類(lèi)沒(méi)有進(jìn)行初始化,則需要先觸發(fā)父類(lèi)的初始化

虛擬機(jī)啟動(dòng),用戶(hù)需制定一個(gè)執(zhí)行的主類(lèi)(包含main()方法的那個(gè)類(lèi)),虛擬機(jī)會(huì)先初始化這個(gè)類(lèi)。

來(lái)自JDK1.7:一個(gè)MethodHandle實(shí)例最后的解析結(jié)果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,且句柄所對(duì)應(yīng)的類(lèi)沒(méi)有進(jìn)行初始化。

注意

使用ClassLoader類(lèi)的loadClass()加載某個(gè)類(lèi)時(shí)并不會(huì)執(zhí)行該類(lèi)的初始化。

如果final類(lèi)型的靜態(tài)屬性的值不能在編譯時(shí)得到,必須等到運(yùn)行時(shí)才能確定該屬性的值,就會(huì)觸發(fā)初始化。

類(lèi)加載器

將.class文件加載到內(nèi)存中,生成對(duì)應(yīng)的java.lang.Class對(duì)象。
注意:
只有類(lèi)是同一個(gè)類(lèi)加載器加載才有可能等于(包含Class對(duì)象的equals方法、instanceof)。

類(lèi)加載器分類(lèi)

Bootstrap ClassLoader:根類(lèi)加載器,加載Java的核心類(lèi)。

Extension ClassLoader:擴(kuò)展類(lèi)加載器,加載JRE的擴(kuò)展目錄(JAVA_HOME/jre/lib/ext)中的JAR的類(lèi)包。

System ClassLoader:系統(tǒng)類(lèi)加載器,加載命令java中的classpath選擇的JAR包和類(lèi)路徑。

類(lèi)加載機(jī)制

全盤(pán)負(fù)責(zé):一個(gè)類(lèi)加載器負(fù)責(zé)加載Class和它的依賴(lài)Class,除非顯示使用另一個(gè)加載器。

父類(lèi)委托:先讓父類(lèi)加載該Class,在父類(lèi)加載器無(wú)法加載時(shí)從自己的類(lèi)路徑中加載。(類(lèi)加載器之間的父子關(guān)系不是繼承上的父子關(guān)系,是類(lèi)加載器實(shí)例之間的關(guān)系。

緩存機(jī)制:當(dāng)程序中需要Class時(shí),先從緩存中搜尋,緩存中不存在時(shí),才重讀該類(lèi)對(duì)應(yīng)的二進(jìn)制數(shù)據(jù),并將其轉(zhuǎn)換為Class對(duì)象,并存入到cache。

反射

使用場(chǎng)合:編譯的時(shí)候無(wú)法獲悉類(lèi)型,依靠運(yùn)行時(shí)信息發(fā)現(xiàn),這時(shí)就采用反射。

獲取Class的方法

Class類(lèi)的forName()靜態(tài)方法(可能拋出ClassNotFoundException)。

調(diào)用某個(gè)類(lèi)的class屬性。

調(diào)用某個(gè)對(duì)象的getClass()。

獲取構(gòu)造函數(shù)

Constructor getConstructor(Class..ParameterType)獲取Class對(duì)象表示類(lèi)的某個(gè)public構(gòu)造器。

Constructor[] getConstructors()獲取Class對(duì)象表示類(lèi)的所有public構(gòu)造器。

Constructor getDeclaredConstructor(Class..ParameterType)獲取Class對(duì)象表示類(lèi)的指定構(gòu)造器。

Constructor[] getDeclaredConstructors()獲取Class對(duì)象表示類(lèi)的所有構(gòu)造器。

創(chuàng)建對(duì)象

Class對(duì)象的newInstance()方法:要求該Class對(duì)象有默認(rèn)的構(gòu)造方法。

調(diào)用Constructor對(duì)象的newInstance()。

調(diào)用方法

Class對(duì)象的getMethods()方法/getMethod()方法,再調(diào)用Method Object invoke(Object obj, Object...args),該方法中的obj是執(zhí)行該方法的主調(diào),后面跟著的是參數(shù)。

訪問(wèn)屬性

獲得Class對(duì)象后,通過(guò)該Class對(duì)象的getFields()方法或getDeclaredFields()方法來(lái)獲取全部屬性或指定屬性。

Field nameField = personClazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(p , "Yeeku.H.Lee");

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69380.html

相關(guān)文章

  • 轉(zhuǎn)行測(cè)試,11k入職,我寫(xiě)了份1000多字的分享,每一筆都是經(jīng)歷

    摘要:從白天到晚上,不是在學(xué)就是在學(xué)的路上,從測(cè)試?yán)碚摰綄?shí)戰(zhàn)操作,大大小小的問(wèn)題,在群里前輩的幫助下,總是能很快解決。慢慢的,測(cè)試方法,用例設(shè)計(jì),測(cè)試,測(cè)試,接口測(cè)試。大概面試了一周多,我就拿下了的。 ...

    luzhuqun 評(píng)論0 收藏0
  • 大學(xué)一年之后竟如此。。。開(kāi)學(xué)前的掙扎

    摘要:后來(lái)知道有了院賽,學(xué)長(zhǎng)說(shuō)刷院和杭電就可,我就一直刷院,到最后比賽前院的前五十道基本做完,杭電也弄了十來(lái)道,就這樣草草參加比賽了。 博客主頁(yè): https://b...

    MartinDai 評(píng)論0 收藏0
  • 2019新年目標(biāo)和計(jì)劃

    摘要:解放碑的鐘聲響起,年結(jié)束,迎來(lái)了新的一年時(shí)間本來(lái)無(wú)所謂結(jié)點(diǎn),只是人類(lèi)為其賦予了意義。生活就是這樣,總結(jié)反思,再度起航。這并不算是自己的愿望,這是大家的愿望。所以,正值研究生一年級(jí)的我,很清楚自己這一年想要什么,也下定決心去實(shí)現(xiàn)它加油。 解放碑的鐘聲響起,2018年結(jié)束,迎來(lái)了新的一年2019.時(shí)間本來(lái)無(wú)所謂結(jié)點(diǎn),只是人類(lèi)為其賦予了意義。生活就是這樣,總結(jié)反思,再度起航。作為一個(gè)新的開(kāi)始...

    sf190404 評(píng)論0 收藏0
  • C語(yǔ)言 指針+二維數(shù)組詳解 (應(yīng)付期末、考研的最強(qiáng)筆記,建議收藏)

    摘要:需要注意的是用矩陣形式如行列表示二維數(shù)組,是邏輯上的概念,能形象地表示出行列關(guān)系。再次強(qiáng)調(diào)二維數(shù)組名如是指向行的。一維數(shù)組名如是指向列元素的。 哈嘍!這里是一只派大鑫,不是派大星。本著基礎(chǔ)不牢,地動(dòng)山搖的學(xué)習(xí)態(tài)度,從基礎(chǔ)的C語(yǔ)言語(yǔ)法講到算法再到更高級(jí)的語(yǔ)法及框架的學(xué)習(xí)。更好地讓同樣熱愛(ài)編...

    FrozenMap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<