Java開發經驗總結

只要刪繁、捋清脈絡,才能掌握本質!只有創新才有價值,保持創新、保持學習!
計劃:UNIAPP+SPRINGBOOT學習、SPRINGBOOT+VUE新版學習、頁面展示學習、PYTHON。
*******************************************************************************************************************************************
第一章:Java 程序設計概述
*******************************************************************************************************************************************
1、關鍵術語:
1 ) 簡單性:里沒有頭文件、 指針運算(甚至指針語法)、結構、 聯合、 操作符重載、 虛基類等。
2 ) 面向對象: 一個“ 面向對象的” 木匠始終關注的是所制作的椅子, 第二位才是所使用的工具;一個“ 非面向對象的” 木匠首先考慮的是所用的工具。
3 ) 分布式:Java 有一個豐富的例程庫,用于處理像 HTTP 和 FTP 之類的 TCP/IP 協議。Java 應用程序能夠通過 URL 打開和訪問網絡上的對象,其便捷程度就好像
訪問本地文件一樣。
4 ) 健壯性:Java 編譯器能夠檢測許多在其他語言中僅在運行時才能夠檢測出來的問題。
5 ) 安全性:使用 Java 可以構建防病毒、 防篡改的系統。
6 ) 體系結構中立:精心設計的字節碼不僅可以很容易地在任何機器上解釋執行,而且還可以動態地翻譯成本地機器代碼。
7 ) 可移植性:與 C 和 C++ 不同,Java 規范中沒有“ 依賴具體實現” 的地方基本教據類型的大小以及有關運算都做了明確的說明。你可以處理文件、 正則表達式、 XML、 日期和時間、 數據庫、 網絡連接、 線程等,而不用操心底層操作系統。不僅程序是可移植的,Java API 往往也比原生 API 質量更高。
8 ) 解釋型:Java 解釋器可以在任何移植了解釋器的機器上執行 Java 字節碼。
9 ) 高性能:字節碼可以(在運行時刻)動態地翻譯成對應運行這個應用的特定 CPU 的機器碼。
10 ) 多線程:Java 在當時很超前。它是第一個支持并發程序設計的主流語言。確保用戶界面不會“ 凍住”。
11 ) 動態性:當需要將某些代碼添加到正在運行的程序中時, 動態性將是一個非常重要的特性。一個很好的例子是: 從 Internet 下載代碼,然后在瀏覽器上運行。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2、applet 與 Internet
1)用戶從 Internet 下載 Java 字節碼, 并在自己的機器上運行。在網頁中運行的 Java 程序稱為 applet。要使用 applet, 需要啟用 Java 的 Web 瀏覽器執行字節碼。不需要安裝任何軟件。任何時候只要訪問包含 applet 的網頁都會得到程序的最新版本。后來,Java 遭遇了嚴重的安全問題,瀏覽器和 Java 瀏覽器插件變得限制越來越多。如今,要在瀏覽器中使用 applet, 這不僅需要一定的水平, 而且要付出努力。例如,如果訪問 Jmol 網站,可能會看到一個消息, 警告你要適當地配置瀏覽器允許運行applet。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3、Java發展簡史
1)Java 的歷史要追溯到 1991 年,由 Patrick Naughton 和 James Gosling (一個全能的計算機奇才)帶領的 Sun 公司的工程師小組想要設計一種小型的計算機語言。
2)1996 年年初,Sun 發布了 Java 的第 1 個版本:
3)2014 年 ,Java 8終于發布,在近 20 年中這個版本有了最大的改變。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4、Java 的常見誤解
1)Java 是 HTML 的擴展、使用 XML, 所以不需要 Java、Java 是一種非常容易學習的程序設計語言、JavaScript 是 Java 的簡易版...
*******************************************************************************************************************************************
第二章:Java 程序設計環境
*******************************************************************************************************************************************
1、安 裝 Java 幵發工具包
1)為 Linux 、 Mac OS X、Solaris 和 Windows 提供了 Java 開發工具包( JDK ) 的最新、 最完整的版本。
2)安裝配置 java javac
*******************************************************************************************************************************************
第三章:Java 的基本程序設計結構 ?52頁
*******************************************************************************************************************************************
1、一個簡單的 Java 應用程序
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2、注 釋
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3、數 據 類 型
1)Java 有一個能夠表示任意精度的算術包, 通常稱為“ 大數值”( bignumber )。雖然 被稱為大數值,但它并不是一種新的 Java 類型,而是一個 Java 對象。 本章稍后將會詳細 地介紹它的用法。
2)整型:用于表示沒有小數部分的數值, 它允許是負數。在通常情況下,int 類型最常用。但如果表示星球上的居住人數, 就需要使用 long 類型 了。byte 和 short 類型主要用于特定的應用場合,例如,底層的文件處理或者需要控制占用 存儲空間量的大數組。
3)浮點型:double 表示這種類型的數值精度是 float 類型的兩倍(有人稱之為雙精度數值)。絕大部 分應用程序都采用 double 類型。在很多情況下,float 類型的精度很難滿足需求。
4)char 類型:char 類型原本用于表示單個字符。不過,現在情況已經有所變化。 如今,有些 Unicode 字符可以用一個 char值描述,另外一些 Unicode 字符則需要兩個 char 值。
5)Unicode 和 char 類型:我們強烈建議不要在程序中使用 char 類型,除非確實需要處理 UTF-16 代碼單元。最好 將字符串作為抽象數據類型處理。
6)布爾類型:boolean (布爾)類型有兩個值:false 和 true, 用來判定邏輯條件 整型值和布爾值之間 不能進行相互轉換。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4、變量
1)在 Java 中,每個變量都有一個類型( type)。在聲明變量時,變量的類型位于變量名之前。
2)變量名必須是一個以字母開頭并由字母或數字構成的序列。
3)聲明一個變量之后,必須用賦值語句對變量進行顯式初始化, 千萬不要使用未初始化的變量。
4)常量:在 Java 中, 利用關鍵字 final 指示常量。關鍵字 final 表示這個變量只能被賦值一次。一旦被賦值之后,就不能夠再更改了。習慣上, 常量名使用全大寫。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
5、運 算 符
1)在 Java 中,使用算術運算符 + 、-、 * 、/ 表示加、減、 乘、除運算。 當參與 / 運算的兩個 操作數都是整數時, 表示整數除法;否則, 表示浮點除法。 整數的求余操作(有時稱為取模) 用 % 表示。
2)在 Math類中,包含了各種各樣的數學函數。在編寫不同類別的程序時,可能需要的函 數也不同。 要想計算一個數值的平方根, 可以使用 sqrt 方法。
3)數值類型之間的轉換:經常需要將一種數值類型轉換為另一種數值類型。
4)在必要的時候, int 類型的值將會自動地轉換為 double 類型。但另 一方面,有時也需要將 double 轉換成 int。 在 Java 中, 允許進行這種數值之間的類型轉換。 當然, 有可能會丟失一些信息。在這種情況下,需要通過強制類型轉換( cast) 實現這個操 作。
5)關系和 boolean 運算符
6)括號與預算符級別
7)枚舉的使用
package day;

