日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java学习笔记 2022.2.11

發布時間:2024/4/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java学习笔记 2022.2.11 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2022.2.11

on java 8 摘錄(反射)

  • 加載。這是由類加載器執行的。該步驟會先找到字節碼(通常在類路徑中的磁盤上,但也不一定),然后從這些字節碼中創建一個Class對象。
  • 鏈接。鏈接階段會驗證類中的字節碼,為靜態字段分配存儲空間,并在必要時解析該類對其他類的所有引用。
  • 初始化。如果有基類的話,會先初始化基類,執行靜態初始化器和靜態初始化塊。
  • 初始化被延遲到首次引用靜態方法(構造器是隱式靜態的)或非常量靜態字段時:

    // reflection/ClassInitialization.java import java.util.*;class Initable {static final int STATIC_FINAL = 47;static final int STATIC_FINAL2 =ClassInitialization.rand.nextInt(1000);static {System.out.println("Initializing Initable");} }class Initable2 {static int staticNonFinal = 147;static {System.out.println("Initializing Initable2");} }class Initable3 {static int staticNonFinal = 74;static {System.out.println("Initializing Initable3");} }public class ClassInitialization {public static Random rand = new Random(47);public static voidmain(String[] args) throws Exception {Class initable = Initable.class;System.out.println("After creating Initable ref");// 不會觸發初始化System.out.println(Initable.STATIC_FINAL);// 觸發初始化System.out.println(Initable.STATIC_FINAL2);// 觸發初始化System.out.println(Initable2.staticNonFinal);Class initable3 = Class.forName("Initable3");System.out.println("After creating Initable3 ref");System.out.println(Initable3.staticNonFinal);} } /* 輸出: After creating Initable ref 47 Initializing Initable 258 Initializing Initable2 147 Initializing Initable3 After creating Initable3 ref 74 */

    實際上,初始化會“盡可能懶惰”。從initable引用的創建過程中可以看出,僅使用.class語法來獲取對類的引用不會導致初始化。而Class.forName()會立即初始化類以產生Class引用,如initable3的創建所示。

    如果一個static final字段的值是“編譯時常量”,比如Initable.staticFinal,那么這個值不需要初始化Initable類就能讀取。但是把一個字段設置為static和final并不能保證這種行為:對Initable.staticFinal2的訪問會強制執行類的初始化,因為它不是編譯時常量。

    如果static字段不是final的,那么訪問它時,如果想要正常讀取,總是需要先進行鏈接(為字段分配存儲)和初始化(初始化該存儲),正如在對Initable2.staticNonFinal的訪問中看到的那樣。

  • ?

    一個Class引用表示的就是它所指向的確切類型:Class類的一個對象。

    要想放松使用泛化的Class引用時的限制,請使用通配符?,它是Java泛型的一部分,表示“任何事物”。

    盡管如我們看到的那樣,普通的Class并不會產生編譯器警告,但是和普通的Class相比,我們還是傾向于Class<?>,即使它們是等價的。Class<?>的好處在于,它表明了你不是偶然或無意識地使用了非具體的類引用。你就是選擇了這個非具體的版本。

    這種寫法的話如果想表示子類可以這樣<? extend 父類>

    package reflection.toys;public class GenericToyTest {public static voidmain(String[] args) throws Exception {Class<FancyToy> ftc = FancyToy.class;// 生成確切的類型:FancyToy fancyToy =ftc.getConstructor().newInstance();Class<? super FancyToy> up = ftc.getSuperclass();// 下面的代碼無法通過編譯:// Class<Toy> up2 = ftc.getSuperclass();// 只能生成ObjectObject obj = up.getConstructor().newInstance();} }

    這段代碼很有意思,如果去掉第六行括號內的內容,會導致ftc得到的是一個Object類型,

    問題

    19.2 Class類

  • 首先Class類的作用就是描述了一個類的Class類文件中的信息,包括它的初始化器,它的接口,它的靜態變量,它的父類這些信息

  • Class類的每一個類的實例都是唯一確定,例如一個類叫做Cat,那么我在實例化Cat以后,它的Class對象也就生成了,同時,此時我們初始化變量

    Cat one = new Cat(); Class cat = Cat.class; Cat two = new Cat(); Class cat1 = Cat.class;

    應該理解成這兩個引用是相同的,不管我后面會不會再去實例化Cat一個新的對象

  • 從上面可以推導出,Class類實際上是讓我們有了直接操作類的實例化的可能性,因為不使用Class類時,這些都是java幫我們解決的

  • 還要注意Class類的加載是在編譯階段的,而Class類的實例化是在運行時的,而前綴為static final就是編譯時常量,如果去掉final,那么靜態常量就是可以修改的,所以去掉以后算運行時常量,而運行的化會導致Class對象被初始化,

  • 如何利用Class類生成實例對象

    class cat {private String name="hajdka";private int age=131;public cat(){}public String getName() {return name;}public int getAge() {return age;} }public class GenericClassReferences {public static void main(String[] args) {try{System.out.println(cat.class.getConstructor().newInstance().getAge()+" "+cat.class.getConstructor().newInstance().getName());}catch (Exception e){e.printStackTrace();}} }
  • 其他

  • default :包訪問權限,即同一個包中的類可以可見。默認不顯式指定訪問控制權限時就是 default 包訪問控制權限。

  • 初始化(英語:Initialization)在計算機編程領域中指為數據對象或變量賦初值的做法,如何初始化則取決于所用的程序語言以及所要初始化的對象的存儲類型等屬性。用于進行初始化的程序結構則稱為初始化器或初始化列表。

  • 總結

    以上是生活随笔為你收集整理的java学习笔记 2022.2.11的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。