java基礎(chǔ)總結(jié)大全(筆記)_第1頁
java基礎(chǔ)總結(jié)大全(筆記)_第2頁
java基礎(chǔ)總結(jié)大全(筆記)_第3頁
java基礎(chǔ)總結(jié)大全(筆記)_第4頁
java基礎(chǔ)總結(jié)大全(筆記)_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一 基礎(chǔ)知識(shí) 1 JVM JRE 和 JDK 的區(qū)別 JVM Java Virtual Machine java 虛擬機(jī) 用于保證 java 的跨平臺(tái)的特性 java 語言是跨平臺(tái) jvm 不是跨平臺(tái)的 JRE Java Runtime Environment java 的運(yùn)行環(huán)境 包括 jvm java 的核心類庫 JDK Java Development Kit java 的開發(fā)工具 包括 jre 開發(fā)工具 2 環(huán)境變量 path 和 classpath 的作用是什么 1 path 是配置 Windows 可執(zhí)行文件的搜索路徑 即擴(kuò)展名為 exe 的程序文件所在的目 錄 用于指定 DOS 窗口命令的路徑 2 Classpath 是配置 class 文件所在的目錄 用于指定類搜索路徑 JVM 就是通過它來 尋找該類的 class 類文件的 3 變量有什么用 為什么要定義變量 什么時(shí)候用 答 變量的作用 用來存儲(chǔ)數(shù)據(jù) 為什么要定義變量 用來不斷的存放同一類型的常量 并可以重復(fù)使用 4 在內(nèi)存中做了哪些事情 1 將 Person class 文件加載進(jìn)內(nèi)存中 2 如果 p 定義在主方法中 那么 就會(huì)在??臻g開辟一個(gè)變量空間 p 3 在堆內(nèi)存給對(duì)象分配空間 4 對(duì)對(duì)象中的成員進(jìn)行默認(rèn)初始化 5 對(duì)對(duì)象中的成員進(jìn)行顯示初始化 6 調(diào)用構(gòu)造代碼塊對(duì)對(duì)象進(jìn)行初始化 如果沒有就不執(zhí)行 7 調(diào)用構(gòu)造方法對(duì)對(duì)象進(jìn)行初始化 對(duì)象初始化完畢 8 將對(duì)象的內(nèi)存地址賦值給 p 變量 讓 p 變量指向該對(duì)象 11 static 關(guān)鍵字 1 靜態(tài)的意思 用來修飾成員變量和成員函數(shù) 2 靜態(tài)的特點(diǎn) 隨著類的加載而加載 優(yōu)先于對(duì)象存在 對(duì)所有對(duì)象共享 可以被類名直接調(diào)用 3 靜態(tài)的注意事項(xiàng) A 靜態(tài)方法只能訪問靜態(tài)成員 為什么 因?yàn)殪o態(tài)的內(nèi)容是隨著類的加載而加載 它是先進(jìn)內(nèi)存的 B 靜態(tài)方法中不能使用 this super 關(guān)鍵字 C 主方法是靜態(tài)的 public static void main String args public 公共的意思 是最大權(quán)限修飾符 static 由于 jvm 調(diào)用 main 方法的時(shí)候 沒有創(chuàng)建對(duì)象 只能通過類名調(diào)用 所以 main 必須用 static 修飾 void 由于 main 方法是被 jvm 調(diào)用 不需要返回值 用 void 修飾 main main 是主要的意思 所以 jvm 采用了這個(gè)名字 是程序的入口 String 字符串?dāng)?shù)組 args 數(shù)組名 在運(yùn)行的時(shí)候 通過 java 命令給 args 數(shù)組賦值 格式 java MainTest hello world itcast 4 靜態(tài)變量和成員變量的區(qū)別 A 調(diào)用方式 靜態(tài)變量也稱為類變量 可以直接通過類名調(diào)用 也可以通過對(duì)象名調(diào)用 這個(gè)變量屬于類 成員變量也稱為實(shí)例變量 只能通過對(duì)象名調(diào)用 這個(gè)變量屬于對(duì)象 B 存儲(chǔ)位置 靜態(tài)變量存儲(chǔ)在方法區(qū)長中的靜態(tài)區(qū) 成員變量存儲(chǔ)在堆內(nèi)存 C 生命周期 靜態(tài)變量隨著類的加載而存在 隨著類的消失而消失 生命周期長 成員變量隨著對(duì)象的創(chuàng)建而存在 隨著對(duì)象的消失而消失 D 與對(duì)象的相關(guān)性 靜態(tài)變量是所有對(duì)象共享的數(shù)據(jù) 成員變量是每個(gè)對(duì)象所特有的數(shù)據(jù) 5 靜態(tài)的優(yōu)點(diǎn)和弊端 優(yōu)點(diǎn) 對(duì)對(duì)象的共享數(shù)據(jù)進(jìn)行單獨(dú)空間的存儲(chǔ) 節(jié)省內(nèi)存 沒有必要每個(gè)對(duì)象都存儲(chǔ)一 份 可直接被類名調(diào)用 弊端 生命周期過長 隨著類的消失而消失 訪問出現(xiàn)權(quán)限 即靜態(tài)雖好但只能訪問靜態(tài) 6 什么使用使用靜態(tài)呢 A 當(dāng)所有對(duì)象共享某個(gè)數(shù)據(jù)的時(shí)候 就把這個(gè)成員變量定義為靜態(tài)修飾的 B 當(dāng)某個(gè)方法沒有訪問該類中的非靜態(tài)成員 就可以把這個(gè)方法定義為靜態(tài)修飾 靜態(tài)的生命周期比較長 所以一般不推薦使用 7 靜態(tài)代碼塊 A 它只執(zhí)行一次 它比 main 還先執(zhí)行 B 執(zhí)行順序 靜態(tài)代碼塊 構(gòu)造代碼塊 構(gòu)造方法 12 制作 API 次重點(diǎn) API 全拼 Application Program Interface 應(yīng)用程序編程接口 1 類中的內(nèi)容需要用文檔注釋 2 使用 JDK bin 目錄下的 javadoc 工具 格式 javadoc d 目錄 author version ArrayTool java 13 單例設(shè)計(jì)模式 1 設(shè)計(jì)模式 解決某類問題行之有效的方法 是一種思想 是規(guī)律的總結(jié) 2 用來保證某個(gè)類在內(nèi)存中只有一個(gè)對(duì)象 3 保證唯一性的思想及步驟 為了避免其他程序建立該類對(duì)象 先禁止其他程序建立該類對(duì)象 即將構(gòu)造函 數(shù)私有化 為了其他程序訪問到該類對(duì)象 須在本類中創(chuàng)建一個(gè)該類私有對(duì)象 為了方便其他程序訪問到該類對(duì)象 可對(duì)外提供一個(gè)公共訪問方式 比如 API 中的 Runtime 類就是單例設(shè)計(jì)模式 4 單例設(shè)計(jì)模式的兩種方式 A 餓漢式 當(dāng)類加載的時(shí)候 就創(chuàng)建對(duì)象 class Student private Student private static final Student s new Student public static Student getInstance return s B 懶漢式 當(dāng)使用的使用 才去創(chuàng)建對(duì)象 class Student private Student private static final Student s null public static Student getInstance if s null 線程 1 就進(jìn)來了 線程 2 就進(jìn)來了 s new Student return s 餓漢式和懶漢式的區(qū)別 餓漢式是類一加載進(jìn)內(nèi)存就創(chuàng)建好了對(duì)象 懶漢式則是類才加載進(jìn)內(nèi)存的時(shí)候 對(duì)象還沒有存在 只有調(diào)用了 getInstance 方 法時(shí) 對(duì)象才開始創(chuàng)建 懶漢式是延遲加載 如果多個(gè)線程同時(shí)操作懶漢式時(shí)就有可能出現(xiàn)線程安全問題 解決線程安全問題 可以加同步來解決 但是加了同步之后 每一次都要比較鎖 效率就變慢了 所以可以加雙重判斷來提高程序效率 注 開發(fā)常用餓漢式 因?yàn)轲I漢式簡(jiǎn)單安全 懶漢式多線程的時(shí)候容易發(fā)生問題 14 Math 類的使用 重點(diǎn) 1 數(shù)學(xué)操作類 該類沒有構(gòu)造函數(shù) 方法均為靜態(tài)的 2 掌握內(nèi)容 A 成員變量 E 比任何其他值都更接近 e 即自然對(duì)數(shù)的底數(shù) 的 double 值 PI 比任何其他值都更接近 pi 即圓的周長與直徑之比 的 double 值 B 成員方法 static double abs double a 返回 double 值的絕對(duì)值 返回絕對(duì)值 static double ceil double a 返回最小的 最接近負(fù)無窮大 double 值 該值大于等于參數(shù) 并等于 某個(gè)整數(shù) static double floor double a 返回最大的 最接近正無窮大 double 值 該值小于等于參數(shù) 并等于 某個(gè)整數(shù) max 返回兩個(gè)值中較大的那個(gè) min 返回兩個(gè)值中較小的那個(gè) static long round double a 返回最接近參數(shù)的 long static int round float a 返回最接近參數(shù)的 int static double random 返回帶正號(hào)的 double 值 該值大于等于 0 0 且小于 1 0 static double pow double a double b 返回第一個(gè)參數(shù)的第二個(gè)參數(shù)次冪的值 static double sqrt double a 返回正確舍入的 double 值的正平方根 15 Random 類的使用 重點(diǎn) 1 產(chǎn)生隨機(jī)數(shù)的類 2 掌握內(nèi)容 A 構(gòu)造方法 Random 創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器 Random long seed 使用單個(gè) long 種子創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器 B 成員方法 int nextInt 返回下一個(gè)偽隨機(jī)數(shù) 它是此隨機(jī)數(shù)生成器的序列中均勻分布 的 int 值 int nextInt int n 返回一個(gè)偽隨機(jī)數(shù) 它是取自此隨機(jī)數(shù)生成器序列的 在 0 包括 和指定值 不包括 之間均勻分布的 int 值 16 Scanner 類的使用 1 可以獲取從鍵盤的輸入數(shù)據(jù) 2 掌握內(nèi)容 構(gòu)造方法 Scanner InputStream source 構(gòu)造一個(gè)新的 Scanner 它生成的值是從指定的 輸入流掃描的 如 Scanner sc new Scanner System in 方法摘要 sc nextInt 獲取整型數(shù)據(jù) sc nextLine 獲取字符串?dāng)?shù)據(jù) 17 繼承 重點(diǎn) 1 把很多類的相同特征和行為進(jìn)行抽取 用一個(gè)類來描述 讓多個(gè)類和這個(gè)類產(chǎn)生一 個(gè)關(guān)系 這樣的話 多個(gè)類就可以省略很多代碼 這個(gè)關(guān)系就是繼承 java 中用 extends 關(guān) 鍵字表示 2 繼承的體系結(jié)構(gòu) A 多個(gè)具體的對(duì)象 不斷的向上抽取共享的內(nèi)容 最終形成了一個(gè)體系 這個(gè)體 系叫做繼承體系 B 繼承體系的學(xué)習(xí)和使用原則 學(xué)習(xí)頂層的內(nèi)容 因?yàn)樗钦麄€(gè)體系的共性內(nèi)容 創(chuàng)建子類使用 也就是使用底層的具體對(duì)象 3 繼承的特點(diǎn) A java 中只能單繼承 沒有多繼承 B java 可以有多重 層 繼承 4 繼承的好處 繼承的出現(xiàn)提高了代碼的復(fù)用性 繼承的出現(xiàn)讓類與類之間產(chǎn)生了關(guān)系 提供了多態(tài)的前提 5 子父類中的成員關(guān)系 A 成員變量 在子類方法中使用一個(gè)變量時(shí) 首先 在方法的局部變量中找這個(gè)變量 有則使用 否則 在本類中找成員變量 有則使用 否則 在父類中找成員變量 有則使用 否則 報(bào)錯(cuò) B 成員方法 用子類對(duì)象使用一個(gè)方法時(shí) 首先 在子類中找這個(gè)方法 有則使用 否則 在父類中找這個(gè)方法 有則使用 否則 報(bào)錯(cuò) 重寫和重載的區(qū)別 重載 在同一類中 方法名相同 參數(shù)列表不同 重載可以改變返回類型 重寫 在不同類中 子父類中 方法聲明相同 返回類型 方法名 參數(shù)列表均相同 重寫需要注意 子類方法的訪問權(quán)限要大于等于父類方法的訪問權(quán)限 靜態(tài)只能重寫靜態(tài) 但是這種情況一般不會(huì)出現(xiàn) 構(gòu)造方法 子類的實(shí)例化過程 子類創(chuàng)建對(duì)象時(shí) 會(huì)先去創(chuàng)建父類的對(duì)象 默認(rèn)是去調(diào)用父類的無參構(gòu)造方法 子類構(gòu)造方法中 第一行默認(rèn)是 super 為什么子類中第一行會(huì)默認(rèn)有 super 因?yàn)樗^承父類的成員使用 使用前這些成員必須初始化 而他們是父類的成員 所以 必須通過父類進(jìn)行初始化 所以 會(huì)先創(chuàng)建一個(gè)父類的對(duì)象 當(dāng)父類沒有無參構(gòu)造方法時(shí) 必須使用 this 或者 super 調(diào)用其他的構(gòu)造方法 6 this 和 super 的區(qū)別 this 代表本類對(duì)象的引用 super 代表父類的存儲(chǔ)空間 18 final 關(guān)鍵字 重點(diǎn) 1 最終的意思 可以用于修飾類 方法 變量 2 final 修飾的類不能被繼承 final 修飾的方法不能被重寫 final 修飾的變量是一個(gè)常量 只能被賦值一次 內(nèi)部類只能訪問被 final 修飾的局部變量 19 抽象類 重點(diǎn) 1 多個(gè)類有相同的方法聲明 但是方法體不一樣 這個(gè)時(shí)候 我們考慮把方法聲明進(jìn) 行抽取 讓子類繼承后 自己去實(shí)現(xiàn)方法體 沒有方法體的方法 我們需要用抽象標(biāo)志下 抽象的關(guān)鍵字是 abstract 2 抽象類 該方法稱為抽象方法 包含抽象方法的類就是抽象類 3 抽象類的特點(diǎn) A 抽象類和抽象方法都要用 abstract 進(jìn)行修飾 B 抽象類不能被實(shí)例化 C 抽象類中不一定有抽象方法 但是 有抽象方法的類一定是抽象類 4 抽象類中數(shù)據(jù)的特點(diǎn) A 成員變量 抽象類中可以有變量 也可以有常量 B 成員方法 抽象類中可以有抽象方法 也可以有非抽象方法 C 構(gòu)造方法 抽象類是一個(gè)類 所以 它有構(gòu)造方法 雖然本身不能實(shí)例化 但是可以給子類實(shí)例化使用 5 抽象類中的問題 A 抽象類中是否有構(gòu)造方法 能不能被實(shí)例化 如果不能 為什么有構(gòu)造方法 抽象類有構(gòu)造方法 抽象類不能被實(shí)例化 抽象類中的構(gòu)造方法供子類實(shí)例化調(diào)用 B 抽象關(guān)鍵字 abstract 不可以和哪些關(guān)鍵字共存 private 私有內(nèi)容子類繼承不到 所以 不能重寫 但是 abstract 修飾的方法 要求被重寫 兩者沖突 final final 修飾的方法不能被重寫 而 abstract 修飾的方法 要求被重寫 兩者沖突 static 假如一個(gè)抽象方法能通過 static 修飾 那么這個(gè)方法 就可以直接通過類名 調(diào)用 而抽象方法是沒有方法體的 這樣的調(diào)用無意義 所以 不能用 static 修飾 C 抽象類中可不可以沒有抽象方法 如果可以 這樣的類有什么用嗎 抽象類可以沒有抽象方法 抽象類中沒有抽象方法的作用 只是為了不讓別的類建立該抽象類對(duì)象 這個(gè) 在 awt 中有體現(xiàn) 20 接口 interface 1 當(dāng)一個(gè)類中的方法都是抽象的時(shí)候 java 提供了另一種表示方式 叫接口 用 interface 關(guān)鍵字表示 類與接口關(guān)系用 implements 表示 2 接口的成員特點(diǎn) A 成員變量 是常量 默認(rèn)修飾 public static final B 成員方法 都是抽象的 默認(rèn)修飾 public abstract 3 關(guān)系 A 類與類的關(guān)系 是繼承關(guān)系 類與類只能單繼承 可以多重繼承 B 類和接口的關(guān)系 是實(shí)現(xiàn)關(guān)系 類可以多實(shí)現(xiàn)接口 類在繼承一個(gè)類的同時(shí) 可以實(shí)現(xiàn)多個(gè)接口 C 接口和接口的關(guān)系 是繼承關(guān)系 接口可以多繼承接口 4 接口的特點(diǎn) A 是對(duì)外暴露的規(guī)則 B 是功能的擴(kuò)展 C 接口的出現(xiàn)降低耦合性 耦合 類與類之間的關(guān)系 內(nèi)聚 類完成功能的能力 編程規(guī)范 低耦合 高內(nèi)聚 D 接口可以多實(shí)現(xiàn) 如 CPU 和主板 筆記本的 USB 插口 插座 5 接口和抽象類的區(qū)別 A 抽象類只能被單繼承 接口可以多實(shí)現(xiàn) 接口的出現(xiàn)避免了多繼承的局限性 B 抽象類中的數(shù)據(jù)特點(diǎn) 成員變量 可以是變量 也可以是常量 成員方法 可以是抽象方法 也可以是非抽象方法 構(gòu)造方法 有構(gòu)造方法 接口中的數(shù)據(jù)特點(diǎn) 成員變量 是常量 默認(rèn)修飾 public static final 成員方法 都是抽象方法 都有默認(rèn)修飾 public abstract 構(gòu)造方法 沒有構(gòu)造方法 C 抽象類中定義的是繼承體系中的共性功能 接口中定義的是繼承體系中的擴(kuò)展功能 D 抽象類被繼承是 is a 關(guān)系 xx 是 yy 的一種 接口被實(shí)現(xiàn)是 like a 關(guān)系 xx 像 yy 的一種 21 多態(tài) 1 同一個(gè)對(duì)象 在程序不同時(shí)刻的多種運(yùn)行狀態(tài) 舉例 動(dòng)物 狗是狗 狗是動(dòng)物 水 氣態(tài) 液態(tài) 固態(tài) 2 多態(tài)前提 A 存在著繼承或者實(shí)現(xiàn)關(guān)系 B 有方法的重寫 C 父類 接口 引用指向子類 實(shí)現(xiàn) 對(duì)象 3 多態(tài)的好處和弊端 好處 多態(tài)的存在提高了程序的擴(kuò)展性和后期可維護(hù)性 弊端 雖然可以預(yù)先使用 但是只能訪問父類中已有的功能 運(yùn)行的是后期子類 的功能內(nèi)容 不能預(yù)先使用子類中定義的特有功能 4 多態(tài)中對(duì)象調(diào)用成員的特點(diǎn) Fu f new Zi A 成員變量 編譯看左邊 運(yùn)行看左邊 B 成員方法 編譯看左邊 運(yùn)行看右邊 C 靜態(tài)方法 編譯看左邊 運(yùn)行看左邊 5 多態(tài)的思想 指揮同一批對(duì)象做事情 舉例 帶兵打仗 下課等 22 instanceof 關(guān)鍵字 A 用于判斷某個(gè)對(duì)象是否是某種類型 B 格式 對(duì)象名 instanceof 子類 實(shí)現(xiàn) 名 23 Object 類 1 是所有類的根類 超類 java 中提供的類以及我們自定義的類都直接或者間接的繼承自 Object 類 2 Object 類中的方法 A void finalize 當(dāng)垃圾回收器確定不存在對(duì)該對(duì)象的更多引用時(shí) 由對(duì)象的垃圾回收器調(diào)用此 方法 B Class getClass 獲取對(duì)象的字節(jié)碼文件的描述類 后面再講反射的時(shí)候還會(huì)在說這個(gè)類 String name s getClass getName C int hashCode 獲取對(duì)象的哈希值 其實(shí)就是對(duì)象的內(nèi)存地址值十進(jìn)制表示 D String toString 返回對(duì)象的字符串表示 表示格式 getClass getName Integer toHexString hashCode 一般我們輸出對(duì)象名的時(shí)候 其實(shí)底層調(diào)用的就是該對(duì)象的 toString 方法 這種返回沒有意義 所以 我們會(huì)重寫這個(gè)方法 顯示類的成員變量信息 E boolean equals Object obj 用于比較兩個(gè)對(duì)象的地址值是否相同 我們獲取對(duì)象后 比較它的地址值意義不大 所以也會(huì)對(duì)這個(gè)方法進(jìn)行重寫 重寫要完成什么功能 是根據(jù)需求定的 3 和 equals 的用法 A 怎么用 可以用于比較基本數(shù)據(jù)類型 比較的就是基本數(shù)據(jù)類型的值是否相等 可以用于比較引用數(shù)據(jù)類型 比較的是對(duì)象的地址值是否相等 B equals 怎么用 equals 只能用于比較引用數(shù)據(jù)類型的 Object 提供的 equals 是用于比較對(duì)象地址值是否相同 自定義類中 如果重寫了 equals 方法 那么就是按照你自己的需求來比較 的 24 package 關(guān)鍵字 1 包 其實(shí)就是文件夾 用于區(qū)分不同包下相同的類名 2 好處 A 對(duì)類文件進(jìn)行分類管理 B 給類提供了多層命名空間 aaa Demo bbb Demo C 寫在程序文件的第一行 D 包也是一種封裝形式 25 import 關(guān)鍵字 1 導(dǎo)入包的關(guān)鍵字 2 格式 import 包名 3 注意 A 一個(gè)程序文件中只有一個(gè) package 可以有多個(gè) import B 用來導(dǎo)包中的類 不導(dǎo)入包中的包 C 通常寫 import mypack Demo 明確自己使用的類 4 關(guān)鍵字的順序 類 包 導(dǎo)包這些關(guān)鍵的順序 包 到包 類 26 不同修飾符可以修飾哪些內(nèi)容 本類中同一個(gè)包中 不同包中的子類中 不同包中 privateOK 默認(rèn)OK Ok protected OK Ok OK publicOK Ok OK Ok 類構(gòu)造方法成員變量成員方法 privateOKOKOK 默認(rèn)Ok OkOkOK protectedOKOKOk public OkOkOKOK staticOKOk finalOkOKOK abstractOkOK 一般格式 成員變量 權(quán)限修飾符 static final 數(shù)據(jù)類型 成員變量名 public static final int NUM 10 成員方法 權(quán)限修飾符 static final abstract 返回類型 方法名 27 內(nèi)部類 次重點(diǎn) 1 把一個(gè)類定義在某個(gè)類中的 這個(gè)類就被稱為內(nèi)部類 內(nèi)置類 嵌套類 2 訪問特點(diǎn) A 內(nèi)部類可以直接訪問外部類中的成員 因?yàn)閮?nèi)部類持有外部類的引用 格式為 外部類名 this B 外部類要想訪問內(nèi)部類的成員 必須創(chuàng)建對(duì)象訪問 3 內(nèi)部類的訪問格式 A 當(dāng)內(nèi)部類定義在外部類的成員位置 而且非私有 則可以在其他外部類中直接 建立內(nèi)部類對(duì)象 格式 外部類名 內(nèi)部類名 變量名 new 外部類對(duì)象 內(nèi)部類對(duì)象 如 Outer Inner in new Outer new Inner B 當(dāng)內(nèi)部類在外部類成員位置 且被 static 修飾時(shí) 外部其他類可直接訪問靜態(tài)內(nèi)部類的非靜態(tài)成員 格式 new 外部類名 內(nèi)部類名 內(nèi)部類成員 如 new Outer Inner function 外部其他類可直接訪問靜態(tài)內(nèi)部類的靜態(tài)成員 格式 new 外部類名 內(nèi)部類名 內(nèi)部類成員 如 new Outer Inner function 4 什么使用時(shí)候內(nèi)部類呢 假如有 A 類和 B 類 A 類想直接訪問 B 類的成員 B 類訪問 A 類成員的時(shí)候 需要?jiǎng)?chuàng)建 A 類對(duì)象進(jìn)行訪問 這個(gè)時(shí)候 就可以把 A 類定義為 B 類的內(nèi)部類 5 內(nèi)部類的位置 A 成員位置 可以被 private 修飾 Body Heart 可以被 static 修飾 它訪問的外部類的成員必須是靜態(tài)的 B 局部位置 可以直接訪問外部類中的成員 因?yàn)檫€持有外部類的持用 也可以直接訪問局部成員 但是局部成員要用 final 修飾 注意 局部內(nèi)部類不能用 private 和 static 修飾 6 通過 class 文件我們就可以區(qū)分是否帶有內(nèi)部類 以及內(nèi)部類的位置 Outer Inner 成員內(nèi)部類 Outer 1Inner 局部內(nèi)部類 28 匿名內(nèi)部類 局部內(nèi)部類的簡(jiǎn)寫 重點(diǎn) 1 前提 繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口 注意不要弄混匿名內(nèi)部類的前提和多態(tài)的前提 2 格式 new 父類名或者接口名 重寫父類方法或者實(shí)現(xiàn)接口中的方法 也可以自定義其他方法 3 什么時(shí)候定義匿名內(nèi)部類 匿名內(nèi)部類只是為了簡(jiǎn)化書寫 匿名內(nèi)部類有局限 通常定義匿名內(nèi)部類時(shí) 該類方法不超過 3 個(gè) 4 匿名內(nèi)部類的好處和弊端 好處 簡(jiǎn)化代碼書寫 弊端 不能直接調(diào)用自己的特有方法 不能執(zhí)行強(qiáng)轉(zhuǎn)換動(dòng)作 如果該類里面方法較多 不允許使用匿名內(nèi)部類 29 模板設(shè)計(jì)模式 在定義功能時(shí) 功能的一部分是確定的 有一部分是不確定的 而且確定的部分在使 用不確定的部分 可將不確定的部分暴露出去 由該類的子類去完成 如 求一段程序的運(yùn)行時(shí)間例子 30 異常 1 程序運(yùn)行過程中的不正?,F(xiàn)象就叫異常 2 導(dǎo)致程序運(yùn)行不正常的現(xiàn)象有很多 所以 就有很多的異常對(duì)象 而這些異常對(duì)象存在著共性的內(nèi)容 所以 可以不斷的進(jìn)行抽取 最終形成了異常 的體系結(jié)構(gòu) 異常體系的根類是 Throwable Throwable Error 重大的問題 我們處理不了 也不需要編寫代碼處理 比如說內(nèi)存溢出 Exception 一般性的錯(cuò)誤 是需要我們編寫代碼進(jìn)行處理的 RuntimeException 運(yùn)行時(shí)異常 這個(gè)我們也不需要處理 其實(shí)就是為了讓他在運(yùn)行時(shí)出問題 然后我們回來修 改代碼 3 異常的分類 異常有兩種 編譯時(shí)被檢測(cè)異常 該異常在編譯時(shí) 如果沒有處理 沒有拋也沒有 try 編譯失敗 該異常被標(biāo)識(shí) 代表這可以被處理 運(yùn)行時(shí)異常 編譯時(shí)不檢測(cè) 在編譯時(shí) 不需要處理 編譯器不檢查 該異常的發(fā)生 建議不處理 讓程序停止 需要對(duì)代碼進(jìn)行修正 4 異常體系的特點(diǎn) 異常體系中的所有類及其子類對(duì)象都具備可拋性 也就是說可以被 throw 和 throws 關(guān)鍵字所操作 5 main 方法是如何處理異常的 A 在 main 里面編寫代碼進(jìn)行處理 B 交給 jvm 自己進(jìn)行處理 采用的是 jvm 的默認(rèn)處理方式 其實(shí)就是相當(dāng)于調(diào)用了異常對(duì)象的 printStackTrace 方法 6 Throwable 類的學(xué)習(xí) getMessage 獲取異常信息 返回字符串 toString 獲取異常類名和異常信息 返回字符串 printStackTrace 獲取異常類名和異常信息 以及異常出現(xiàn)在程序中的位置 返回 值 void 7 異常的處理 A try catch finally 基本格式 try 可能出現(xiàn)異常的代碼 catch 異常對(duì)象 異常處理代碼 finally 釋放資源 變形格式 try catch try catch catch try catch catch finally 多個(gè)異常同時(shí)被捕獲的時(shí)候 記住一個(gè)原則 先逮小的 再逮大的 finally 永遠(yuǎn)被執(zhí)行 除非退出 jvm System exit 0 面試題 2 個(gè) final finally finalize 區(qū)別 final 是最終的意思 它可以用于修飾類 成員變量 成員方法 它修飾的類不能被繼承 它修飾的變量時(shí)常量 它修飾的方法不能被重寫 finally 是異常處理里面的關(guān)鍵字 它其中的代碼永遠(yuǎn)被執(zhí)行 特殊情況 在執(zhí)行它之前 jvm 退出 System exit 0 finalize 是 Object 類中的一個(gè)方法 它是于垃圾回收器調(diào)用的方式 假如 catch 中有 return 語句 finally 里中的代碼會(huì)執(zhí)行嗎 是在 return 前 還是在 return 后呢 會(huì) 在 return 前執(zhí)行 finally 里面的代碼 8 Exception 和 RuntimeException 的區(qū)別 A Exception 一般性的錯(cuò)誤 是需要我們編寫代碼進(jìn)行處理的 B RuntimeException 運(yùn)行時(shí)異常 這個(gè)我們也不需要處理 其實(shí)就是為了讓他在運(yùn)行時(shí)出問題 然后我們回來修改代碼 在用 throws 拋出一個(gè)的時(shí)候 如果這個(gè)異常是屬于 RuntimeException 的體系 的時(shí)候 我們?cè)谡{(diào)用的地方可以不用處理 RuntimeException 和 RuntimeException 的 子類 在用 throws 拋出一個(gè)的時(shí)候 如果這個(gè)異常是屬于 Exception 的體系的時(shí)候 我們?cè)谡{(diào)用的地方必須進(jìn)行處理或者繼續(xù)拋出 9 自定義異常 定義類繼承 Exception 或者 RuntimeException 1 為了讓該自定義類具備可拋性 2 讓該類具備操作異常的共性方法 class MyExcepiton extends Exception MyExcepiton MyExcepiton String message super message class MyException extends RuntimeException MyExcepiton MyExcepiton String message super message 10 throws 和 throw 的區(qū)別 A 有 throws 的時(shí)候可以沒有 throw 有 throw 的時(shí)候 如果 throw 拋的異常是 Exception 體系 那么必須有 throws 在方法上聲明 B throws 用于方法的聲明上 其后跟的是異常類名 后面可以跟多個(gè)異常類 之間用逗號(hào)隔開 throw 用于方法體中 其后跟的是一個(gè)異常對(duì)象名 三 多線程 1 進(jìn)程和線程 進(jìn)程 正在進(jìn)行的程序 每一個(gè)進(jìn)程執(zhí)行都有一個(gè)執(zhí)行順序 該順序是一個(gè)執(zhí)行路徑 或者叫一個(gè)控制單元 線程 進(jìn)程內(nèi)部的一條執(zhí)行路徑或者一個(gè)控制單元 兩者的區(qū)別 一個(gè)進(jìn)程至少有一個(gè)線程 進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元 而多個(gè)線程共享內(nèi)存 2 jvm 多線程的啟動(dòng)是多線程嗎 java 的虛擬機(jī) jvm 啟動(dòng)的是單線程 就有發(fā)生內(nèi)存泄露的可能 而我們使用 java 程序 沒出現(xiàn)這樣的問題 也就是 jvm 啟動(dòng)至少有兩個(gè)線程 一個(gè)執(zhí)行 java 程序 一個(gè)執(zhí)行垃圾回收 所以是多 線程 2 多線程的優(yōu)勢(shì) 解決了多部分同時(shí)運(yùn)行的問題 提高效率 3 線程的弊端 線程太多會(huì)導(dǎo)致效率的降低 因?yàn)榫€程的執(zhí)行依靠的是 CPU 的來回切換 4 什么叫多線程 一個(gè)進(jìn)程中有多個(gè)線程 稱為多線程 5 實(shí)現(xiàn)多線程的方法 實(shí)現(xiàn)多線程可以通過繼承 Thread 類和實(shí)現(xiàn) Runnable 接口 1 繼承 Thread 定義一個(gè)類繼承 Thread 類 復(fù)寫 Thread 類中的 public void run 方法 將線程的任務(wù)代碼封裝到 run 方法中 直接創(chuàng)建 Thread 的子類對(duì)象 創(chuàng)建線程 調(diào)用 start 方法 開啟線程 調(diào)用線程的任務(wù) run 方法 另外可以通過 Thread 的 getName 獲取線程的名稱 2 實(shí)現(xiàn) Runnable 接口 定義一個(gè)類 實(shí)現(xiàn) Runnable 接口 覆蓋接口的 public void run 的方法 將線程的任務(wù)代碼封裝到 run 方法中 創(chuàng)建 Runnable 接口的子類對(duì)象 將 Runnabl 接口的子類對(duì)象作為參數(shù)傳遞給 Thread 類的構(gòu)造函數(shù) 創(chuàng)建 Thread 類 對(duì)象 原因 線程的任務(wù)都封裝在 Runnable 接口子類對(duì)象的 run 方 法中 所以要在線程對(duì)象創(chuàng)建時(shí)就必須明確要運(yùn)行的任務(wù) 調(diào)用 start 方法 啟動(dòng)線程 兩種方法區(qū)別 1 實(shí)現(xiàn) Runnable 接口避免了單繼承的局限性 2 繼承 Thread 類線程代碼存放在 Thread 子類的 run 方法中 實(shí)現(xiàn) Runnable 接口線程代碼存放在接口的子類的 run 方法中 在定義線程時(shí) 建議使用實(shí)現(xiàn) Runnable 接口 因?yàn)閹缀跛卸嗑€程都可以使 用這種方式實(shí)現(xiàn) 6 創(chuàng)建線程是為什么要復(fù)寫 run 方法 Thread 類用于描述線程 Thread 類定義了一個(gè)功能 用于存儲(chǔ)線程要運(yùn)行的代碼 該 存儲(chǔ)功能就是 run 方法 7 start 和 run 方法有什么區(qū)別 調(diào)用 start 方法方可啟動(dòng)線程 而 run 方法只是 thread 的一個(gè)普通方法 調(diào)用 run 方法 不能實(shí)現(xiàn)多線程 Start 方法 start 方法用來啟動(dòng)線程 實(shí)現(xiàn)了多線程運(yùn)行 這時(shí)無需等待 run 方法體代碼執(zhí)行完畢 而直接繼續(xù)執(zhí)行下面的 代碼 通過調(diào)用 Thread 類的 start 方法來啟動(dòng)一個(gè)線程 這時(shí)此線程處于就緒 可運(yùn) 行 狀態(tài) 并沒有運(yùn)行 一旦得到 cpu 時(shí)間片 執(zhí)行權(quán) 就開始執(zhí)行 run 方法 這里方法 run 稱為線程體 它包含了要執(zhí)行的這個(gè)線程的內(nèi)容 Run 方法運(yùn)行結(jié)束 此線程隨即終止 Run 方法 run 方法只是 Thread 類的一個(gè)普通方法 如果直接調(diào)用 Run 方法 程序中依然只有 主線程這一個(gè)線程 其程序執(zhí)行路徑還是只有一條 還是要等待 run 方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行 下面的代碼 這樣就沒有達(dá)到多線程的目的 8 線程的幾種狀態(tài) 新建 new 一個(gè) Thread 對(duì)象或者其子類對(duì)象就是創(chuàng)建一個(gè)線程 當(dāng)一個(gè)線程對(duì)象被創(chuàng) 建 但是沒有開啟 這個(gè)時(shí)候 只是對(duì)象線程對(duì)象開辟了內(nèi)存空間和初始化數(shù)據(jù) 就緒 新建的對(duì)象調(diào)用 start 方法 就開啟了線程 線程就到了就緒狀態(tài) 在這個(gè)狀態(tài)的線程對(duì)象 具有執(zhí)行資格 沒有執(zhí)行權(quán) 運(yùn)行 當(dāng)線程對(duì)象獲取到了 CPU 的資源 在這個(gè)狀態(tài)的線程對(duì)象 既有執(zhí)行資格 也有執(zhí)行權(quán) 凍結(jié) 運(yùn)行過程中的線程由于某些原因 比如 wait sleep 釋放了執(zhí)行資格和執(zhí)行權(quán) 當(dāng)然 他們可以回到運(yùn)行狀態(tài) 只不過 不是直接回到 而是先回到就緒狀態(tài) 死亡 當(dāng)線程對(duì)象調(diào)用的 run 方法結(jié)束 或者直接調(diào)用 stop 方法 就讓線程對(duì)象死亡 在內(nèi)存中變成了垃圾 9 sleep 和 wait 的區(qū)別 1 這兩個(gè)方法來自不同的類 sleep 來自 Thread 類 和 wait 來自 Object 類 2 sleep 是 Thread 的靜態(tài)類方法 誰調(diào)用的誰去睡覺 即使在 a 線程里調(diào)用了 b 的 sleep 方法 實(shí)際上還是 a 去睡覺 要讓 b 線程睡覺要在 b 的代碼中調(diào)用 sleep 而 wait 是 Object 類的非靜態(tài)方法 3 sleep 釋放資源不釋放鎖 而 wait 釋放資源釋放鎖 4 使用范圍 wait notify 和 notifyAll 只能在同步控制方法或者同步控制塊里面使用 而 sleep 可以在任何地方使用 10 多線程安全問題 1 原因 當(dāng)程序的多條語句在操作線程共享數(shù)據(jù)時(shí) 如買票例子中的票就是共享資源 由于線程的隨機(jī)性導(dǎo)致 一個(gè)線程對(duì)多條語句 執(zhí)行了一部分還沒執(zhí)行完 另一個(gè)線程搶奪到 cpu 執(zhí) 行權(quán)參與進(jìn)來執(zhí)行 此時(shí)就導(dǎo)致共享數(shù)據(jù)發(fā)生錯(cuò)誤 比如買票例子中打印重票和錯(cuò)票的情況 2 解決方法 對(duì)多條操作共享數(shù)據(jù)的語句進(jìn)行同步 一個(gè)線程在執(zhí)行過程中其他線程不 可以參與進(jìn)來 11 Java 中多線程同步是什么 同步是用來解決多線程的安全問題的 在多線程中 同步能控制對(duì)共享數(shù)據(jù)的訪問 如果沒有同步 當(dāng)一個(gè)線程在 修改一個(gè)共享數(shù)據(jù)時(shí) 而另外一個(gè)線程正在使用或者更新同一個(gè)共享數(shù)據(jù) 這樣容易 導(dǎo)致程序出現(xiàn)錯(cuò)誤的結(jié)果 12 什么是鎖 鎖的作用是什么 鎖就是對(duì)象 鎖的作用是保證線程同步 解決線程安全問題 持有鎖的線程可以在同步中執(zhí)行 沒有鎖的線程即使獲得 cpu 執(zhí)行權(quán) 也進(jìn)不去 13 同步的前提 1 必須保證有兩個(gè)以上線程 2 必須是多個(gè)線程使用同一個(gè)鎖 即多條語句在操作線程共享數(shù)據(jù) 3 必須保證同步中只有一個(gè)線程在運(yùn)行 14 同步的好處和弊端 好處 同步解決了多線程的安全問題 弊端 多線程都需要判斷鎖 比較消耗資源 15 同步的兩種表現(xiàn)形式 1 同步代碼塊 可以指定需要獲取哪個(gè)對(duì)象的同步鎖 使用 synchronized 的代碼塊同樣需要鎖 但他 的鎖可以是任意對(duì)象 考慮到安全問題 一般還是使用同一個(gè)對(duì)象 相對(duì)來說效率較高 注意 雖然同步代碼快的鎖可以使任何對(duì)象 但是在進(jìn)行多線程通信使用同步代碼快 時(shí) 必須保證同步代碼快的鎖的對(duì)象和 否則會(huì)報(bào)錯(cuò) 同步函數(shù)的鎖是 this 也要保證同步函數(shù)的鎖的對(duì)象和調(diào)用 wait notify 和 notifyAll 的對(duì)象是 同一個(gè)對(duì)象 也就是都是 this 鎖代表的對(duì)象 格式 synchronized 對(duì)象 需同步的代碼 2 同步函數(shù) 同步方法是指進(jìn)入該方法時(shí)需要獲取 this 對(duì)象的同步鎖 在方法上使用 synchronized 關(guān)鍵字 使用 this 對(duì)象作為鎖 也就是使用了當(dāng)前對(duì)象 因?yàn)殒i住了方法 所以相對(duì)于代 碼塊來說效率相對(duì)較低 注 靜態(tài)同步函數(shù)的鎖是該方法所在的類的字節(jié)碼文件對(duì)象 即類名 class 文件 格式 修飾詞 synchronized 返回值類型 函數(shù)名 參數(shù)列表 需同步的代碼 在 jdk1 5 后 用 lock 鎖取代了 synchronized 個(gè)人理解也就是對(duì)同步代碼塊做了修改 并沒有提供對(duì)同步方法的修改 主要還是效率問題吧 16 多線程的單例設(shè)計(jì)模式 保證某個(gè)類中內(nèi)存中只有一個(gè)對(duì)象 1 餓漢式 class Single private Single 將構(gòu)造函數(shù)私有化 不讓別的類建立該類對(duì)象 private static final Single s new Single 自己建立一個(gè)對(duì)象 public static Single getInstance 提供一個(gè)公共訪問方式 return s 2 懶漢式 class Single private Single private static Single s public static Single getInstance if s null s new Single return s 餓漢式和懶漢式的區(qū)別 餓漢式是類一加載進(jìn)內(nèi)存就創(chuàng)建好了對(duì)象 懶漢式則是類加載進(jìn)內(nèi)存的時(shí)候 對(duì)象還沒有存在 只有調(diào)用了 getInstance 方法 時(shí) 對(duì)象才開始創(chuàng)建 懶漢式是延遲加載 如果多個(gè)線程同時(shí)操作懶漢式時(shí)就有可能出現(xiàn)線程安全問題 解決線程安全問題 可以加同步來解決 但是加了同步之后 每一次都要比較鎖 效率就變慢了 所以可以加雙重判斷來提高程序效率 如將上述懶漢式的 Instance 函數(shù)改成同步 public static Single getInstance if s null synchronized Single class if s null s new Single return s 17 死鎖 兩個(gè)線程對(duì)兩個(gè)同步對(duì)象具有循環(huán)依賴時(shí) 就會(huì)發(fā)生死鎖 即同步嵌套同步 而鎖卻 不同 18 wait sleep notify notifyAll wait 使一個(gè)線程處于等待狀態(tài) 并且釋放所持有的對(duì)象的 lock sleep 使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài) 是一個(gè)靜態(tài)方法 調(diào)用此方法要捕捉 InterruptedException 異常 notify 喚醒一個(gè)處于等待狀態(tài)的線程 注意的是在調(diào)用此方法的時(shí)候 并不能確切的 喚醒某一個(gè)等待狀態(tài)的線程 而是由 JVM 確定喚醒哪個(gè)線程 一般是最先開始等待的線程 而且不是按優(yōu)先 級(jí) Allnotity 喚醒所有處入等待狀態(tài)的線程 注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖 而是讓它們競(jìng)爭(zhēng) 18 為什么 wait notify notifyAll 這些用來操作線程的方法定義在 Object 類中 1 這些方法只存在于同步中 2 使用這些方法時(shí)必須要指定所屬的鎖 即被哪個(gè)鎖調(diào)用這些方法 3 而鎖可以是任意對(duì)象 所以任意對(duì)象調(diào)用的方法就定義在 Object 中 19 多線程間通訊 多線程間通訊就是多個(gè)線程在操作同一資源 但是操作的動(dòng)作不同 1 為什么要通信 多線程并發(fā)執(zhí)行的時(shí)候 如果需要指定線程等待或者喚醒指定線程 那么就需要通 信 比如生產(chǎn)者消費(fèi)者的問題 生產(chǎn)一個(gè)消費(fèi)一個(gè) 生產(chǎn)的時(shí)候需要負(fù)責(zé)消費(fèi)的進(jìn)程等待 生產(chǎn)一個(gè)后完成后需要喚 醒負(fù)責(zé)消費(fèi)的線程 同時(shí)讓自己處于等待 消費(fèi)的時(shí)候負(fù)責(zé)消費(fèi)的線程被喚醒 消費(fèi)完生產(chǎn)的產(chǎn)品后 又將等待的生產(chǎn)線程喚醒 然后使自己線程處于等待 這樣來回通信 以達(dá)到生產(chǎn)一個(gè)消費(fèi)一個(gè)的目的 2 怎么通信 在同步代碼塊中 使用鎖對(duì)象的 wait 方法可以讓當(dāng)前線程等待 直到有其他線程 喚醒為止 使用鎖對(duì)象的 notify 方法可以喚醒一個(gè)等待的線程 或者 notifyAll 喚醒所有等待 的線程 多線程間通信用 sleep 很難實(shí)現(xiàn) 睡眠時(shí)間很難把握 20 Lock 和 Condition 實(shí)現(xiàn)提供比 synchronized 方法和語句可獲得的更廣泛的鎖的操作 可支持多個(gè)相關(guān)的 Condition 對(duì)象 Lock 是個(gè)接口 鎖是控制多個(gè)線程對(duì)共享數(shù)據(jù)進(jìn)行訪問的工具 JDK1 5 中提供了多線程升級(jí)的解決方案 將同步 synchonized 替換成了顯示的 Lock 操作 將 Object 中的 wait notify notifyAll 替換成了 Condition 對(duì)象 該對(duì)象可以 Lock 鎖進(jìn)行獲取 Lock 的方法摘要 void lock 獲取鎖 Condition newCondition 返回綁定到此 Lock 實(shí)例的新 Condition 實(shí)例 void unlock 釋放鎖 Condition 方法摘要 void await 造成當(dāng)前線程在接到信號(hào)或被中斷之前一直處于等待狀態(tài) void signal 喚醒一個(gè)等待線程 void signalAll 喚醒所有等待線程 21 停止線程 stop 方法已經(jīng)過時(shí) 如何停止線程 停止線程的方法只有一種 就是 run 方法結(jié)束 如何讓 run 方法結(jié)束呢 開啟多線程運(yùn)行 運(yùn)行代碼通常是循環(huán)體 只要控制住循環(huán) 就可以讓 run 方法 結(jié)束 也就是結(jié)束線程 特殊情況 當(dāng)線程屬于凍結(jié)狀態(tài) 就不會(huì)讀取循環(huán)控制標(biāo)記 則線程就不會(huì)結(jié)束 為解決該特殊情況 可引入 Thread 類中的 Interrupt 方法結(jié)束線程的凍結(jié)狀態(tài) 當(dāng)沒有指定的方式讓凍結(jié)線程恢復(fù)到運(yùn)行狀態(tài)時(shí) 需要對(duì)凍結(jié)進(jìn)行清除 強(qiáng)制讓 線程恢復(fù)到運(yùn)行狀態(tài) 22 interrupt void interrupt 中斷線程 中斷狀態(tài)將被清除 它還將收到一個(gè) InterruptedException 22 守護(hù)線程 后臺(tái)線程 setDaemon boolean on 將該線程標(biāo)記為守護(hù)線程或者用戶線程 當(dāng)主線程結(jié)束 守護(hù)線程自動(dòng)結(jié)束 比如圣斗士星矢里面的守護(hù)雅典娜 在多線程里面主線程就是雅典娜 守護(hù)線程就是圣斗士 主線程結(jié)束了 守護(hù)線程則自動(dòng)結(jié)束 當(dāng)正在運(yùn)行的線程都是守護(hù)線程時(shí) java 虛擬機(jī) jvm 退出 所以該方法必須在啟動(dòng)線 程前調(diào)用 守護(hù)線程的特點(diǎn) 守護(hù)線程開啟后和前臺(tái)線程共同搶奪 cpu 的執(zhí)行權(quán) 開啟 運(yùn)行兩者都沒區(qū)別 但結(jié)束時(shí)有區(qū)別 當(dāng)所有前臺(tái)線程都結(jié)束后 守護(hù)線程會(huì)自動(dòng)結(jié)束 23 多線程 join 方法 void join 等待該線程終止 void join long millis 等待該線程終止的時(shí)間最長為 millis 毫秒 throws InterruptedException 特點(diǎn) 當(dāng) A 線程執(zhí)行到 B 線程的 join 方法時(shí) A 就會(huì)等待 B 線程都執(zhí)行完 A 才會(huì) 執(zhí)行 作用 join 可以用來臨時(shí)加入線程執(zhí)行 24 多線程優(yōu)先級(jí) yield 方法 yield 暫停當(dāng)前正在執(zhí)行的線程對(duì)象 并執(zhí)行其他線程 setPriority int newPriority 更改線程優(yōu)先級(jí) int getPriority 返回線程的優(yōu)先級(jí) String toString 返回該線程的字符串表示形式 包括線程名稱 優(yōu)先級(jí)和線程組 1 MAX PRIORITY 最高優(yōu)先級(jí) 10 級(jí) 1 Min PRIORITY 最低優(yōu)先級(jí) 1 級(jí) 1 Morm PRIORITY 默認(rèn)優(yōu)先級(jí) 5 級(jí) 25 什么是 ThreadLocal 類 怎么使用它 ThreadLocal 類提供了線程局部 thread local 變量 是一個(gè)線程級(jí)別的局部變量 并 非 本地線程 ThreadLocal 為每個(gè)使用該變量的線程 提供了一個(gè)獨(dú)立的變量副本 每個(gè)線程修改副 本時(shí)不影響其它線程對(duì)象的副本 下面是線程局部變量 ThreadLocal variables 的關(guān)鍵點(diǎn) 一個(gè)線程局部變量 ThreadLocal variables 為每個(gè)線程方便地提供了一個(gè)單獨(dú)的變 量 ThreadLocal 實(shí)例通常作為靜態(tài)的私有的 private static 字段出現(xiàn)在一個(gè)類中 這個(gè) 類用來關(guān)聯(lián)一個(gè)線程 當(dāng)多個(gè)線程訪問 ThreadLocal 實(shí)例時(shí) 每個(gè)線程維護(hù) ThreadLocal 提供的獨(dú)立的 變量副本 常用的使用可在 DAO 模式中見到 當(dāng) DAO 類作為一個(gè)單例類時(shí) 數(shù)據(jù)庫鏈接 connection 被每一個(gè)線程獨(dú)立的維護(hù) 互不影響 基于線程的單例 26 什么時(shí)候拋出 InvalidMonitorStateException 異常 為什么 調(diào)用 wait notify notifyAll 中的任何一個(gè)方法時(shí) 如果當(dāng)前線程沒有獲得該對(duì)象 的鎖 那么就會(huì)拋出 IllegalMonitorStateException 的異常 也就是說程序在沒有執(zhí)行對(duì)象的任何同步塊或者同步方法時(shí) 仍然嘗試調(diào)用 wait notify notifyAll 時(shí) 由于該異常是 RuntimeExcpetion 的子類 所以該異常不一定要捕獲 盡管你可以捕獲只要你愿意 作為 RuntimeException 此類異常不會(huì)在 wait notify notifyAll 的方法簽名提及 27 在靜態(tài)方法上使用同步時(shí)會(huì)發(fā)生什么事 同步靜態(tài)方法時(shí)會(huì)獲取該類的 Class 對(duì)象 所以當(dāng)一個(gè)線程進(jìn)入同步的靜態(tài)方法中 時(shí) 線程監(jiān)視器獲取類本身的對(duì)象鎖 其它線程不能進(jìn)入這個(gè)類的任何靜態(tài)同步方法 它不像實(shí)例方法 因?yàn)槎鄠€(gè)線程可以同時(shí)訪問不同實(shí)例同步實(shí)例方法 28 當(dāng)一個(gè)同步方法已經(jīng)執(zhí)行 線程能夠調(diào)用對(duì)象上的非同步實(shí)例方法嗎 可以 一個(gè)非同步方法總是可以被調(diào)用而不會(huì)有任何問題 實(shí)際上 Java 沒有為非同步方法做任何檢查 鎖對(duì)象僅僅在同步方法或者同步代碼塊 中檢查 如果一個(gè)方法沒有聲明為同步 即使你在使用共享數(shù)據(jù) Java 照樣會(huì)調(diào)用 而不會(huì)做檢 查是否安全 所以在這種情況下要特別小心 一個(gè)方法是否聲明為同步取決于臨界區(qū)訪問 critial section access 如果方法不訪問臨界區(qū) 共享資源或者數(shù)據(jù)結(jié)構(gòu) 就沒必要聲明為同步的 29 在一個(gè)對(duì)象上兩個(gè)線程可以調(diào)用兩個(gè)不同的同步實(shí)例方法嗎 不能 因?yàn)橐粋€(gè)對(duì)象已經(jīng)同步了實(shí)例方法 線程獲取了對(duì)象的對(duì)象鎖 所以只有執(zhí)行完該方法釋放對(duì)象鎖后才能執(zhí)行其它同步方法 30 什么是線程餓死 什么是活鎖 線程餓死和活鎖雖然不像死鎖一樣是常見的問題 但是對(duì)于并發(fā)編程的設(shè)計(jì)者來說就 像一次邂逅一樣 當(dāng)所有線程阻塞 或者由于需要的資源無效而不能處理 不存在非阻塞線程使資源可 用 JavaAPI 中線程活鎖可能發(fā)生在以下情形 當(dāng)所有線程在程序中執(zhí)行 Object wait 0 參數(shù)為 0 的 wait 方法 程序?qū)l(fā)生活鎖直到在相應(yīng)的對(duì)象上有線程調(diào)用 Object notify 或者 Object notifyAll 當(dāng)所有線程卡在無限循環(huán)中 四 集合框架

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論