public class AIMain {
? ? public static void main(String[] args) {
? ? ? ? Color color = Color.GREEN;
? ? ? ? System.out.println(color); // 打印出來就是GREEN 值
? ? }

? ? enum Color {
? ? ? ? RED, GREEN, BLANK, YELLOW
? ? }
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
6、字 符 串
1)String 類的 substring 方法可以從一個較大的字符串提取出一個子串
2)與絕大多數的程序設計語言一樣,Java語言允許使用 + 號連接(拼接)兩個字符串。
3)可以使用 equals 方法檢測兩個字符串是否相等。對于表達式: s.equals(t)
4)空串 "" 是長度為 0 的字符串。String 變量還可以存 放一個特殊的值, 名為 null, 這表示目前沒有任何對象與該變量關聯
5)Java 中的 String類包含了 50 多個方法。令人驚訝的是絕大多數都很有用, 可以設想使 用的頻繁非常高。下面的 API 注釋匯總了一部分最常用的方法。
?boolean startsWith(String prefix ) ?boolean endsWith(String suffix ) 如果字符串以 suffix 開頭或結尾, 則返回 true。 ?int indexOf(String str)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
7、輸入輸出
1)前面已經看到,打印輸出到“ 標準輸出流”(即控制臺窗口)是一件非常容易的事情,只要 調用 System.out.println 即可。然而,讀取“ 標準輸人流” System.in 就沒有那么簡單了。要想通 過控制臺進行輸人,首先需要構造一個 Scanner 對象,并與“ 標準輸人流” System.in 關聯。
2)示例
public class AIMain {
? ? public static void main(String[] args) {
? ? ? ? Scanner scanner = new Scanner(System.in);
? ? ? ? System.out.print("請輸入你的名字:");
? ? ? ? String name = scanner.nextLine();
? ? ? ? System.out.println("你的名字是:" + name);
? ? }
}
3)Scanner讀取文件內容
public class AIMain {
? ? public static void main(String[] args) throws IOException {
? ? ? ? Scanner scanner = new Scanner(Paths.get("src/main/resources/files/1.txt"), "UTF-8");
? ? ? ? while (scanner.hasNext()) {
? ? ? ? ? ? String res = scanner.nextLine();
? ? ? ? ? ? System.out.println(res);
? ? ? ? }
? ? }
}
4)輸出內容到文件中
public class AIMain {
? ? public static void main(String[] args) throws IOException {
? ? ? ? PrintWriter printWriter = new PrintWriter("src/main/resources/files/out.txt", "UTF-8");
? ? ? ? printWriter.println("輸出信息");
? ? ? ? printWriter.flush();
? ? ? ? printWriter.close();
? ? }
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
8、控制流程80頁
1)switch
public class AIMain {
? ? public static void main(String[] args) throws IOException {
? ? ? ? int a = 0;
? ? ? ? switch (a) {
? ? ? ? ? ? case 0:
? ? ? ? ? ? ? ? System.out.println("a=0");
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 1:
? ? ? ? ? ? ? ? System.out.println("a=1");
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? a = 1;
? ? ? ? switch (a) {
? ? ? ? ? ? case 0:
? ? ? ? ? ? ? ? System.out.println("a=0");
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 1:
? ? ? ? ? ? ? ? System.out.println("a=1");
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
2)if else
3)循環 while for
4)中斷控制流程語句 ?條件滿足 break;
與 C++ 不同,Java 還提供了一種帶標簽的 break語句,用于跳出多重嵌套的循環語句。 有時候,在嵌套很深的循環語句中會發生一些不可預料的事情。此時可能更加希望跳到嵌套 的所有循環語句之外。通過添加一些額外的條件判斷實現各層循環的檢測很不方便。 這里有一個示例說明了 break 語句的工作狀態。請注意,標簽必須放在希望跳出的最外 層循環之前, 并且必須緊跟一個冒號。
public class AIMain {
? ? public static void main(String[] args) throws IOException {
? ? ? ? break_tag:
? ? ? ? while (true) {
? ? ? ? ? ? for (int i = 0; i < 10000; i++) {
? ? ? ? ? ? ? ? System.out.println(i);
? ? ? ? ? ? ? ? while (i < 50) {
? ? ? ? ? ? ? ? ? ? int k = 0;
? ? ? ? ? ? ? ? ? ? for (int j = 0; j < 100; j++) {
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("我打印的:" + j);
? ? ? ? ? ? ? ? ? ? ? ? if (k > 3 && j > 90) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? break break_tag;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? k++;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
9、大數值
1)如果基本的整數和浮點數精度不能夠滿足需求, 那么可以使用jaVa.math 包中的兩個 很有用的類:Biglnteger 和 BigDecimaL 這兩個類可以處理包含任意長度數字序列的數值。 Biglnteger 類實現了任意精度的整數運算, BigDecimal 實現了任意精度的浮點數運算。
10、數組
1)數組是一種數據結構, 用來存儲同一類型值的集合。通過一個整型下標可以訪問數組中 的每一個值。例如, 如果 a 是一個整型數組, a[i] 就是數組中下標為 i 的整數。
2)for each 循環語句顯得更加簡潔、 更不易出錯(不必為下標的起始值和終止值而操心)。
public class AIMain {
? ? public static void main(String[] args) throws IOException {
? ? ? ? String[] myArray = new String[3];
? ? ? ? myArray[0] = "0";
? ? ? ? myArray[1] = "1";
? ? ? ? myArray[2] = "1";
? ? ? ? for (String temp : myArray) {
? ? ? ? ? ? System.out.println(temp);
? ? ? ? }
? ? }
}
3)數組初始化以及匿名數組
4)前面已經看到多個使用 Java 數組的示例。 每一個 Java 應用程序都有一個帶 String arg[] 。 參數的 main 方法。這個參數表明 main 方法將接收一個字符串數組,也就是命令行參數。
5)要想對數值型數組進行排序, 可以使用 Arrays 類中的 sort 方法。
6)多維數組將使用多個下標訪問數組元素, 它適用于表示表格或更加復雜的排列形式。
*******************************************************************************************************************************************
第四章:對象與類
*******************************************************************************************************************************************
1、面向對象程序設計概述
1)類( class) 是構造對象的模板或藍圖。我們可以將類想象成制作小甜餅的切割機,將對象想象為小甜餅。由類構造(construct) 對象的過程稱為創建類的實例 (instance )。
2)實現封裝的關鍵在于絕對不能讓類中的方法直接地訪問其他類的實例域。程序僅通過對 象的方法與對象數據進行交互。封裝給對象賦予了“ 黑盒” 特征, 這是提高重用性和可靠性 的關鍵。 這意味著一個類可以全面地改變存儲數據的方式,只要仍舊使用同樣的方法操作數據, 其他對象就不會知道或介意所發生的變化。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2、對象
首先從設計類開始,然后再往每個類中添加方法。
這些名詞很可能成為類 Item、 Order 等。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3、在類之間, 最常見的關系有 ?依賴(“ uses-a”) ?聚合(“ has-a”) ?繼承(“ is-a”)應該盡可能地將相互依賴的類減至最少。
預定義類:在 Java 中, 沒有類就無法做任何事情, 我們前面曾經接觸過幾個類。然而,并不是所有 的類都具有面向對象特征。例如,Math 類。在程序中,可以使用 Math 類的方法, 如 Math, random, 并只需要知道方法名和參數(如果有的話),而不必了解它的具體實現過程。這正是 封裝的關鍵所在,當然所有類都是這樣。但遺憾的是,Math 類只封裝了功能,它不需要也不 必隱藏數據。由于沒有數據,因此也不必擔心生成對象以及初始化實例域。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4、靜態域與靜態方法
1)靜態域 nextld 也存在。它屬于類,而不屬于任何獨立的對象。
2)靜態變量使用得比較少,但靜態常量卻使用得比較多。例如, 在 Math 類中定義了一個靜態常量。
3)靜態方法是一種不能向對象實施操作的方法。例如, Math 的 pow 方法就是一靜態方法。表達式 Math.pow(x, a)。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
5、方法參數
1)Java 程序設計語言總是采用按值調用。也就是說,方法得到的是所有參數值的一個拷貝,特別是,方法不能修改傳遞給它的任何參數變量的內容。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
6、對象構造
1)重載、new對象、構造函數、無參構造器、有參構造器。
2)Java 還有第三種機制, 稱為初始化塊(initializationblock)。在一個類的聲明中, 可以包含多個代碼塊。只要構造類的對象,這些塊就會被執行。
在這個示例中,無論使用哪個構造器構造對象,id 域都在對象初始化塊中被初始化。首 先運行初始化塊,然后才運行構造器的主體部分。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
7、包
1)Java 允許使用包( package > 將類組織起來。借助于包可以方便地組織自己的代碼,并將 自己的代碼與別人提供的代碼庫分開管理。
2)更簡單且更常用的方式是使用 import 語句。import 語句是一種引用包含 在包中的類的簡明描述。一旦使用了 import 語句,在使用類時,就不必寫出包的全名了。
3)import 語句不僅可以導入類,還增加了導人靜態方法和靜態域的功能。
4)要想將一個類放人包中, 就必須將包的名字放在源文件的開頭,包中定義類的代碼之 前。例如,程序清單 4-7中的文件 Employee.java 開頭是這樣的: package com.horstiann.corejava;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
8、類 路 徑
1)C:\classdir;.;C:\archi?es\archive.jar
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
9、文檔注釋
JDK 包含一個很有用的工具,叫做javadoc, 它可以由源文件生成一個 HTML 文檔。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
10、類設計技巧
1)一定要保證數據私有
2)一定要對數據初始化
3)不要在類中使用過多的基本類型
4)不是所有的域都需要獨立的域訪問器和域更改器
5)將職責過多的類進行分解
6)類名和方法名要能夠體現它們的職責
7)優先使用不可變的類
*******************************************************************************************************************************************
第五章:繼承
*******************************************************************************************************************************************
1、類、超類和子類
1)假設你在某個公司工作,這 個公司中經理的待遇與普通雇員的待遇存在著一些差異。不過, 他們之間也存在著很多相同 的地方,例如, 他們都領取薪水。只是普通雇員在完成本職任務之后僅領取薪水, 而經理在 完成了預期的業績之后還能得到獎金。這種情形就需要使用繼承。(我不這么認為,這么做會增加類之間依賴和復雜度)。2)抽象類
如果自下而上在類的繼承層次結構中上移,位于上層的類更具有通用性,甚至可能更加抽象。從某種角度看, 祖先類更加通用, 人們只將它作為派生其他類的基類,而不作為想使用的特定的實例類。例如, 考慮一下對 Employee 類層次的擴展。一名雇員是一個人, 一名學生也是一個人。下面將類 Person 和類 Student 添加到類的層次結構中。圖 5-2 是這三個類 之間的關系層次圖。 為什么要花費精力進行這樣高層次的抽象呢? 每個人都有一些諸如姓名這樣的屬性。學生與雇員都有姓名屬性, 因此可以將 getName 方法放置在位于繼承關系較高層次的通用超類中。
3)Object: 所有類的超類 190頁
Object 類是 Java 中所有類的始祖, 在 Java 中每個類都是由它擴展而來的。但是并不需要這樣寫: public class Employee extends Object
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3、泛型數組列表
1)ArrayList 是一個采用類型參數( type parameter ) 的泛型類( generic class)。為了指定數 組列表保存的元素對象類型,需要用一對尖括號將類名括起來加在后面, 例如,ArrayList <Employee> 。在第 8 章中將可以看到如何自定義一個泛型類, 這里并不需要了解任何技術細 節就可以使用 ArrayList 類型。
這被稱為“ 菱形” 語法,因為空尖括號 o就像是一個菱形。可以結合 new 操作符使用菱形 語法。編譯器會檢查新值是什么。如果賦值給一個變量,或傳遞到某個方法,或者從某個方 法返回,編譯器會檢査這個變量、 參數或方法的泛型類型,然后將這個類型放在o中。在 這個例子中,new ArrayListo()將賦至一個類型為 ArrayList<Employee> 的變量, 所以泛型 類型為 Employee。
2)集合的遍歷
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4、對象包裝器與自動裝箱
1)ArrayList<Integer> list = new ArrayList<>();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
5、參數數量可變的方法
用的不多,反而增加了不確定性。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
6、枚舉類
package day;

