java学习笔记2022.2.11
on java 8 摘錄(反射)
面向?qū)ο缶幊痰囊粋€(gè)基本目標(biāo)就是,讓編寫的代碼只操縱基類(本例中為Shape)的引用
Shape接口中的方法draw()是可以動(dòng)態(tài)綁定的,因此客戶程序員可以通過(guò)泛化的Shape引用來(lái)調(diào)用具體的draw()方法。在所有子類中,draw()都被重寫,并且因?yàn)樗且粋€(gè)動(dòng)態(tài)綁定的方法,即使通過(guò)泛化的Shape引用來(lái)調(diào)用它,也會(huì)產(chǎn)生正確的行為。這就是多態(tài)。
這就是反射的意思:在運(yùn)行時(shí),確定對(duì)象的類型。
當(dāng)程序第一次引用該類的靜態(tài)成員時(shí),就會(huì)觸發(fā)這個(gè)類的加載。構(gòu)造器是類的一個(gè)靜態(tài)方法,盡管沒(méi)有明確使用static關(guān)鍵字。因此,使用new操作符創(chuàng)建類的新對(duì)象也算作對(duì)該類靜態(tài)成員的引用,構(gòu)造器的初次使用會(huì)導(dǎo)致該類的加載。
一旦該類型的Class對(duì)象加載到內(nèi)存中,它就會(huì)用于創(chuàng)建該類型的所有對(duì)象。
// reflection/SweetShop.java // 檢查類加載器的工作方式class Cookie { static { System.out.println("Loading Cookie"); } }class Gum { static { System.out.println("Loading Gum"); } }class Candy { static { System.out.println("Loading Candy"); } }public class SweetShop { public static void main(String[] args) {System.out.println("inside main");new Candy();System.out.println("After creating Candy");try {Class.forName("Gum");} catch(ClassNotFoundException e) {System.out.println("Couldn't find Gum");}System.out.println("After Class.forName(\"Gum\")");new Cookie();System.out.println("After creating Cookie"); } } /* 輸出: inside main Loading Candy After creating Candy Loading Gum After Class.forName("Gum") Loading Cookie After creating Cookie */我相信最開(kāi)始肯定也有人和我一樣沒(méi)看懂為什么這個(gè)可以證明,其實(shí)是這樣的,我們通過(guò)觀察,可以發(fā)現(xiàn)上面類的順序是Cookie,Gum,Candy這樣的順序下來(lái)的,而在下面我最先創(chuàng)建的是Candy,然后Gum,最后Cookie,然后又因?yàn)殪o態(tài)方法是類第一次被加載時(shí)會(huì)出現(xiàn),那么按照常理,如果它們是提前編譯好的,而不是在動(dòng)態(tài)加載的話,它們的輸出應(yīng)該是亂的,或者就是按照編寫順序下來(lái)的,我說(shuō)亂是因?yàn)樘崆叭考虞d的話,靜態(tài)代碼塊一定會(huì)一起出現(xiàn),但是會(huì)根據(jù)編譯器決定哪個(gè)加載的塊,這樣就會(huì)導(dǎo)致順序出問(wèn)題;綜上,既然它是按照主程序的順序下來(lái),那么肯定就只能是動(dòng)態(tài)加載了.
newInstance()在Java 8中還是正常的,但在更高版本中已被棄用,Java推薦使用Constructor.newInstance()來(lái)代替。示例中我們使用了@SuppressWarnings("deprecation")來(lái)抑制那些更高版本的棄用警告。
這個(gè)可以這么寫
Class up = c.getSuperclass(); Object obj = null; try {// 對(duì)應(yīng)類要有public的無(wú)參構(gòu)造器:obj = up.getConstructor().newInstance(); } catch(Exception e) {throw new RuntimeException("Cannot instantiate"); }on java 8 摘錄(反射)(沒(méi)看懂的東西)
這句話我沒(méi)太看懂,什么叫做常規(guī)對(duì)象?
我們對(duì)forName()的調(diào)用只是為了它的副作用:如果類Gum尚未加載,則加載它。在加載過(guò)程中,會(huì)執(zhí)行Gum的靜態(tài)代碼塊。
19.2 Class對(duì)象
Class對(duì)象有點(diǎn)像靜態(tài)對(duì)象的感覺(jué),它們只被加載一次,后面都是對(duì)它的引用
有關(guān)于Class.forName(),這個(gè)寫的挺詳細(xì)的https://www.geeksforgeeks.org/class-forname-method-in-java-with-examples/,然后類名.getclass(),兩個(gè)調(diào)用的方式不一樣.
我魔改了on java 程序
package test; class Cookie {static { System.out.println("Loading Cookie"); } }class Gum {static { System.out.println("Loading Gum"); } }class Candy {static { System.out.println("Loading Candy"); } }public class SweetShop {public static void main(String[] args) {System.out.println("inside main");new Candy();try {Class.forName("Candy");}catch (ClassNotFoundException e){e.printStackTrace();}System.out.println("After creating Candy");try {Class.forName("test.Gum");}catch (ClassNotFoundException e){e.printStackTrace();}System.out.println("After Class.forName(\"Gum\")");new Cookie();System.out.println("After creating Cookie");} }其他
總結(jié)
以上是生活随笔為你收集整理的java学习笔记2022.2.11的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 学习笔记2022.1.26
- 下一篇: java学习笔记 2022.2.11