首先考慮 對(duì)于這些問題 包含哪些類那些對(duì)象
應(yīng)該具有哪些屬性和方法
類和類之間具有哪種關(guān)系 關(guān)聯(lián) 繼承 聚集 組合 實(shí)現(xiàn) 多態(tài)
所有的paradigm都是對(duì)現(xiàn)實(shí)問題的抽象:
匯編是對(duì)機(jī)器語(yǔ)言的抽象
面向過(guò)程的語(yǔ)言是對(duì)匯編的抽象
對(duì)象更符合對(duì)于像是問題的抽象
對(duì)象都有對(duì)外服務(wù)的接口: 通過(guò)繼承可以復(fù)用
對(duì)象隱藏內(nèi)部服務(wù)的實(shí)現(xiàn):通過(guò)聚合可以復(fù)用
resuable 可重用性
extensibility 可擴(kuò)展性
維護(hù)和替換更加方便
組件 比對(duì)象更高層次的抽象 二進(jìn)制級(jí)別:web service
定義成員變量可以初始化 如果不進(jìn)行初始化 系統(tǒng)默認(rèn)初始化 局部變量必須初始化
成員變量作用域?yàn)檎麄€(gè)類體 0 false 應(yīng)用類型默認(rèn)為null
除基本類型外變量類型為引用類型,Java中對(duì)象是通過(guò)引用對(duì)其操作的。
如何在內(nèi)存中區(qū)分類和對(duì)象?
類是靜態(tài)的概念,在代碼區(qū)。
對(duì)象是new出來(lái)的,位于堆內(nèi)存,類的每個(gè)成員變量在不同的對(duì)象中都有不同的值,
除了靜態(tài)變量,而方法只有一份,執(zhí)行的時(shí)候才占用內(nèi)存。
堆內(nèi)存動(dòng)態(tài)分配內(nèi)存 對(duì)象只有在運(yùn)行期間分配 因此new 新建對(duì)象 放在堆內(nèi)存中
同一個(gè)類的每個(gè)對(duì)象有不同的成員變量存儲(chǔ)空間
同一個(gè)類的每個(gè)對(duì)象共享該類方法
Java中進(jìn)行函數(shù)調(diào)用中傳遞參數(shù)時(shí) 遵循值傳遞的原則:
基本類型傳遞的是該數(shù)據(jù)值本身,引用類型傳遞的是對(duì)對(duì)象的引用,而不是對(duì)象本身。
構(gòu)造方法:
使用new + 構(gòu)造方法創(chuàng)建一個(gè)新的對(duì)象
構(gòu)造方法用來(lái)初始化對(duì)象的函數(shù)
構(gòu)造方法與類同名且沒有返回值 void 也不能寫
當(dāng)沒有指定構(gòu)造函數(shù)時(shí) 編譯器自動(dòng)添加 類名() { } 構(gòu)造函數(shù)
指定了構(gòu)造函數(shù)后 不再提供默認(rèn)構(gòu)造函數(shù)
命名規(guī)則:
類名首字母 大寫
方法名 成員名 變量名 首字母小寫
運(yùn)用駝峰標(biāo)識(shí)
方法的重載 一個(gè)類中定義相同名字 但參數(shù)不同的多個(gè)方法
調(diào)用時(shí) 會(huì)根據(jù)不同的參數(shù)表選擇對(duì)應(yīng)的方法
非靜態(tài)方法是針對(duì)每個(gè)對(duì)象進(jìn)行調(diào)用
this:
this關(guān)鍵字代表使用該方法的對(duì)象的引用
當(dāng)必須指出當(dāng)前使用方法的對(duì)象是誰(shuí)時(shí)要使用this
有時(shí)使用this可以處理方法中成員變量和參數(shù)重名的情況
this可以看做是一個(gè)變量 它的值是當(dāng)前對(duì)象的引用
static:
類中,static聲明的成員變量為靜態(tài)成員變量,它為該類的公用變量,
在第一次使用時(shí)被初始化,對(duì)于該類的所有對(duì)象來(lái)說(shuō),static成員變量只有一份。
用static聲明的方法為靜態(tài)方法,在調(diào)用該方法時(shí),不會(huì)將對(duì)象的引用傳遞給它,
所以在static方法中不可訪問非static成員。
靜態(tài)方法不再是針對(duì)某個(gè)對(duì)象調(diào)用,所以不能訪問非靜態(tài)成員。
可以通過(guò)對(duì)象引用或類名(不需要實(shí)例化)訪問靜態(tài)成員
包名規(guī)則:
Package 必須寫在源代碼第一行
公司域名倒過(guò)來(lái)
Java編譯器把包對(duì)應(yīng)于文件系統(tǒng)的目錄管理,package語(yǔ)句中,
用‘.’指明包(目錄)的層次。
編譯后的class文件必須位于正確目錄下 與包的層次完全的一致。:
該類的源碼可能會(huì)產(chǎn)生影響 刪除或轉(zhuǎn)移至另外目錄
使用其他類時(shí)必須寫全包名 或者引入包 訪問同意包下的類 不需要引入。
必須class文件的最上層包的的父目錄必須位于classpath下
執(zhí)行一個(gè)類需要寫全包名
jar -cvf test.jar .
對(duì)于class的權(quán)限修飾 只可以用public和default
public類可以在任意地方被訪問
default類只可以被同一個(gè)包內(nèi)部的類訪問
extends關(guān)鍵字實(shí)現(xiàn)類的繼承:
<modifier> class <name> [extends<superclass>] {……}
通過(guò)繼承,子類自動(dòng)擁有了基類superclass 的所有成員-成員變量和方法
Java支持單繼承 不支持多繼承:一個(gè)子類只能有一個(gè)基類 一個(gè)基類可以派生出多個(gè)子類
private類權(quán)限
default包權(quán)限
protected 子類權(quán)限
public 公開
重寫方法不能使用比被重寫方法更嚴(yán)格的訪問權(quán)限,相同方法名 參數(shù)列表和返回類型
重寫時(shí)一定要copy函數(shù)頭
super引用基類的成分。與this類似。
繼承中的構(gòu)造方法:
子類的構(gòu)造過(guò)程中必須調(diào)用其基類的構(gòu)造方法。(子類對(duì)象內(nèi)部包含一個(gè)弗雷對(duì)象)
子類可以在自己的構(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)用基類無(wú)參構(gòu)造方法。
如果子類構(gòu)造方法中既沒有顯示調(diào)用基類構(gòu)造方法,而基類中又沒有無(wú)參的構(gòu)造方法,則編譯出錯(cuò),找不到符號(hào)。
Object類是所有Java類的根基類
類未使用extends關(guān)鍵字指明其基類,默認(rèn)基類為object類。
toString() 類名@hashCode()
Object 的equals方法:x.equals(y) 當(dāng)x和y為同一對(duì)象的引用時(shí),返回true
String/Date 重寫了Object的equals方法,
x.equals(y) 當(dāng)x和y索引用到的對(duì)象 是同一類對(duì)象且屬性內(nèi)容相等時(shí)(并不一定是相同對(duì)象),
返回為true否則為false。 非空
對(duì)象轉(zhuǎn)型:casting 父類-子類轉(zhuǎn)型 父類引用指向子類對(duì)象 subclass d = (subclass)(new superClass())
一個(gè)基類的引用類型變量可以“指向”其子類的對(duì)象。
一個(gè)基類的引用不可以訪問其子類對(duì)象新增加的成員(屬性和方法)
可以使用 引用 變量instanceof 類名 來(lái)判斷引用型變量所 指向 的對(duì)象是否屬于該類或該類的子類。
子類對(duì)象可以當(dāng)做基類對(duì)象使用稱作向上轉(zhuǎn)型(upcasting) 否則 向下轉(zhuǎn)型 downcasting
動(dòng)態(tài)綁定和多態(tài):
動(dòng)態(tài)綁定是指 在執(zhí)行期間,非編譯期間,判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。
多態(tài)的存在有三個(gè)必要條件:繼承、重寫、父類引用指向子類對(duì)象
abstract 抽象類
abstract class abstract method
含有抽象方法的類必須聲明為抽象類 抽象類必須被繼承 抽象方法必須被重寫
抽象類不能被實(shí)例化
抽象方法只需聲明 不需實(shí)現(xiàn)
抽象類中可以包含非抽象方法
final:等同于const
final變量的值不能被改變:成員變量 局部變量
final方法不能被重寫
final類不能被繼承
接口:interface 抽象方法和常量值的定義的集合 一種特殊的抽象類
所有的方法都是抽象的 沒有變量和方法的實(shí)現(xiàn)
只包含常量和方法的定義 都是靜態(tài)變量和final變量
多個(gè)無(wú)關(guān)的類可以實(shí)現(xiàn)同一個(gè)接口
一個(gè)類可以實(shí)現(xiàn)多個(gè)無(wú)關(guān)的接口
接口與實(shí)現(xiàn)類之間存在多態(tài)性。
public static final int x;不屬于特定的對(duì)象 不可更改的常量
接口內(nèi)所有方法 不用添加abstract修飾符 全部是abstract
接口特性:
接口可以多重實(shí)現(xiàn);
接口中聲明的屬性默認(rèn)為 public static final ,也只能是public static final
接口中只能定義抽象方法,方法默認(rèn)為public,也只能是public
接口可以繼承其他接口,并添加新的屬性和抽象方法。
異常 運(yùn)行期錯(cuò)誤
錯(cuò)誤名字 行號(hào)
try { } catch(Exception e){e.printStackTrace();} finally {}
throws Exception {} 聲明
throw new Exception(""); 定義所拋出的異常
try代碼段包含可能產(chǎn)生例外的代碼
try代碼段后跟一個(gè)或多個(gè)catch代碼段
每個(gè)catch代碼段聲明其能處理的一種特定類型的異常并提供處理的方法
當(dāng)異常發(fā)生時(shí),程序會(huì)中止當(dāng)前的流程,根據(jù)獲取異常的類型去執(zhí)行相應(yīng)的catch代碼段。
finally段代碼無(wú)論是否發(fā)生異常都會(huì)執(zhí)行。異常處理統(tǒng)一的出口:
進(jìn)行資源的清楚工作:關(guān)閉打開的文件 刪除臨時(shí)文件等
printStackTrace(); getMessage();
Java的異常處理機(jī)制使得異常事件 沿著被調(diào)用的順序往前尋找
只要找到符合該異常的處理程序即可。
throwable Error(系統(tǒng)錯(cuò)誤 虛擬機(jī)錯(cuò)誤) Exception(一般需要用戶顯示聲明或捕獲):RuntimeException
自定義異常:
繼承java.lang.Exception 類聲明自己的異常類
在方法適當(dāng)?shù)奈恢?生成自定義異常的實(shí)例 并用throw語(yǔ)句拋出
在方法的聲明部分用throws語(yǔ)句聲明該方法可能拋出的異常
重寫方法需要拋出與原方法所拋出異常類型一致異常或不拋出異常。
先逮小的 再逮大的
格式 考慮周全 異常
數(shù)組是引用類型
元素為引用數(shù)據(jù)類型的數(shù)組中的每一個(gè)元素都需要實(shí)例化
動(dòng)態(tài)初始化:數(shù)組定義與為數(shù)組元素分配空間和賦值的操作分開進(jìn)行
靜態(tài)初始化:定義數(shù)組同時(shí) 為數(shù)組元素分配空間和賦值
*****常見算法*****
java.lang.String 不可變的字符序列
string-length 字符長(zhǎng)度不是字節(jié)長(zhǎng)度
StringBuffer 可變的字符序列 改變直接在其內(nèi)存所在區(qū)域執(zhí)行
StringBuffer和String類似,但StringBuffer可以對(duì)其字符串進(jìn)行改變
StringBuffer()
StringBufer(String str)
java.io.File 類代表系統(tǒng)文件名-路徑和文件名
Enum枚舉類型
只能夠取特定值中的一個(gè);
使用enum關(guān)鍵字
java.lang.Enum
容器
java.util
Collection-Set(HashSet) List(ArrayList/LinkedList)
Map-HashMap
Set 沒有順序不可以重復(fù)
List 有順序可以重復(fù)
Map 鍵值對(duì) key-value
容器類對(duì)象調(diào)用remove contains等方法時(shí) 需要比較對(duì)象是否相等,
需要重寫equals和hashCode(map)方法,實(shí)現(xiàn)自定義的對(duì)象相等規(guī)則。
相等的對(duì)象應(yīng)該具有相等的hashCode
hashCode適合做索引
所有實(shí)現(xiàn)了Collection接口的容器類 都有一個(gè)iterator方法用以返回一個(gè)
實(shí)現(xiàn)了Iterator接口的對(duì)象。
Iterator對(duì)象稱作迭代器,用以方便的實(shí)現(xiàn)對(duì)容器內(nèi)元素的遍歷操作。
Iterator對(duì)象的remove方法 是在迭代過(guò)程中刪除元素的唯一安全方法
不能使用容器的reomve(obj)方法 因?yàn)镮terator在進(jìn)行遍歷時(shí),執(zhí)行了鎖定,
對(duì)當(dāng)前元素進(jìn)行鎖定,不允許其他對(duì)象進(jìn)行訪問和修改。
增強(qiáng)For循環(huán):for(Object o : c)
無(wú)法方便訪問數(shù)組的下標(biāo)值
無(wú)法針對(duì)集合的元素進(jìn)行刪除:內(nèi)部也是調(diào)用Iterator
建議: 除了簡(jiǎn)單遍歷并讀出其中內(nèi)容 不建議使用增強(qiáng)for循環(huán)
Set接口:
Collection子接口,Set接口沒有提供額外的方法,
但實(shí)現(xiàn)Set接口的容器類中的元素是沒有順序的 且不可重復(fù)
HashSet TreeSet 與數(shù)學(xué)中集合對(duì)應(yīng)
相同元素不會(huì)被重復(fù)添加
Comparable接口 compareTo
Array 讀快改慢 改指的是針對(duì)整個(gè)list的更改
Linked 讀慢改快
Hash之間
Map接口 存儲(chǔ) 鍵值對(duì)
Map接口實(shí)現(xiàn)類 HashMap TreeMap
Map類中存儲(chǔ)的鍵值對(duì) 通過(guò)鍵值標(biāo)識(shí) 所以鍵值不能重復(fù)(equals->hashCode)
auto-boxing unboxing 自動(dòng)打包 解包
自動(dòng)將基礎(chǔ)類型轉(zhuǎn)換為對(duì)象
自動(dòng)將對(duì)象轉(zhuǎn)換為基礎(chǔ)類型
Generic 泛型
jdk1.4以前類型不明確:裝入集合類型都被當(dāng)做Object對(duì)待 失去自己的實(shí)際類型
從集合中取出時(shí) 需要轉(zhuǎn)型 效率低 容易產(chǎn)生錯(cuò)誤
在定義集合時(shí)同時(shí)定義集合中對(duì)象的類型
增強(qiáng)程序的可讀性和穩(wěn)定性
優(yōu)先使用泛型
一個(gè)圖:
一個(gè)類:Collections
三個(gè)知識(shí)點(diǎn):For增強(qiáng)For Generic泛型(極其重要) Auto-boxing/unboxing
六個(gè)接口:collection Set List Map Iterator(游標(biāo)) Comparable(可應(yīng)用泛型)
IO
Java程序中對(duì)于數(shù)據(jù)的輸入 輸出操作以流(stream)的形式進(jìn)行,jdk提供了
各種各樣的流類 用以獲取不同種類的數(shù)據(jù) 程序中通過(guò)標(biāo)準(zhǔn)的方法輸入或輸出數(shù)據(jù)
輸入流 輸出流 站在程序的角度
字節(jié)流 字符流
節(jié)點(diǎn)流 處理流
字節(jié)流 字符流
輸入流 InputStream Reader
輸出流 OutputStream Writer
節(jié)點(diǎn)流:從一個(gè)特定數(shù)據(jù)源 節(jié)點(diǎn) 讀寫數(shù)據(jù) 如文件 內(nèi)存
處理流: 連接 在已存在的流 (節(jié)點(diǎn)流或處理流) 之上
通過(guò)對(duì)數(shù)據(jù)的處理為程序提供更為強(qiáng)大的讀寫功能
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í)可以指定編碼集合
數(shù)據(jù)流
DataInputStream DataOutputStream 處理流,
分別套接在InputStream OutputStream上
提供了存取與機(jī)器無(wú)關(guān)的Java原始類型數(shù)據(jù)
PrintIO:
PrintWriter字符 PrintStream字節(jié)
Object流
直接將Object寫入或讀出
transient關(guān)鍵字
serializable接口
externalizable接口
Thread:
一個(gè)程序中不同的執(zhí)行路徑
進(jìn)程 靜態(tài)概念 class文件 EXE文件
進(jìn)程執(zhí)行指的是 進(jìn)程中的主線程開始執(zhí)行
實(shí)際運(yùn)行的都是線程。
一個(gè)CPU只能支持單線程
Java的線程是通過(guò) java.lang.Thread 實(shí)現(xiàn)的
VM啟動(dòng)時(shí)會(huì)有一個(gè)由主方法所定義的線程
創(chuàng)建Thread實(shí)例來(lái)創(chuàng)建新的線程
每個(gè)線程都是通過(guò)某個(gè)特定Thread對(duì)象所對(duì)應(yīng)的run()完成其操作,方法run()成為線程體
通過(guò)調(diào)用Thread的start()啟動(dòng)線程
線程啟動(dòng)必須調(diào)用Thread類的start()方法 通知cpu 給予時(shí)間執(zhí)行任務(wù)
線程和進(jìn)程區(qū)別:
每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文) 進(jìn)程間的切換會(huì)有較大開銷
線程可以看做是輕量級(jí)的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間
每個(gè)線程有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC) 線程切換的開銷小
多進(jìn)程:在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)程序 任務(wù)
多線程:同一應(yīng)用程序中有多個(gè)順序流同時(shí)執(zhí)行
線程的創(chuàng)建和啟動(dòng):
第一種:
定義線程類實(shí)現(xiàn)Runnable接口
Runnable 只有一個(gè)方法: public void run() 定義線程運(yùn)行體
使用Runnable接口可以為多線程提供共享的數(shù)據(jù)
在實(shí)現(xiàn)Runnable接口的類的run方法定義中可以使用Thread的靜態(tài)方法:
public static Thread currentThread();
第二種:
定義一個(gè)Thread子類并重寫其run方法
class MyThread extends Thread {
public void run(){ }
}
能使用接口不要從Thread繼承!??!
線程狀態(tài)轉(zhuǎn)換
isAlive();
getPriority();
setPriority();
Thread.sleep();
join();
yield();
Wait();
notify();
notifyAll();
線程優(yōu)先級(jí) 默認(rèn)為5 1-10
同一線程類可以啟動(dòng)多個(gè)線程
線程同步:
public synchronized void methodName(){} 執(zhí)行方法的過(guò)程中鎖定當(dāng)前對(duì)象
Java對(duì)象互斥鎖 保證了共享數(shù)據(jù)操作的完整性,每個(gè)對(duì)象都對(duì)應(yīng)一個(gè)稱為 “互斥鎖”的標(biāo)記
這個(gè)標(biāo)記保證在任一時(shí)刻 只能有一個(gè)線程訪問該對(duì)象
關(guān)鍵字synchronized 修飾某個(gè)對(duì)象某一方法時(shí) 表明 執(zhí)行該方法的過(guò)程中鎖定當(dāng)前對(duì)象的這段方法
即在任一時(shí)刻 只能由一個(gè)線程訪問
Object.wait()
this.wait() 當(dāng)前對(duì)象wait--
-訪問當(dāng)前對(duì)象的線程 拿到該方法所屬對(duì)象的鎖 遇到阻塞 此時(shí)使用wait()
鎖定對(duì)象 鎖定線程后 才有資格調(diào)用wait
wait時(shí) 鎖不再屬于當(dāng)前對(duì)象 Object類方法 其它進(jìn)程可以訪問該鎖的對(duì)象
sleep 鎖仍然屬于當(dāng)前對(duì)象 Thread類方法
this.notify(); 叫醒一個(gè)正在wait該對(duì)象的線程
this.notifyAll() 叫醒等待該對(duì)象的其他所有線程
network
tcp ip 詳解
ip Internet protocol 無(wú)連接數(shù)據(jù)包傳送 數(shù)據(jù)包路由選擇和差錯(cuò)控制
tcp 字節(jié)流非報(bào)文流 面向連接的協(xié)議 不可靠的因特網(wǎng)上提供可靠的 端到端的字節(jié)流通信協(xié)議
tcp 類似打電話 三次握手
udp user data protocol 發(fā)送封裝的原始IP數(shù)據(jù)報(bào) 發(fā)送時(shí)無(wú)需建立連接 不可靠連接
(網(wǎng)絡(luò)電話 聊天 視頻等)可以丟報(bào)
socket
兩個(gè)Java應(yīng)用程序 通過(guò)一個(gè)雙向的網(wǎng)絡(luò)通信連接實(shí)現(xiàn)數(shù)據(jù)交換 雙向鏈路一端稱為Socket
Socket 實(shí)現(xiàn) client-server 連接
Java.net 包定義兩個(gè)類(TCP) Socket 和 ServerSocket 分別用來(lái)實(shí)現(xiàn)雙向連接的client和server端
建立連接所需的尋址信息為遠(yuǎn)程計(jì)算機(jī)的IP地址和端口號(hào)(Port number) 2個(gè)字節(jié) 65536個(gè)端口號(hào)
一個(gè)應(yīng)用程序最多跑65536個(gè)網(wǎng)絡(luò)應(yīng)用程序
1024以下的端口號(hào) 系統(tǒng)占用
TCP端口 65536個(gè)
UDP端口 65536個(gè)
先啟動(dòng)Server 再執(zhí)行client
Socket包-berklin
berklinDB-現(xiàn)代數(shù)據(jù)庫(kù)的根源
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 兩個(gè)核心類
Component:
Container {Button/TextArea/Label/TestFields/List}
Window Panel
Frame Dialog Applet
Component 對(duì)象不能獨(dú)立顯示 必須存放在某一Container對(duì)象中
Container是Component的子類
Panel對(duì)象可以擁有自己的布局管理器 FlowLayout
布局管理器
管理Component在Container中的布局 不必直接設(shè)置Component的大小和位置
每個(gè)Container都有一個(gè)布局管理器對(duì)象,當(dāng)容器需要對(duì)某個(gè)組件進(jìn)行定位或判斷
其大小尺寸時(shí) 調(diào)用其布局管理器 調(diào)用Container的SetLayout方法改變其布局管理器對(duì)象
LayoutManager:
FlowLayout Panel類 默認(rèn)布局管理器 默認(rèn)對(duì)齊方式居中 水平
BorderLayout Frame 東西南北中
GridLayout
CardLayout
GridBagLayout
事件監(jiān)聽:
事件源對(duì)象-----當(dāng)某種事件發(fā)生--向監(jiān)聽器傳送某種事件對(duì)象---接到事件對(duì)象后進(jìn)行某種處理--
實(shí)現(xiàn)了某種監(jiān)聽器的接口的類的對(duì)象========注冊(cè)=======事件源對(duì)象
ActionListener 接口
Monitor implements ActionListener
actionPerformed(ActionEvent e){}
Monitor m = new Monitor();
Button b1.addActionListener(m);
e.getSource() 返回的對(duì)象實(shí)際為Button
實(shí)現(xiàn)了observer 觀察者模式
TextField事件監(jiān)聽
public void actionPerformed(ActionEvent e){
TextField tf = (TextField)e.getSource();
持有對(duì)方引用---門面模式(對(duì)外) 調(diào)停者模式(對(duì)內(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)的屬性和方法 擁有外部包裝類的引用
該類不允許或不需要其他類進(jìn)行訪問時(shí)
注意內(nèi)部類的位置與成員變量 及成員方法一個(gè)級(jí)別
paint方法 paint(Graphics g) 被自動(dòng)調(diào)用
Frame需要被重畫時(shí) 顯示或重新顯示 改變窗口大小時(shí)
不需要被顯示調(diào)用
鼠標(biāo)事件適配器
MouseAdapter 實(shí)現(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);
}
}
)
反射機(jī)制
reflection
程序運(yùn)行過(guò)程
xxx.class ----ClassLoader 將其Load到內(nèi)存中CodeSegment----
----code segment main ----運(yùn)行環(huán)境找到main方法開始執(zhí)行----
運(yùn)行過(guò)程中會(huì)有更多的class被load到 內(nèi)存 動(dòng)態(tài)加載機(jī)制
ClassLoader的類加載機(jī)制:
并非一次加載,需要的時(shí)候再加載(運(yùn)行期動(dòng)態(tài)加載)
static語(yǔ)句塊在加載后執(zhí)行一次
dynamic語(yǔ)句塊每次new新的對(duì)象都會(huì)執(zhí)行:
等同于構(gòu)造方法中的語(yǔ)句,用的較少
-verbose:class 可以詳細(xì)查看程序加載過(guò)程
動(dòng)態(tài)語(yǔ)句塊
class D {
{
System.out.println("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");
}
}
new 一個(gè)對(duì)象時(shí) 會(huì)被重新調(diào)用
JDK內(nèi)置ClassLoader
bootstrap ClassLoader(最早啟動(dòng)) 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 擴(kuò)展類 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 對(duì)象
extesion ClassLoader 對(duì)象 對(duì)象 包含一個(gè)parent引用指向 bootstrap ClassLoader 對(duì)象
application ClassLoader 對(duì)象 包含一個(gè)parent引用指向 extesion ClassLoader 對(duì)象
other ClassLoader 對(duì)象 包含一個(gè)parent引用指向 application ClassLoader 對(duì)象
Class Loader在load的時(shí)候首先找到上一層loader 是不是load過(guò)了 如果已經(jīng)load了 不再load
自己寫的String.class 永遠(yuǎn)沒有機(jī)會(huì)執(zhí)行(破壞性的代碼)
java.lang.Class
反射機(jī)制 創(chuàng)建對(duì)象
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());
}