public class AIMain {
? ? public static void main(String[] args) {
? ? ? ? Color color = Color.GREEN;
? ? ? ? System.out.println(color); // 打印出來就是GREEN 值
? ? }

? ? enum Color {
? ? ? ? RED, GREEN, BLANK, YELLOW
? ? }
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
7、反射
1)能夠分析類能力的程序稱為反射(reflective )。反射機制的功能極其強大,在下面可以看 到, 反射機制可以用來: ?在運行時分析類的能力。 ?在運行時查看對象, 例如, 編寫一個 toString 方法供所有類使用。 實現通用的數組操作代碼。 利用 Method 對象, 這個對象很像中的函數指針。 反射是一種功能強大且復雜的機制。 使用它的主要人員是工具構造者,而不是應用程序員如果僅對設計應用程序感興趣, 而對構造工具不感興趣, 可以跳過本章的剩余部分, 稍后再返回來學習。
2)在程序運行期間,Java 運行時系統始終為所有的對象維護一個被稱為運行時的類型標識。 這個信息跟蹤著每個對象所屬的類。 虛擬機利用運行時類型信息選擇相應的方法執行。 然而, 可以通過專門的 Java 類訪問這些信息。保存這些信息的類被稱為 Class, 這 個 名 字很容易讓人混淆。Object 類中的 getClass( ) 方法將會返回一個 Class 類型的實例。
public class AIMain {
? ? public static void main(String[] args) {
? ? ? ? Person person = new Person();
? ? ? ? System.out.println(person.getClass());
? ? }
}
3)捕獲異常
如果沒有提供處理器,程序就會終止,并在控制臺上打印出一條信息, 其中給出了異常的 類型。可能在前面已經看到過一些異常報告, 例如, 偶然使用了 null 引用或者數組越界等。
4)利用反射分析類的能力
import day.pojo.Person;

public class AIMain {
? ? public static void main(String[] args) throws Exception {
? ? ? ? Person person = new Person();
? ? ? ? person.setSex("女");
? ? ? ? System.out.println(person.getClass());
? ? ? ? System.out.println(person.getClass().getName());
? ? ? ? System.out.println(person.getClass().getField("sex"));
? ? ? ? String sex = (String) person.getClass().getField("sex").get(person);
? ? ? ? System.out.println(sex);
? ? ? ? System.out.println(person.getClass().getConstructor());
? ? ? ? System.out.println(person.getClass().getMethod("getName"));
? ? }
}
5)事實上, Java 的設計者曾說過:方法指針是很危險的,并且常常會帶來隱患。他們認為 Java 提供的 接口(interface ) (將在下一章討論)是一種更好的解決方案。然而, 反射機制允許你調用任意 方法。
6)繼承的設計技巧
除非所有繼承的方法都有意義,否則不要使用繼承。
*******************************************************************************************************************************************
第6章 接口、lambda 表達式與內部類
*******************************************************************************************************************************************
1、在 Java 程序設計語言中, 接口不是類,而是對類的一組需求描述,這些類要遵從接口描 述的統一格式進行定義。 我們經常聽到服務提供商這樣說:“ 如果類遵從某個特定接口,那么就履行這項服務 ' 下面給出一個具體的示例。Arrays 類中的 sort 方法承諾可以對對象數組進行排序,但要求滿足下列前提:對象所屬的類必須實現了 Comparable 接口。
1)這就是說,任何實現 Comparable 接口的類都需要包含 compareTo 方法,并且這個方法的參數必須是一個 Object 對象,返回一個整型數值。
public class Person implements Comparable<Person> { // 排序誰泛型誰
? ? private int age;

? ? public int getAge() {
? ? ? ? return age;
? ? }

? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }

