首先考慮 對于這些問題 包含哪些類那些對象
應(yīng)該具有哪些屬性和方法
類和類之間具有哪種關(guān)系 關(guān)聯(lián) 繼承 聚集 組合 實現(xiàn) 多態(tài)
所有的paradigm都是對現(xiàn)實問題的抽象:
匯編是對機器語言的抽象
面向過程的語言是對匯編的抽象
對象更符合對于像是問題的抽象
對象都有對外服務(wù)的接口: 通過繼承可以復(fù)用
對象隱藏內(nèi)部服務(wù)的實現(xiàn):通過聚合可以復(fù)用
resuable 可重用性
extensibility 可擴展性
維護和替換更加方便
組件 比對象更高層次的抽象 二進制級別:web service
定義成員變量可以初始化 如果不進行初始化 系統(tǒng)默認(rèn)初始化 局部變量必須初始化
成員變量作用域為整個類體 0 false 應(yīng)用類型默認(rèn)為null
除基本類型外變量類型為引用類型破加,Java中對象是通過引用對其操作的。
如何在內(nèi)存中區(qū)分類和對象?
類是靜態(tài)的概念厂汗,在代碼區(qū)。
對象是new出來的哄褒,位于堆內(nèi)存匀奏,類的每個成員變量在不同的對象中都有不同的值,
除了靜態(tài)變量敲茄,而方法只有一份,執(zhí)行的時候才占用內(nèi)存搁宾。
堆內(nèi)存動態(tài)分配內(nèi)存 對象只有在運行期間分配 因此new 新建對象 放在堆內(nèi)存中
同一個類的每個對象有不同的成員變量存儲空間
同一個類的每個對象共享該類方法
Java中進行函數(shù)調(diào)用中傳遞參數(shù)時 遵循值傳遞的原則:
基本類型傳遞的是該數(shù)據(jù)值本身折汞,引用類型傳遞的是對對象的引用,而不是對象本身盖腿。
構(gòu)造方法:
使用new + 構(gòu)造方法創(chuàng)建一個新的對象
構(gòu)造方法用來初始化對象的函數(shù)
構(gòu)造方法與類同名且沒有返回值 void 也不能寫
當(dāng)沒有指定構(gòu)造函數(shù)時 編譯器自動添加 類名() { } 構(gòu)造函數(shù)
指定了構(gòu)造函數(shù)后 不再提供默認(rèn)構(gòu)造函數(shù)
命名規(guī)則:
類名首字母 大寫
方法名 成員名 變量名 首字母小寫
運用駝峰標(biāo)識
方法的重載 一個類中定義相同名字 但參數(shù)不同的多個方法
調(diào)用時 會根據(jù)不同的參數(shù)表選擇對應(yīng)的方法
非靜態(tài)方法是針對每個對象進行調(diào)用
this:
this關(guān)鍵字代表使用該方法的對象的引用
當(dāng)必須指出當(dāng)前使用方法的對象是誰時要使用this
有時使用this可以處理方法中成員變量和參數(shù)重名的情況
this可以看做是一個變量 它的值是當(dāng)前對象的引用
static:
類中爽待,static聲明的成員變量為靜態(tài)成員變量损同,它為該類的公用變量,
在第一次使用時被初始化鸟款,對于該類的所有對象來說膏燃,static成員變量只有一份。
用static聲明的方法為靜態(tài)方法何什,在調(diào)用該方法時组哩,不會將對象的引用傳遞給它,
所以在static方法中不可訪問非static成員处渣。
靜態(tài)方法不再是針對某個對象調(diào)用伶贰,所以不能訪問非靜態(tài)成員。
可以通過對象引用或類名(不需要實例化)訪問靜態(tài)成員
包名規(guī)則:
Package 必須寫在源代碼第一行
公司域名倒過來
Java編譯器把包對應(yīng)于文件系統(tǒng)的目錄管理罐栈,package語句中黍衙,
用‘.’指明包(目錄)的層次。
編譯后的class文件必須位于正確目錄下 與包的層次完全的一致荠诬。:
該類的源碼可能會產(chǎn)生影響 刪除或轉(zhuǎn)移至另外目錄
使用其他類時必須寫全包名 或者引入包 訪問同意包下的類 不需要引入琅翻。
必須class文件的最上層包的的父目錄必須位于classpath下
執(zhí)行一個類需要寫全包名
jar -cvf test.jar .
對于class的權(quán)限修飾 只可以用public和default
public類可以在任意地方被訪問
default類只可以被同一個包內(nèi)部的類訪問
extends關(guān)鍵字實現(xiàn)類的繼承:
<modifier> class <name> [extends<superclass>] {……}
通過繼承,子類自動擁有了基類superclass 的所有成員-成員變量和方法
Java支持單繼承 不支持多繼承:一個子類只能有一個基類 一個基類可以派生出多個子類
private類權(quán)限
default包權(quán)限
protected 子類權(quán)限
public 公開
重寫方法不能使用比被重寫方法更嚴(yán)格的訪問權(quán)限柑贞,相同方法名 參數(shù)列表和返回類型
重寫時一定要copy函數(shù)頭
super引用基類的成分方椎。與this類似。
繼承中的構(gòu)造方法:
子類的構(gòu)造過程中必須調(diào)用其基類的構(gòu)造方法钧嘶。(子類對象內(nèi)部包含一個弗雷對象)
子類可以在自己的構(gòu)造方法中使用super(argument_list)調(diào)用基類的構(gòu)造方法棠众。
使用this(argument_list)調(diào)用本類的另外構(gòu)造方法
如果調(diào)用了super 必須寫在子類構(gòu)造方法的第一行。
如果子類的構(gòu)造方法中沒有顯示地調(diào)用基類構(gòu)造方法康辑,則系統(tǒng)默認(rèn)調(diào)用基類無參構(gòu)造方法摄欲。
如果子類構(gòu)造方法中既沒有顯示調(diào)用基類構(gòu)造方法,而基類中又沒有無參的構(gòu)造方法疮薇,則編譯出錯胸墙,找不到符號。
Object類是所有Java類的根基類
類未使用extends關(guān)鍵字指明其基類按咒,默認(rèn)基類為object類迟隅。
toString() 類名@hashCode()
Object 的equals方法:x.equals(y) 當(dāng)x和y為同一對象的引用時,返回true
String/Date 重寫了Object的equals方法励七,
x.equals(y) 當(dāng)x和y索引用到的對象 是同一類對象且屬性內(nèi)容相等時(并不一定是相同對象)智袭,
返回為true否則為false。 非空
對象轉(zhuǎn)型:casting 父類-子類轉(zhuǎn)型 父類引用指向子類對象 subclass d = (subclass)(new superClass())
一個基類的引用類型變量可以“指向”其子類的對象掠抬。
一個基類的引用不可以訪問其子類對象新增加的成員(屬性和方法)
可以使用 引用 變量instanceof 類名 來判斷引用型變量所 指向 的對象是否屬于該類或該類的子類陡厘。
子類對象可以當(dāng)做基類對象使用稱作向上轉(zhuǎn)型(upcasting) 否則 向下轉(zhuǎn)型 downcasting
動態(tài)綁定和多態(tài):
動態(tài)綁定是指 在執(zhí)行期間割按,非編譯期間锹雏,判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法闷哆。
多態(tài)的存在有三個必要條件:繼承、重寫单起、父類引用指向子類對象
abstract 抽象類
abstract class abstract method
含有抽象方法的類必須聲明為抽象類 抽象類必須被繼承 抽象方法必須被重寫
抽象類不能被實例化
抽象方法只需聲明 不需實現(xiàn)
抽象類中可以包含非抽象方法
final:等同于const
final變量的值不能被改變:成員變量 局部變量
final方法不能被重寫
final類不能被繼承
接口:interface 抽象方法和常量值的定義的集合 一種特殊的抽象類
所有的方法都是抽象的 沒有變量和方法的實現(xiàn)
只包含常量和方法的定義 都是靜態(tài)變量和final變量
多個無關(guān)的類可以實現(xiàn)同一個接口
一個類可以實現(xiàn)多個無關(guān)的接口
接口與實現(xiàn)類之間存在多態(tài)性抱怔。
public static final int x;不屬于特定的對象 不可更改的常量
接口內(nèi)所有方法 不用添加abstract修飾符 全部是abstract
接口特性:
接口可以多重實現(xiàn);
接口中聲明的屬性默認(rèn)為 public static final ,也只能是public static final
接口中只能定義抽象方法嘀倒,方法默認(rèn)為public屈留,也只能是public
接口可以繼承其他接口,并添加新的屬性和抽象方法测蘑。
異常 運行期錯誤
錯誤名字 行號
try { } catch(Exception e){e.printStackTrace();} finally {}
throws Exception {} 聲明
throw new Exception(""); 定義所拋出的異常
try代碼段包含可能產(chǎn)生例外的代碼
try代碼段后跟一個或多個catch代碼段
每個catch代碼段聲明其能處理的一種特定類型的異常并提供處理的方法
當(dāng)異常發(fā)生時灌危,程序會中止當(dāng)前的流程,根據(jù)獲取異常的類型去執(zhí)行相應(yīng)的catch代碼段帮寻。
finally段代碼無論是否發(fā)生異常都會執(zhí)行乍狐。異常處理統(tǒng)一的出口:
進行資源的清楚工作:關(guān)閉打開的文件 刪除臨時文件等
printStackTrace(); getMessage();
Java的異常處理機制使得異常事件 沿著被調(diào)用的順序往前尋找
只要找到符合該異常的處理程序即可赠摇。
throwable Error(系統(tǒng)錯誤 虛擬機錯誤) Exception(一般需要用戶顯示聲明或捕獲):RuntimeException
自定義異常:
繼承java.lang.Exception 類聲明自己的異常類
在方法適當(dāng)?shù)奈恢?生成自定義異常的實例 并用throw語句拋出
在方法的聲明部分用throws語句聲明該方法可能拋出的異常
重寫方法需要拋出與原方法所拋出異常類型一致異彻潭海或不拋出異常。
先逮小的 再逮大的
格式 考慮周全 異常
數(shù)組是引用類型
元素為引用數(shù)據(jù)類型的數(shù)組中的每一個元素都需要實例化
動態(tài)初始化:數(shù)組定義與為數(shù)組元素分配空間和賦值的操作分開進行
靜態(tài)初始化:定義數(shù)組同時 為數(shù)組元素分配空間和賦值
*****常見算法*****
java.lang.String 不可變的字符序列
string-length 字符長度不是字節(jié)長度
StringBuffer 可變的字符序列 改變直接在其內(nèi)存所在區(qū)域執(zhí)行
StringBuffer和String類似藕帜,但StringBuffer可以對其字符串進行改變
StringBuffer()
StringBufer(String str)
java.io.File 類代表系統(tǒng)文件名-路徑和文件名
Enum枚舉類型
只能夠取特定值中的一個烫罩;
使用enum關(guān)鍵字
java.lang.Enum
容器
java.util
Collection-Set(HashSet) List(ArrayList/LinkedList)
Map-HashMap
Set 沒有順序不可以重復(fù)
List 有順序可以重復(fù)
Map 鍵值對 key-value
容器類對象調(diào)用remove contains等方法時 需要比較對象是否相等,
需要重寫equals和hashCode(map)方法洽故,實現(xiàn)自定義的對象相等規(guī)則贝攒。
相等的對象應(yīng)該具有相等的hashCode
hashCode適合做索引
所有實現(xiàn)了Collection接口的容器類 都有一個iterator方法用以返回一個
實現(xiàn)了Iterator接口的對象。
Iterator對象稱作迭代器时甚,用以方便的實現(xiàn)對容器內(nèi)元素的遍歷操作隘弊。
Iterator對象的remove方法 是在迭代過程中刪除元素的唯一安全方法
不能使用容器的reomve(obj)方法 因為Iterator在進行遍歷時,執(zhí)行了鎖定荒适,
對當(dāng)前元素進行鎖定梨熙,不允許其他對象進行訪問和修改。
增強For循環(huán):for(Object o : c)
無法方便訪問數(shù)組的下標(biāo)值
無法針對集合的元素進行刪除:內(nèi)部也是調(diào)用Iterator
建議: 除了簡單遍歷并讀出其中內(nèi)容 不建議使用增強for循環(huán)
Set接口:
Collection子接口刀诬,Set接口沒有提供額外的方法咽扇,
但實現(xiàn)Set接口的容器類中的元素是沒有順序的 且不可重復(fù)
HashSet TreeSet 與數(shù)學(xué)中集合對應(yīng)
相同元素不會被重復(fù)添加
Comparable接口 compareTo
Array 讀快改慢 改指的是針對整個list的更改
Linked 讀慢改快
Hash之間
Map接口 存儲 鍵值對
Map接口實現(xiàn)類 HashMap TreeMap
Map類中存儲的鍵值對 通過鍵值標(biāo)識 所以鍵值不能重復(fù)(equals->hashCode)
auto-boxing unboxing 自動打包 解包
自動將基礎(chǔ)類型轉(zhuǎn)換為對象
自動將對象轉(zhuǎn)換為基礎(chǔ)類型
Generic 泛型
jdk1.4以前類型不明確:裝入集合類型都被當(dāng)做Object對待 失去自己的實際類型
從集合中取出時 需要轉(zhuǎn)型 效率低 容易產(chǎn)生錯誤
在定義集合時同時定義集合中對象的類型
增強程序的可讀性和穩(wěn)定性
優(yōu)先使用泛型
一個圖:
一個類:Collections
三個知識點:For增強For Generic泛型(極其重要) Auto-boxing/unboxing
六個接口:collection Set List Map Iterator(游標(biāo)) Comparable(可應(yīng)用泛型)
IO
Java程序中對于數(shù)據(jù)的輸入 輸出操作以流(stream)的形式進行,jdk提供了
各種各樣的流類 用以獲取不同種類的數(shù)據(jù) 程序中通過標(biāo)準(zhǔn)的方法輸入或輸出數(shù)據(jù)
輸入流 輸出流 站在程序的角度
字節(jié)流 字符流
節(jié)點流 處理流
字節(jié)流 字符流
輸入流 InputStream Reader
輸出流 OutputStream Writer
節(jié)點流:從一個特定數(shù)據(jù)源 節(jié)點 讀寫數(shù)據(jù) 如文件 內(nèi)存
處理流: 連接 在已存在的流 (節(jié)點流或處理流) 之上
通過對數(shù)據(jù)的處理為程序提供更為強大的讀寫功能
FileReader FileInputStream
FileWriter FileOutputStream
BufferedReader FileReader
BufferedWriter FileWriter
轉(zhuǎn)換流
字節(jié)流轉(zhuǎn)換為字符流
InputStreamReader OutputStreamWriter 字節(jié)數(shù)據(jù)到字符數(shù)據(jù)之間的轉(zhuǎn)換
InputStreamReader 與 InputStream 套接
OutputStreamWriter 與 OutputStream 套接
轉(zhuǎn)換流 在構(gòu)造時可以指定編碼集合
數(shù)據(jù)流
DataInputStream DataOutputStream 處理流陕壹,
分別套接在InputStream OutputStream上
提供了存取與機器無關(guān)的Java原始類型數(shù)據(jù)
PrintIO:
PrintWriter字符 PrintStream字節(jié)
Object流
直接將Object寫入或讀出
transient關(guān)鍵字
serializable接口
externalizable接口
Thread:
一個程序中不同的執(zhí)行路徑
進程 靜態(tài)概念 class文件 EXE文件
進程執(zhí)行指的是 進程中的主線程開始執(zhí)行
實際運行的都是線程质欲。
一個CPU只能支持單線程
Java的線程是通過 java.lang.Thread 實現(xiàn)的
VM啟動時會有一個由主方法所定義的線程
創(chuàng)建Thread實例來創(chuàng)建新的線程
每個線程都是通過某個特定Thread對象所對應(yīng)的run()完成其操作,方法run()成為線程體
通過調(diào)用Thread的start()啟動線程
線程啟動必須調(diào)用Thread類的start()方法 通知cpu 給予時間執(zhí)行任務(wù)
線程和進程區(qū)別:
每個進程都有獨立的代碼和數(shù)據(jù)空間(進程上下文) 進程間的切換會有較大開銷
線程可以看做是輕量級的進程糠馆,同一類線程共享代碼和數(shù)據(jù)空間
每個線程有獨立的運行棧和程序計數(shù)器(PC) 線程切換的開銷小
多進程:在操作系統(tǒng)中能同時運行多個程序 任務(wù)
多線程:同一應(yīng)用程序中有多個順序流同時執(zhí)行
線程的創(chuàng)建和啟動:
第一種:
定義線程類實現(xiàn)Runnable接口
Runnable 只有一個方法: public void run() 定義線程運行體
使用Runnable接口可以為多線程提供共享的數(shù)據(jù)
在實現(xiàn)Runnable接口的類的run方法定義中可以使用Thread的靜態(tài)方法:
public static Thread currentThread();
第二種:
定義一個Thread子類并重寫其run方法
class MyThread extends Thread {
public void run(){ }
}
能使用接口不要從Thread繼承K晃啊!又碌!
線程狀態(tài)轉(zhuǎn)換
isAlive();
getPriority();
setPriority();
Thread.sleep();
join();
yield();
Wait();
notify();
notifyAll();
線程優(yōu)先級 默認(rèn)為5 1-10
同一線程類可以啟動多個線程
線程同步:
public synchronized void methodName(){} 執(zhí)行方法的過程中鎖定當(dāng)前對象
Java對象互斥鎖 保證了共享數(shù)據(jù)操作的完整性九昧,每個對象都對應(yīng)一個稱為 “互斥鎖”的標(biāo)記
這個標(biāo)記保證在任一時刻 只能有一個線程訪問該對象
關(guān)鍵字synchronized 修飾某個對象某一方法時 表明 執(zhí)行該方法的過程中鎖定當(dāng)前對象的這段方法
即在任一時刻 只能由一個線程訪問
Object.wait()
this.wait() 當(dāng)前對象wait--
-訪問當(dāng)前對象的線程 拿到該方法所屬對象的鎖 遇到阻塞 此時使用wait()
鎖定對象 鎖定線程后 才有資格調(diào)用wait
wait時 鎖不再屬于當(dāng)前對象 Object類方法 其它進程可以訪問該鎖的對象
sleep 鎖仍然屬于當(dāng)前對象 Thread類方法
this.notify(); 叫醒一個正在wait該對象的線程
this.notifyAll() 叫醒等待該對象的其他所有線程
network
tcp ip 詳解
ip Internet protocol 無連接數(shù)據(jù)包傳送 數(shù)據(jù)包路由選擇和差錯控制
tcp 字節(jié)流非報文流 面向連接的協(xié)議 不可靠的因特網(wǎng)上提供可靠的 端到端的字節(jié)流通信協(xié)議
tcp 類似打電話 三次握手
udp user data protocol 發(fā)送封裝的原始IP數(shù)據(jù)報 發(fā)送時無需建立連接 不可靠連接
(網(wǎng)絡(luò)電話 聊天 視頻等)可以丟報
socket
兩個Java應(yīng)用程序 通過一個雙向的網(wǎng)絡(luò)通信連接實現(xiàn)數(shù)據(jù)交換 雙向鏈路一端稱為Socket
Socket 實現(xiàn) client-server 連接
Java.net 包定義兩個類(TCP) Socket 和 ServerSocket 分別用來實現(xiàn)雙向連接的client和server端
建立連接所需的尋址信息為遠(yuǎn)程計算機的IP地址和端口號(Port number) 2個字節(jié) 65536個端口號
一個應(yīng)用程序最多跑65536個網(wǎng)絡(luò)應(yīng)用程序
1024以下的端口號 系統(tǒng)占用
TCP端口 65536個
UDP端口 65536個
先啟動Server 再執(zhí)行client
Socket包-berklin
berklinDB-現(xiàn)代數(shù)據(jù)庫的根源
Server
ServerSocket ss(port #)
while(true){//一直監(jiān)聽
Soceket s = ss.accept() //等待連接
OutputStream
InputStream
s.close() //客戶端連接斷開
}
Client
Socket s = (host - "ip", port #) //--Attempt to connect
OutputStream //客戶端寫入 服務(wù)器端讀取
InputStream // 服務(wù)器端回復(fù) 客戶端讀取
s.close()
DatagramSocket
DatagramPacket
byte[]
ByteArrayOutputStream
DataOutputStream
ds.send(dp);
ds.receive(dp);
awt Abstract Window Toolkit
GUI Graphics User Interface
Container Component 是 AWT 兩個核心類
Component:
Container {Button/TextArea/Label/TestFields/List}
Window Panel
Frame Dialog Applet
Component 對象不能獨立顯示 必須存放在某一Container對象中
Container是Component的子類
Panel對象可以擁有自己的布局管理器 FlowLayout
布局管理器
管理Component在Container中的布局 不必直接設(shè)置Component的大小和位置
每個Container都有一個布局管理器對象盛霎,當(dāng)容器需要對某個組件進行定位或判斷
其大小尺寸時 調(diào)用其布局管理器 調(diào)用Container的SetLayout方法改變其布局管理器對象
LayoutManager:
FlowLayout Panel類 默認(rèn)布局管理器 默認(rèn)對齊方式居中 水平
BorderLayout Frame 東西南北中
GridLayout
CardLayout
GridBagLayout
事件監(jiān)聽:
事件源對象-----當(dāng)某種事件發(fā)生--向監(jiān)聽器傳送某種事件對象---接到事件對象后進行某種處理--
實現(xiàn)了某種監(jiān)聽器的接口的類的對象========注冊=======事件源對象
ActionListener 接口
Monitor implements ActionListener
actionPerformed(ActionEvent e){}
Monitor m = new Monitor();
Button b1.addActionListener(m);
e.getSource() 返回的對象實際為Button
實現(xiàn)了observer 觀察者模式
TextField事件監(jiān)聽
public void actionPerformed(ActionEvent e){
TextField tf = (TextField)e.getSource();
持有對方引用---門面模式(對外) 調(diào)停者模式(對內(nèi)) 大管家
class MyMonitor implements ActionListener {
TFFrame tf = null;
public MyMonitor(TFFrame tf) {
this.tf = tf;
}
public void actionPerformed(ActionEvent e){}
class TFFrame extends Frame {
TextField num1,num2,num3;
public void launchFrame() {
Button btnEqual = new Button("=");
btnEqual.addActionListener(new MyMonitor(this));
}
inner class可以直接訪問包裝類內(nèi)的屬性和方法 擁有外部包裝類的引用
該類不允許或不需要其他類進行訪問時
注意內(nèi)部類的位置與成員變量 及成員方法一個級別
paint方法 paint(Graphics g) 被自動調(diào)用
Frame需要被重畫時 顯示或重新顯示 改變窗口大小時
不需要被顯示調(diào)用
鼠標(biāo)事件適配器
MouseAdapter 實現(xiàn)了 MouseListener接口
可使用其子類作為MouseEvent的監(jiān)聽器
使用適配器可以避免監(jiān)聽器類定義沒有必要的空方法
repaint() - update() - paint() ---雙緩沖
windows事件
windowAdapter 匿名類-方法內(nèi)部類
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
}
)
反射機制
reflection
程序運行過程
xxx.class ----ClassLoader 將其Load到內(nèi)存中CodeSegment----
----code segment main ----運行環(huán)境找到main方法開始執(zhí)行----
運行過程中會有更多的class被load到 內(nèi)存 動態(tài)加載機制
ClassLoader的類加載機制:
并非一次加載,需要的時候再加載(運行期動態(tài)加載)
static語句塊在加載后執(zhí)行一次
dynamic語句塊每次new新的對象都會執(zhí)行:
等同于構(gòu)造方法中的語句耽装,用的較少
-verbose:class 可以詳細(xì)查看程序加載過程
動態(tài)語句塊
class D {
{
System.out.println("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");
}
}
new 一個對象時 會被重新調(diào)用
JDK內(nèi)置ClassLoader
bootstrap ClassLoader(最早啟動) implemented by native language(C 匯編等)/ load the core classes of jdk
System.out.println(String.class.getClassLoader()); null 最核心的類的加載 這些加載器名稱為null
首先Load ClassLoader 其他的ClassLoader再Load其他的Class
extesion ClassLoader 擴展類 loader class from jre/lib/ext
application ClassLoader load user-define classes ClassLoader.getSystemClassLoader()
other ClassLoader SecureClassLoader URLClassLoader
JDK Class Loader 的層次關(guān)系 (不是繼承)
bootstrap ClassLoader 對象
extesion ClassLoader 對象 對象 包含一個parent引用指向 bootstrap ClassLoader 對象
application ClassLoader 對象 包含一個parent引用指向 extesion ClassLoader 對象
other ClassLoader 對象 包含一個parent引用指向 application ClassLoader 對象
Class Loader在load的時候首先找到上一層loader 是不是load過了 如果已經(jīng)load了 不再load
自己寫的String.class 永遠(yuǎn)沒有機會執(zhí)行(破壞性的代碼)
java.lang.Class
反射機制 創(chuàng)建對象
Class c = Class.forName("T");
Object o = c.newInstance();
Method[] methods = c.getMethods();
for(Method m : methods) {
System.out.println(m.getName());
if(m.getName().equals("mm")) {
m.invoke(o);
}
}
if(m.getName().equals("m1")) {
m.invoke(o,1);
for(Class paramType : m.getParameterTypes()) {
System.out.println(paramType.getName());
}
//m.getParameterTypes();
}
if(m.getName().equals("getS")) {
Class returnType = m.getReturnType();
System.out.println(returnType.getName());
}