? ? @Override
? ? public int compareTo(Person other) {
? ? ? ? return this.age - other.age; // 這里用了this與other比較
? ? }
}
public class AIMain {
? ? public static void main(String[] args) throws Exception {
? ? ? ? Person person1 = new Person();
? ? ? ? person1.setAge(30);
? ? ? ? Person person2 = new Person();
? ? ? ? person2.setAge(10);
? ? ? ? Person person3 = new Person();
? ? ? ? person3.setAge(20);
? ? ? ? List<Person> personList = new ArrayList<>();
? ? ? ? personList.add(person1);
? ? ? ? personList.add(person2);
? ? ? ? personList.add(person3);
? ? ? ? Collections.sort(personList); // 這里關鍵調用了比較方法
? ? ? ? for (Person temp : personList) {
? ? ? ? ? ? System.out.println(temp.getAge());
? ? ? ? }
? ? }
}
2)接口與抽象類
非常遺憾, 使用抽象類表示通用屬性存在這樣一個問題: 每個類只能擴展于一個類。假 設 Employee 類已經擴展于一個類, 例如 Person, 它就不能再像下面這樣擴展第二個類了。
而接口可以多實現。
3)靜態方法
在 Java SE 8 中,允許在接口中增加靜態方法。理論上講,沒有任何理由認為這是不合法 的。只是這有違于將接口作為抽象規范的初衷。
4)默認方法
可以為接口方法提供一個默認實現。 必須用 default 修飾符標記這樣一個方法。
當然, 這并沒有太大用處, 因為 Comparable 的每一個實際實現都要覆蓋這個方法。不過 有些情況下, 默認方法可能很有用。 例如,在第 11 章會看到, 如果希望在發生鼠標點擊事 件時得到通知,就要實現一個包含 5 個方法的接口。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2、接口示例
1)回調
回調( callback) 是一種常見的程序設計模式。在這種模式中,可以指出某個特定事件發生時應該采取的動作。例如,可以指出在按下鼠標或選擇某個菜單項時應該采取什么行動。 然而,由于至此還沒有介紹如何實現用戶接口,所以只能討論一些與上述操作類似,但比較 簡單的情況。
在 java.swing 包中有一個 Timer 類,可以使用它在到達給定的時間間隔時發出通告。 例 如,假如程序中有一個時鐘,就可以請求每秒鐘獲得一個通告, 以便更新時鐘的表盤。
2)Comparator 接口
要按長度比較字符串,可以如下定義一個實現 Comparator<String> 的類。
3)對象克隆
本節我們會討論 Cloneable 接口,這個接口指示一個類提供了一個安全的 clone 方法。由 于克隆并不太常見,而且有關的細節技術性很強,你可能只是想稍做了解,等真正需要時再 深人學習。
要不要在自己的類中實現 clone 呢? 如果你的客戶需要建立深拷貝,可能就需要實現這 個方法。有些人認為應該完全避免使用 clone, 而實現另一個方法來達到同樣的目的。clone 相當笨拙, 這一點我們也同意,不過如果讓另一個方法來完成這個工作, 還是會遇到同樣的 問題。畢竟, 克隆沒有你想象中那么常用。標準庫中只有不到 5% 的類實現了clone。
4)lambda 表達式
現在可以來學習 lambda 表達式, 這是這些年來 Java 語言最讓人激動的一個變化。你會 了解如何使用 lambda 表達式采用一種簡潔的語法定義代碼塊, 以及如何編寫處理 lambda 表達式的代碼。
lambda 表達式是一個可傳遞的代碼塊, 可以在以后執行一次或多次。
到目前為止,在 Java 中傳遞一個代碼段并不容易, 不能直接傳遞代碼一段 Java 是一種面 向對象語言,所以必須構造一個對象,這個對象的類需要有一個方法能包含所需的代碼。
5)函 數 式 接 口(雖然好,但是不常用)
Arrays.sort (words, (first, second) -> first.length - second.length);
lambda 表達式可以轉換為接口, 這一點讓 lambda 表達式很有吸引力。
ArrayList 類有一個 removelf 方法, 它的參數就是一個 Predicate。這個接口專門用來傳遞 lambda 表達式。例如,下面的語句將從一個數組列表刪除所有 null 值: list.removelf(e -> e == null);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3、內部類
1)內部類( inner class) 是定義在另一個類中的類。為什么需要使用內部類呢? 有以下三點: ?內部類方法可以訪問該類定義所在的作用域中的數據, 包括私有的數據。 ?內部類可以對同一個包中的其他類隱藏起來。 ?當想要定義一個回調函數且不想編寫大量代碼時,使用匿名 (anonymous) 內部類比較便捷。
2)當在 Java 1.1 的 Java語言中增加內部類時,很多程序員都認為這是一項很主要的新特性, 但這卻違背了 Java 要比 C++ 更加簡單的設計理念。內部類的語法很復雜(可以看到,稍后介 紹的匿名內部類更加復雜 )。它與訪問控制和安全性等其他的語言特性的沒有明顯的關聯。 由于增加了一些看似優美有趣, 實屬沒必要的特性,似乎 Java 也開始走上了許多語言飽 受折磨的毀滅性道路上。 我們并不打算就這個問題給予一個完整的答案。 內部類是一種編譯器現象, 與虛擬機無 關。編譯器將會把內部類翻譯成用 $ (美元符號)分隔外部類名與內部類名的常規類文件, 而 虛擬機則對此一無所知。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4、代理
1)利用代理可以在運行時創建一個實現了一組給 定接1J 的新類 : 這種功能只有在編譯時無法確定需要實現哪個接 U 時才冇必要使用。用程序設計人員來說, 遇到這種情況的機會很少。如果對這種高級技術不感興趣,可以跳過 本節內容。然而,對于系統程序設計人員來說,代理帶來的靈活性卻十分重要。
*******************************************************************************************************************************************
第7章 異常、斷言和曰志
*******************************************************************************************************************************************
1、處理錯誤
1)假設在一個 Java 程序運行期間出現了一個錯誤。這個錯誤可能是由于文件包含了錯誤 信息,或者網絡連接出現問題造成的,也有可能是因為使用無效的數組下標, 或者試圖使用 一個沒有被賦值的對象引用而造成的。用戶期望在出現錯誤時, 程序能夠采用一些理智的行 為。如果由于出現錯誤而使得某些操作沒有完成, 程序應該: ?返回到一種安全狀態,并能夠讓用戶執行一些其他的命令;或者 ?允許用戶保存所有操作的結果,并以妥善的方式終止程序。
在 Java 程序設計語言中, 異常對象都是派生于 Throwable 類的一個實例。稍后還可以看到,如果 Java 中內置的異常類不能夠滿足需求,用戶可以創建自己的異常類。需要注意的是,所有的異常都是由 Throwable 繼承而來,但在下一層立即分解為兩個分支:Error 和 Exception:
2)聲明受查異常
如果遇到了無法處理的情況, 那么 Java 的方法可以拋出一個異常。這個道理很簡單:一 個方法不僅需要告訴編譯器將要返回什么值,還要告訴編譯器有可能發生什么錯誤。例如, 一段讀取文件的代碼知道有可能讀取的文件不存在, 或者內容為空,因此, 試圖處理文件信 息的代碼就需要通知編譯器可能會拋出 IOException 類的異常。
3)如何拋出異常
首先要決定應該拋出什么類型的異常。將上述異常歸結為 IOException 是一種很好的選 擇。仔細地閱讀 Java API 文檔之后會發現:EOFException 異常描述的是“ 在輸人過程中, 遇 到了一個未預期的 EOF 后的信號”。
4)創建異常類
class MyException extends Exception{}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2、捕獲異常
1)要想捕獲一個異常, 必須設置 try/catch語句塊。
2)捕獲多個異常:在一個 try 語句塊中可以捕獲多個異常類型,并對不同類型的異常做出不同的處理。可 以按照下列方式為每個異常類型使用一個單獨的 catch 子句。3)finally 子句。Java 有一種更好的解決方案,這就是 finally 子句。下面將介紹 Java 中如何恰當地關閉 一個文件。如果使用 Java 編寫數據庫程序,就需要使用同樣的技術關閉與數據庫的連接。在 卷 n 的第 4 章中可以看到更加詳細的介紹。當發生異常時,恰當地關閉所有數據庫的連接是 非常重要的。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3、使用異常機制的技巧
1)異常處理不能代替簡單的測試
2)不要過分地細化異常
3)利用異常層次結構
4)不要壓制異常
5)在檢測錯誤時,“ 苛刻 ” 要比放任更好
6)不要羞于傳遞異常
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4、使用斷言
1)斷言的概念
2)啟用和禁用斷言
3)使用斷言完成參數檢查
4)為文檔假設使用斷言
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
5、記錄日志【321】
1)每個 Java 程序員都很熟悉在有問題的代碼中插入一些 System.out.println 方法調用來幫助觀察程序運行的操作過程。?
2)基本曰志
3)高級曰志
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
6、調試技巧
1)假設編寫了一個程序, 并對所有的異常進行了捕獲和恰當的處理,然后,運行這個程序,但 還是出現問題,現在該怎么辦呢(如果從來沒有遇到過這種情況, 可以跳過本章的剩余部分)? 當然,如果有一個方便且功能強大的調試器就太好了。
2)可以用下面的方法打印或記錄任意變量的值: System.out.println( "x=" + x);
3)一個不太為人所知但卻非常有效的技巧是在每一個類中放置一個單獨的 main方法。 這樣就可以對每一個類進行單元測試。
4)如果喜歡使用前面所講述的技巧,就應該到 http://junit.org 網站上査看一下 JUnit。 JUiiit 是一個非常常見的單元測試框架,利用它可以很容易地組織測試用例套件。只要修改 類,就需要運行測試。在發現 bug 時,還要補充一些其他的測試用例
5)日志代理( logging proxy) 是一個子類的對象, 它可以截獲方法調用, 并進行日志記 錄,然后調用超類中的方法。例如,如果在調用 Random 類的 nextDouble 方法時出現了問 題, 就可以按照下面的方式,以匿名子類實例的形式創建一個代理對象。
6)利 用 Throwable 類提供的 printStackTmce 方法,可以從任何一個異常對象中獲得堆棧 情況。. 下面的代碼將捕獲任何異常,打印異常對象和堆棧軌跡, 然后,重新拋出異常, 以便 能夠找到相應的處理器。
7)通常, 將一個程序中的錯誤信息保存在一個文件中是非常有用的。然而,錯誤信息 被發送到 System.err 中,而不是 System.out 中。因此,不能夠通過運行下面的語句獲取它們。
*******************************************************************************************************************************************
第8章 泛型程序設計
*******************************************************************************************************************************************
1、為什么要使用泛型程序設計
1)泛型提供了一個更好的解決方案: 類型參數( type parameters)。ArrayList 類有一個類型 參數用來指示元素的類型: ArrayList<String> files = new ArrayList<String>():
在JavaSE7及以后的版本中, 構造函數中可以省略泛型類型:ArrayList<String> files = new ArrayList<>();// 不懂 但會用!
2、定義簡單泛型類
這里的使用,和我定義的PageService有異曲同工之妙,面向接口編程的好處。
3、泛型方法:可以將結果賦給 Object、Serialiable 或 Comparable。約束和泛型配合工作才是最好的!
4、類型變量的限定: public static <T> T in(T[] a) // almost correct
5、泛型代碼和虛擬機:虛擬機沒有泛型類型對象—所有對象都屬于普通類。在泛型實現的早期版本中, 甚至 能夠將使用泛型的程序編譯為在 1.0 虛擬機上運行的類文件!這個向后兼容性在 Java 泛型開 發的后期被放棄了。
6、約束與局限性
7、泛型類型的繼承規則
8、通配符類型:通配符類型中, 允許類型參數變化。 例如, 通配符類型 Pair<? extends Employee〉 表示任何泛型 Pair 類型, 它的類型參數是 Employee 的子類, 如 Pair<Manager>, 但不是 Pair<String>。
9、反射和泛型:現在, Class 類是泛型的。例如, String.class 實際上是一個Class<String> 類的對象(事實上,是唯一的對象)。
*******************************************************************************************************************************************
第9章 集合
*******************************************************************************************************************************************
1、Java 集合框架 List Set Map Collection Queue
2、具體的集合
3、映射 Map k v對
4、視圖與包裝器
5、算法:泛型集合接口有一個很大的優點, 即算法只需要實現一次。例如, 考慮一下計算集合中 最大元素這樣一個簡單的算法。 使用傳統方式, 程序設計人員可能會用循環實現這個算法。 下面就是找出數組中最大元素的代碼
6、遺留的集合:Hashtable 枚舉 棧
*******************************************************************************************************************************************
第10章 圖形程序設計GUI
*******************************************************************************************************************************************
1、Swing 概述 在ARM機器上界面交互還是有用的!!!
2、創建框架:在 Java 中,頂層窗口(就是沒有包含在其他窗口中的窗口)被稱為框架(frame )。在 AWT 庫中有一個稱為 Frame 的類, 用于描述頂層窗口。這個類的 Swing 版本名為 JFrame, 它擴展于 Frame 類。JFrame 是極少數幾個不繪制在畫布上的 Swing 組件之一。因此,它的修 飾部件(按鈕、標題欄、圖標等)由用戶的窗口系統繪制, 而不是由 Swing 繪制。
3、框架定位:JFrame 類本身只包含若干個改變框架外觀的方法。當然,通過繼承, 從 JFrame 的各個 超類中繼承了許多用于處理框架大小和位置的方法 其中最重要的有下面幾個setLocation...。
4、在組件中顯示信息
5、處 理 2D 圖形:自從 Java 版本 1.0 以來, Graphics 類就包含繪制直線、矩形和楠圓等方法。但是,這些 繪制圖形的操作能力非常有限。例如, 不能改變線的粗細,不能旋轉這些圖形。
6、使用顏色:使用 Gr叩hics2D 類的 setPaint 方法可以為圖形環境上的所有后續的繪制操作選擇顏色。
7、文本使用特殊字體
8、顯示圖像:到目前為止,我們已經看到了如何通過繪制直線和圖形創建一個簡單的圖像。而對于照片這樣的復雜圖像來說,通常都是由掃描儀或特殊的圖像處理軟件生成的(正像在卷n中將看到的,逐像素地生成圖像。
*******************************************************************************************************************************************
第11章 事件處理【佩服自己,2章內容自己1個帖子拿捏】【483頁】
*******************************************************************************************************************************************
1、事件處理基礎:任何支持 GUI 的操作環境都要不斷地監視按鍵或點擊鼠標這樣的事件。操作環境將 這些事件報告給正在運行的應用程序。如果有事件產生,每個應用程序將決定如何對它們 做出響應。在 Visual Basic 這樣的語言中, 事件與代碼之間有著明確的對應關系。程序員 對相關的特定事件編寫代碼, 并將這些代碼放置在過程中,通常人們將它們稱為事件過 程( event procedure) 0 例如,有一個名為 HelpButton 的 Visual Basic 按鈕有一個與之關聯的 HelpButton_Click 事件過程。這個過程中的代碼將在點擊按鈕后執行。每個 Visual Basic 的 GUI 組件都響應一個固定的事件集,不可能改變 Visual Basic 組件響應的事件集。
2、動作:通常, 激活一個命令可以有多種方式。用戶可以通過菜單、擊鍵或工具欄上的按鈕選擇 特定的功能。在 AWT 事件模型中實現這些非常容易:將所有事件連接到同一個監聽器上。 例如, 假設 blueAction 是一個動作監聽器,它的 actionPerformed方法可以將背景顏色改變成 藍色。將一個監聽器對象加到下面幾個事件源上:
3、鼠標事件:如果只希望用戶能夠點擊按鈕或菜單,那么就不需要顯式地處理鼠標事件。鼠標操作將 由用戶界面中的各種組件內部處理。然而, 如果希望用戶使用鼠標畫圖, 就需要捕獲鼠標移 動點擊和拖動事件。
4、AWT 事件繼承層次:弄清了事件處理的工作過程之后,作為本章的結束, 總結一下 AWT 事件處理的體系架構。 前面已經提到,Java 事件處理采用的是面向對象方法,所有的事件都是由 java.util 包中 的 EventObject 類擴展而來的(公共超類不是 Event, 它是舊事件模型中的事件類名。盡管現 在不贊成使用舊的事件模型,但這些類仍然保留在 Java 庫中)。 EventObject 類有一個子類 AWTEvent,它是所有 AWT 事件類的父類。 圖 11-8 顯示了 AWT 事件的繼承關系圖。
*******************************************************************************************************************************************
第12章 SWING用戶界面組件
*******************************************************************************************************************************************
1、Swing 與模型 -視圖 -控制器設計模式:MVC模式 模型【數據庫】 視圖【VIEW】 控制器【CONTROLLER】
2、布局管理概述:Flow布局 xy定位
3、文本輸入:獲取文本進行GUI交互
4、選擇組件:類似VUE什么場景用什么組件
5、菜單:各種按鈕、 文本域以及組合框等。 Swing 還提供了一些其他種類的用戶界面兀素’ 下拉式菜單就是 GUI 應用程序中很常見的一種。
6、復雜的布局管理:迄今為止, 在前面的示例應用程序所使用的用戶界面組件中, 只使用了邊框布局、 流布布局和網格布局。對于復雜的問題而言, 只使用這四種布局顯然不夠。 本節將詳細地討論高級布局管理器。好像并不需要。
7、對話框:與大多數的窗口系統一樣, AWT 也分為模式對話框和無模式對話框。所謂模式對話框是 指在結束對它的處理之前, 不允許用戶與應用程序的其余窗口進行交互。模式對話框主要用 于在程序繼續運行之前獲取用戶提供的信息。例如, 當用戶想要讀取文件時,就會彈出一個核心技術。 模式對話框。用戶必須給定一個文件名, 然后程序才能夠開始讀操作。只有用戶關閉(模式) 對話框之后, 應用程序才能夠繼續執行。在VUE中可以簡單的使用了吧...
8、GUI程序排錯:本節會給出 GUI 編程的一些調試技巧, 然后介紹如何使用 AWT 機器人 ( AWT robot ) 自 動完成 GUI 測試。
*******************************************************************************************************************************************
第13章 部署Java應用程序
*******************************************************************************************************************************************
1、JAR 文件:在將應用程序進行打包時,使用者一定希望僅提供給其一個單獨的文件,而不是一個含 有大量類文件的目錄,Java 歸檔(JAR) 文件就是為此目的而設計的。一個 JAR 文件既可以 包含類文件,也可以包含諸如圖像和聲音這些其他類型的文件。此外, JAR 文件是壓縮的, 它使用了大家熟悉的 ZIP 壓縮格式。
2、應用首選項的存儲:應用用戶通常希望能保存他們的首選項和定制信息, 以后再次啟動應用時再恢復這些配置。首先我們來介紹 Java 應用的傳統做法, 這是一種簡單的方法,將配置信息保存在屬性文 件中。然后我們會介紹首選項 API, 它提供了一個更加健壯的解決方案。用文件替代數據庫。
3、服務加載器:跨平臺插件
4、applet:過時的技術
5、Java Web Start:要想準備一個通過 Java Web Start 發布的應用程序, 應該將其打包到一個或多個 JAR 文 件中。然后創建一個 Java Network Launch Protocol ( JNLP ) 格式的描述符文件。將這些文件 放置在 Web 服務器上。也成為過去時了。要借助tomcat
*******************************************************************************************************************************************
第14章 并發【641】
*******************************************************************************************************************************************
1、什么是線程:這里從察看一個沒有使用多線程的程序開始。用戶很難讓它執行多個任務。在對其進行 剖析之后,將展示讓這個程序運行幾個彼此獨立的多個線程是很容易的。這個程序采用不斷 地移動位置的方式實現球跳動的動畫效果,如果發現球碰到墻壁, 將進行重繪。可以將移動球的代碼放置在一個獨立的線程中, 運行這段代碼可以提高彈跳球的響應能力。實際上,可以發起多個球,每個球都在自己的線程中運行。這不就是坦克大戰的子彈嗎。
2、中斷線程:當線程的 run 方法執行方法體中最后一條語句后, 并經由執行 return 語句返冋時,或者 第 1 4 章 并 6 3 3 出現了在方法中沒有捕獲的異常時,線程將終止。 在 Java 的早期版本中, 還有一個 stop 方 法, 其他線程可以調用它終止線程。但是, 這個方法現在已經被棄用了。14.5.15 節將討論它 被棄用的緣由。
3、線程狀態:線程可以有如下 6 種狀態: ?New (新創建) ?Runnable (可運行) ?Blocked (被阻塞) ?Waiting (等待) ?Timed waiting (計時等待) ?Terminated (被終止)
4、線程屬性:下面將討論線程的各種屬性,其中包括:線程優先級、守護線程、 線程組以及處理未捕 獲異常的處理器。守護線程(daemon thread)。這樣一個線程沒有什么神奇。守護線程的唯一用途是為其他線程提供服務。
5、同步:在大多數實際的多線程應用中, 兩個或兩個以上的線程需要共享對同一數據的存取。如 第 1 4 章 并 ? 6 4 1 果兩個線程存取相同的對象, 并且每一個線程都調用了一個修改該對象狀態的方法,將會發 生什么呢? 可以想象, 線程彼此踩了對方的腳。根據各線程訪問數據的次序,可能會產生i化 誤的對象。這樣一個情況通常稱為競爭條件(race condition)。有兩種機制防止代碼塊受并發訪問的干擾。Java語言提供一個 synchronized 關鍵字達 到這一目的,并且 Java SE 5.0 引入了 ReentrantLock 類。synchronized 關鍵字自動提供一個 鎖以及相關的“ 條件”, 對于大多數需要顯式鎖的情況, 這是很便利的。但是, 我們相信在 讀者分別閱讀了鎖和條件的內容之后, 理解 synchronized 關鍵字是很輕松的事情。java.util. concurrent 框架為這些基礎機制提供獨立的類,在此以及第 14.5.4 節加以解釋這個內容
6、阻塞隊列:對于許多線程問題, 可以通過使用一個或多個隊列以優雅且安全的方式將其形式化。生 產者線程向隊列插人元素, 消費者線程則取出它們。使用隊列,可以安全地從一個線程向另 一個線程傳遞數據。
7、線程安全的集合:如果多線程要并發地修改一個數據結構, 例如散列表, 那么很容易會破壞這個數據結構 (有關散列表的詳細信息見第 9 章 )。例如, 一個線程可能要開始向表中插入一個新元素。假 定在調整散列表各個桶之間的鏈接關系的過程中, 被剝奪了控制權。如果另一個線程也開始 遍歷同一個鏈表,可能使用無效的鏈接并造成混亂, 會拋出異常或者陷人死循環。
8、Callable 與 Future:Runnable 封裝一個異步運行的任務,可以把它想象成為一個沒有參數和返回值的異步方 法。Callable 與 Runnable 類似,但是有返回值。Callable 接口是一個參數化的類型, 只有一 個方法 call。
9、執行器:執行器( Executor) 類有許多靜態工廠方法用來構建線程池, 表 14-2 中對這些方法進行 了匯總。先來看一下表 14-2 中的 3 個方法。在第 14.9.2 節中,我們討論其余的方法。newCachedThreadPoo丨方法構建了一個線程池, 對于每個任務, 如果有空閑線程可用,立即讓它執行 任務,如果沒有可用的空閑線程, 則創建一個新線程。newFixedThreadPool 方法構建一個具 有固定大小的線程池。 如果提交的任務數多于空閑的線程數, 那么把得不到服務的任務放 置到隊列中。當其他任務完成以后再運行它們。
10、同步器:java.util.concurrent 包包含了幾個能幫助人們管理相互合作的線程集的類見表 14-5。這 些機制具有為線程之間的共用集結點模式(common rendezvous patterns) 提供的“ 預置功能” ( canned functionality ) 0 如果有一個相互合作的線程集滿足這些行為模式之一, 那么應該直接 重用合適的庫類而不要試圖提供手工的鎖與條件的集合。
11、線程與 Swing:但是,必須認真考慮工作器線程在做什么,因為這或許令人驚訝,Swing 不是線程安全的。如果你試圖在多個線程中操縱用戶界面的元素,那么用戶界面可能崩潰。
*******************************************************************************************************************************************
*******************************************************************************************************************************************
第15章 Java設計模式
*******************************************************************************************************************************************
1、設計模式概念
1)Java設計模式是一種反復使用的代碼設計總結,設計模式的目的是重用代碼、讓代碼容易被他人所理解、同時也保證了代碼的可靠穩定性。在日常的項目開發中,合理的使用設計模式可以完美的解決對應的問題。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2、分類
建造者模型(5種)
工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式

結構型模式(7種)
適配器模式、裝飾器模式、代理模式、橋接模式、外觀模式、組合模式、享元模式

行為型模式(11種)
策略模式、模板方法模式、觀察者模式、責任鏈模式、訪問者模式、
中介者模式、迭代器模式、命令模式、狀態模式、備忘錄模式、解釋器模式
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3、設計模式的六大原則
1)開閉原則
??開閉原則指的是對擴展開放,對修改關閉。在對程序進行擴展的時候,不能去修改原有的代碼,想要達到這樣的效果,我們就需要使用接口或者抽象類!!!
2) 依賴倒轉原則
???依賴倒置原則是開閉原則的基礎,指的是針對接口編程,依賴于抽象而不依賴于具體
3) 里氏替換原則
??里氏替換原則是繼承與復用的基石,只有當子類可以替換掉基類,且系統的功能不受影響時,基類才能被復用,而子類也能夠在基礎類上增加新的行為。所以里氏替換原則指的是任何基類可以出現的地方,子類一定可以出現。
??里氏替換原則是對 “開閉原則” 的補充,實現 “開閉原則” 的關鍵步驟就是抽象化,而基類與子類的繼承關系就是抽象化的具體實現,所以里氏替換原則是對實現抽象化的具體步驟的規范。
4)接口隔離原則
??使用多個隔離的接口,比使用單個接口要好,降低接口之間的耦合度與依賴,方便升級和維護方便!!!
5)迪米特原則
??迪米特原則,也叫最少知道原則,指的是一個類應當盡量減少與其他實體進行相互作用,使得系統功能模塊相對獨立,降低耦合關系。該原則的初衷是降低類的耦合,雖然可以避免與非直接的類通信,但是要通信,就必然會通過一個“中介”來發生關系,過分的使用迪米特原則,會產生大量的中介和傳遞類,導致系統復雜度變大,所以采用迪米特法則時要反復權衡,既要做到結構清晰,又要高內聚低耦合。
6)合成復用原則
??盡量使用組合/聚合的方式,而不是使用繼承。!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4、這里我們只介紹幾種設計模式的使用,這些一般在日常開發當中,是夠使用的。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
5、單例設計模式
所謂單例設計模式簡單說就是無論程序如何運行,采用單例設計模式的類(Singleton類)永遠只會有一個實例化對象產生。具體實現步驟如下:

將采用單例設計模式的類的構造方法私有化(采用private修飾)。
在其內部產生該類的實例化對象,并將其封裝成private static類型。
定義一個靜態方法返回該類的實例。
public class AIMain {
? ? public static void main(String[] args) throws Exception {
? ? ? ? Singleton s1 = null; // 聲明對象
? ? ? ? Singleton s2 = null; // 聲明對象
? ? ? ? Singleton s3 = null; // 聲明對象
? ? ? ? s1 = Singleton.getInstance(); // 取得實例化對象
? ? ? ? s2 = Singleton.getInstance(); // 取得實例化對象
? ? ? ? s3 = Singleton.getInstance(); // 取得實例化對象
? ? ? ? s1.print(); // 調用方法
? ? ? ? s2.print(); // 調用方法
? ? ? ? s3.print(); // 調用方法
? ? }
}

class Singleton {
? ? private static Singleton instance = new Singleton();// 在內部產生本類的實例化對象

? ? public static Singleton getInstance() { // 通過靜態方法返回instance對象
? ? ? ? return instance;
? ? }

? ? private Singleton() { // 將構造方法封裝為私有化
? ? }

? ? public void print() {
? ? ? ? System.out.println("陳翔六點半");
? ? }
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
6、單例模式介紹
??Singleton是一種創建型模式,指某個類采用Singleton模式,則在這個類被創建后,只可能產生一個實例供外部訪問,并且提供一個全局的訪問點
??
1)餓漢式,線程安全 但效率比較低
/**
?*?
?* 單例模式的實現:餓漢式,線程安全 但效率比較低
?*/
public class SingletonTest {
?
?? ?private SingletonTest() {
?? ?}
?
?? ?private static final SingletonTest instance = new SingletonTest();
?
?? ?public static SingletonTest getInstancei() {
?? ??? ?return instance;
?? ?}
?
}
2)單例模式的實現:飽漢式,非線程安全
/**
?* 單例模式的實現:飽漢式,非線程安全?
?*?
?*/
public class SingletonTest {
?? ?private SingletonTest() {
?? ?}
?
?? ?private static SingletonTest instance;
?
?? ?public static SingletonTest getInstance() {
?? ??? ?if (instance == null)
?? ??? ??? ?instance = new SingletonTest();
?? ??? ?return instance;
?? ?}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
工廠模式詳解(簡單工廠+工廠方法+抽象工廠)
??工廠模式將目的將創建對象的具體過程屏蔽隔離起來,從而達到更高的靈活性,工廠模式可以分為三類:

簡單工廠模式(Simple Factory)
工廠方法模式(Factory Method)
抽象工廠模式(Abstract Factory)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78145.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析:RocketMQ、RabbitMQ和Kafka的區別與使用場景

互聯網大廠Java求職者面試&#xff1a;RocketMQ、RabbitMQ和Kafka的深入解析 故事場景&#xff1a;嚴肅且專業的面試官與架構師程序員馬架構 在一家知名的互聯網大廠&#xff0c;Java求職者正在接受一場嚴格的面試。面試官是一位經驗豐富的技術專家&#xff0c;他將通過多輪提…

使用vue2開發一個醫療預約掛號平臺-前端靜態網站項目練習

對于后端開發的我&#xff0c;最近一直在學習前端開發&#xff0c;除了要學習一些前端的基礎知識外&#xff0c;肯定少不了一些前端項目練習&#xff0c;就通過前端的編程知識 就簡單做一個醫療預約掛號前端靜態頁面。這個網站主要是使用了vue2 的相關技術實現的。 主要實現了這…

MongoDB(docker版)備份還原

docker啟動MongoDB docker run -d -p 27017:27017 --name my-mongo -v /mongodb/db:/data/db mongo備份MongoDB 使用mongodump備份數據庫時&#xff0c;默認會將備份數據保存在當前工作目錄下的dump文件夾中。 docker容器中默認備份在當前工作目錄&#xff0c;所以此處指定當…

zkPass案例實戰之合約篇

目錄 一、contracts/contracts/ProofVerifier.sol 1. License 和 Solidity 版本 2. 導入依賴 3. 合約聲明和默認分配器地址 4. 驗證證明 5. 驗證分配器簽名 6. 驗證驗證者簽名 7. 簽名前綴處理 8. 簽名恢復 總結 二、contracts/contracts/SampleAttestation.sol 1. …

ElasticSearch:高并發場景下如何保證讀寫一致性?

在Elasticsearch高并發場景下&#xff0c;可以通過以下多種方式來保證讀寫一致性&#xff1a; 等待主分片和副本分片都確認&#xff08;類似半同步機制&#xff09; 設置consistency參數&#xff1a;在寫操作時&#xff0c;可以設置consistency參數來控制寫操作的一致性級別。…

8、constexpr if、inline、類模版參數推導、lambda的this捕獲、初始化列表、namespace---c++17

一、constexpr if&#xff1a;編譯時條件分支 作用&#xff1a;在模板編程中&#xff0c;根據條件在編譯時選擇不同的代碼路徑&#xff0c;無需特化版本或復雜SFINAE技巧[替代SFINAE]。[SFINAE將在模版元編程再講。下個月了。] 注意&#xff1a;默認使用了隱式inline 基本語法…

【Java設計模式及實踐學習-第4章節-結構型模式】

第4章節-結構型模式 筆記記錄 1. 適配器模式2. 代理模式3. 裝飾器模式4. 橋接模式5. 組合模式6. 外觀模式7. 享元模式8. 總結 1. 適配器模式 2. 代理模式 3. 裝飾器模式 4. 橋接模式 5. 組合模式 6. 外觀模式 7. 享元模式 Java語言中的String字符串就使用了享元模式&…

unity基礎自學2.3:移動和抓握物品

文章目錄 前言&#xff1a;1、基礎配置①XR Interaction Toolkit②創建一個XR場景③示例文件實現④ 一鍵配置&#xff08;PICO Building Blocks&#xff09; 2、射線移動物品和抓握物品方法一&#xff1a;Grab Interactable方法二&#xff1a;prefab 3、Box Collider的作用與使…

pytest基礎-new

規范 1、首先創建 py 文件命名以 test_ 開始或者以 _test 結尾 2、若是新建類&#xff0c;測試類需要以 Test_開頭 3、測試用例&#xff08;方法&#xff09;需要以 test_開頭 assert 斷言 assert xx&#xff1a;判斷 xx 為真 assert not xx&#xff1a;判斷 xx 不為真 asse…

【華為OD機試真題】232、統計射擊比賽成績 | 機試真題+思路參考+代碼分析(C++)

題目描述 給定一個射擊比賽成績單,包含多個選手若干次射擊的成績分數,請對每個選手按其最高3個分數之和進行降序排名,輸出降序排 名后的選手ID序列 條件如下: 1.一個選手可以有多個射擊成績的分數,且次序不固定 2.如果一個選手成績少于3個,則認為選手的所有成績無效,排名…

?Unity 開發 | 如何通過 NTP 網絡時間實現精準的跨平臺時間同步【附完整源碼 + UI 模塊 + 偏差分析】

&#x1f3ae; 項目實戰 | 實現一套精確、可視化的游戲時間同步機制&#xff0c;讓你的多人在線游戲擺脫“時間不一致”噩夢&#xff01; 效果如圖&#xff1a; &#x1f4cc; 一、前言&#xff1a;為什么不能只信本地時間&#xff1f; 在 Unity 游戲開發中&#xff0c;時間幾…

Vue3 Composition API與十大組件開發案例詳解

文章目錄 一、Vue3核心API解析1.1 Composition API優勢1.2 核心API 二、十大組件開發案例案例1&#xff1a;響應式表單組件案例2&#xff1a;動態模態框&#xff08;Teleport應用&#xff09;案例3&#xff1a;可復用列表組件案例4&#xff1a;全局狀態通知組件案例5&#xff1…

Kafka 詳細解讀

1. Producer&#xff08;生產部卷王&#xff09; 職責&#xff1a;往 Kafka 里瘋狂輸出數據&#xff0c;KPI 是「日拋式消息海嘯」 職場人設&#xff1a; 白天開會畫餅&#xff0c;深夜寫周報的奮斗逼&#xff0c;口頭禪是「這個需求今晚必須上線&#xff01;」代碼里的「福報…

LicheeRV Nano 與Ubuntu官方risc-v 鏡像混合

LicheeRV Nano 官方給的鏡像并沒有unbutu, unbutu官方有一個基于 LicheeRV Dock的鏡像&#xff0c;想象能否將二者混合 &#xff08;1&#xff09;刷 LicheeRV Dock的鏡像 nano無法啟動 &#xff08;2&#xff09;將nano的boot分區替換掉 LicheeRV Dock的rootfs以外的分區也…

【模板匹配】圖像處理(OpenCV)-part10

19.1模板匹配 模板匹配就是用模板圖&#xff08;通常是一個小圖&#xff09;在目標圖像&#xff08;通常是一個比模板圖大的圖片&#xff09;中不斷的滑動比較&#xff0c;通過某種比較方法來判斷是否匹配成功,找到模板圖所在的位置。 不會有邊緣填充。 類似于卷積&#xff0c…

HTML:表格數據展示區

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>人員信息表</title><link rel"styl…

MySQL 的鎖,表級鎖是哪一層的鎖?行鎖是哪一層的鎖?

MySQL 的鎖層級與類型 在 MySQL 中&#xff0c;鎖的層級和實現與存儲引擎密切相關。 1. 表級鎖&#xff08;Table-Level Locks&#xff09; &#xff08;1&#xff09;存儲引擎層的表級鎖 實現層級&#xff1a;存儲引擎層&#xff08;如 MyISAM、InnoDB&#xff09;。特點&a…

阿里巴巴按圖搜索1688商品(拍立淘) API 返回值說明

阿里巴巴按圖搜索1688商品&#xff08;拍立淘&#xff09;API 返回值說明 阿里巴巴按圖搜索1688商品&#xff08;拍立淘&#xff09;API 的返回值通常以 JSON 格式返回&#xff0c;包含搜索結果、商品信息、分頁信息等。以下是具體的返回值說明&#xff1a; 1. 請求狀態信息 …

基于esp32-s3,寫一個實現json鍵值對數據創建和讀寫解析c例程

以下是一個基于 ESP32 - S3 使用 ESP - IDF 框架實現 JSON 鍵值對數據創建、讀寫和解析的 C 語言例程。 環境準備 確保你已經安裝了 ESP - IDF 開發環境&#xff0c;并且可以正常編譯和燒錄代碼到 ESP32 - S3 開發板。 代碼示例 #include <stdio.h> #include <stri…

MyBatis-Plus 使用 Wrapper 構建動態 SQL 有哪些優劣勢?

MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一&#xff0c;它允許我們在開發時以面向對象的方式構建 SQL 的 WHERE 條件、ORDER BY、SELECT 字段列表等部分。與傳統的 MyBatis 在 XML 文件中…