《Java 2實用教程》讀書筆記
第一章:Java入門
1.Java可以在計算機的作業系統之上再提供一個Java運行環境(Java Runtime Environment,JRE),
2.JRE由Java虛擬機(Java Virtual Machine,JVM)、類別庫、以及一些核心檔案組成,
3.Java虛擬機的核心是所謂的位元組碼指令,即可以被Java虛擬機直接識別、執行的一種由0、1組成的序列代碼,位元組碼并不是機器指令,因為它不和特定的平臺相關,不能被任何平臺直接識別、執行,
4.Java針對不同平臺提供的Java虛擬機的位元組碼指令都是相同的,Java提供的編譯器不針對特定的作業系統和CPU芯片進行編譯,而是針對Java虛擬機把Java源程式編譯成稱為位元組碼的“中間代碼”,位元組碼是可以被Java虛擬機識別、執行的代碼,
5.Java虛擬機負責解釋運行位元組碼,其原理是:Java虛擬機負責將位元組碼翻譯稱虛擬機所在平臺的機器碼,并讓當前平臺(本地的作業系統)運行機器碼,
6.名稱:
- Java SE(曾稱J2SE):稱為Java標準版或Java標準平臺,Java SE提供了標準的Java Development Kit(JDK),利用該平臺可以開發Java桌面應用程式和低端的服務器應用程式,
- Java EE(曾稱J2EE):稱為Java企業版或Java企業平臺,使用Java EE可以構建企業級的服務應用,Java EE平臺包含了Java SE平臺,并增加了附加類別庫,以便支持目錄管理、交易管理和企業級訊息處理等功能,
7.保存Java源檔案時,如果源檔案有多個類,那么只能由一個類是public類,如果有一個類是public類,那么源檔案的名字必須和這個類的名字完全相同,擴展名是.java,如果源檔案沒有public類,那么源檔案的名字可任意(建議和某個類的名字相同),并且擴展名是.java,
8.一個Java應用程式必須有一個類含有一個public static void main(String[] args)方法,稱這個類為此應用程式的主類
9.命令
- 編譯器:javac.exe,解釋器:java.exe
- 編譯:javac 源檔案名.java,可以只編譯主類的源檔案,Java系統會自動地先編譯主類需要的其他源檔案
- 運行:java 主類名
- 反編譯:javap 類名(因為反編譯的操作物件是.class位元組碼檔案)
- 壓縮為jar包:使用jar.exe命令把一些類的位元組碼檔案壓縮成一個jar檔案,然后將這個jar檔案放到jre的擴展中,即將這個jar檔案放到JDK安裝目錄的jre\lib\ext檔案夾中,
- 生成檔案:使用javadoc.exe命令制作源檔案類結構的html格式檔案
10.當使用Java解釋器運行應用程式時,Java虛擬機首先將程式需要的位元組碼檔案加載到記憶體,然后解釋執行位元組碼檔案,當虛擬機將主類的位元組碼檔案加載到記憶體時,就為主類中的main方法分配了入口地址,以便Java解釋器呼叫main方法開始運行程式,
11.注意main方法不要寫錯,例如漏掉static、mian等錯誤,
12.一個Java程式需經歷的三個步驟:撰寫源檔案、編譯源檔案生成位元組碼和加載運行位元組碼,
第二章:基本資料型別與陣列
1.識別符號:
- 識別符號由字母、下畫線、美元符號和數字組成,長度不受限制
- 識別符號的第一個字符不能是數字字符
- 識別符號不能是關鍵字
- 識別符號不能是true、false和null(盡管它們不是Java的關鍵字)
2.Java語言使用Unicode標準字符集,最多可以識別65536個字符,Unicode字符集的前128個字符剛好是ASCII碼,
3.基本資料型別:
-
邏輯型別:
(1)boolean型:常量:true,false -
整數型別:
(1)byte型:Java中不存在byte型常量的表示法,但可以把一定范圍內的int型常量賦值給byte型變數,
(2)short型:和byte型類似,Java中也不存在short型常量的表示法,但可以把一定范圍內的int型常量賦值給short變數,
(3)int型:常量:123(十進制),077(八進制),0x3ABC(十六進制)
(4)long型:常量:用后綴L來表示,123L(十進制),077L(八進制),0x3ABCL(十六進制) -
字符型別:
(1)char型:常量:‘A’, ‘\t’,如char x = ‘a’;記憶體x中存盤的是97,即字符a在Unicode表中的排序位置,因此也可以寫成char x = 97;, -
浮點型別:
(1)float型:常量后面必須要有后綴f或F,
(2)double型:常量后綴可以有d或D,但允許省略,
4.基本資料型別精度從低到高排序:
byte short char int long float double
注:所占位元組數分別為1,2,2,4,8,4,8
第三章:運算子、表示式和陳述句
5.位運算:
- 按位與運算:&
- 按位或運算:|
- 按位非運算:~
- 按位異或運算:^
(1)位相同位0,位不同為1
(2)例如:a ^ a = 0, a ^ 0 = a
6.for遍歷:for(int i : array){}
第四章:類與物件
1.編程語言的幾個發展階段:
- 面向機器語言:匯編語言 and so on…
- 面向程序語言:C語言 and so on…
- 面向物件語言:Java語言 and so on…
2.面向物件編程的三個特性:封裝、繼承和多型,
3.物件:類宣告的變數被稱為物件變數,簡稱物件,
4.類的結構:
- 類:類包括類宣告和類體
- 類體:類宣告之后的一對大括號"{","}"以及它們之間的內容(大括號之間的內容稱為類體的內容),
- 類體的內容由兩部分組成:變數的宣告和方法的定義,
- 變數的宣告:所宣告的變數稱為成員變數或域變數,成員變數又分為實體變數和類變數,
- 方法的定義:分為方法頭和方法體,方法頭由方法的型別、名稱和名稱之后的小括號以及其中的引數串列所構成,無引數方法定義的方法頭中沒有引數串列,方法體由一對大括號"{","}"以及它們之間的內容組成,方法體的內容包括區域變數的宣告和Java陳述句,方法分為構造方法、實體方法和類方法,
5.UML圖:
- 關聯關系:A類中的成員變數是用B類宣告的物件,A——>B
- 依賴關系:A類中的某個方法是用B類宣告的物件,A------>B
- 繼承關系:
(1)A類是B類的父類,B——I>A
(2)A類(抽象類)是B類的父類,B------I>A - 介面關系:A介面的一個實作是B類,B------I>A
6.物件的記憶體模型:宣告物件后,如Point p,p的記憶體中還沒有任何資料,稱這時的p是一個空物件,空物件不能使用,因為它還沒有任何“物體”,必須再進行為物件分配變數的操作,即為物件分配物體,如p = new Point(),為各變數(實體變數和區域變數)分配記憶體,為類中的實體方法分配入口地址(當類的位元組碼檔案被加載到記憶體時,類的實體方法不會被分配入口地址,只有該類創建物件后,類中的實體方法才被分配入口地址,需要注意的是,當我們創建第一個物件時,類中的實體方法就分配了入口地址,當再創建物件時,不再分配入口地址,從而實體方法可以被類創建的任何物件呼叫執行,也就是說實體方法的入口地址被所有物件共享,當所有的物件都不再存在時,方法的入口地址才被取消; 而類中的類方法,在該類被加載到記憶體時,就分配了入口地址,從而類方法可以被類創建的任何物件呼叫執行,也可以直接通過型別呼叫,類方法的入口地址直到程式退出時才被取消),并計算出一個稱作參考的值(該值包括代表這些變數和方法的記憶體地址及相關重要資訊,
7.物件的參考存在堆疊中,物件的物體存在堆中,Java自動管理堆和堆疊,程式員不能直接設定堆和堆疊,堆疊的優勢是,存取速度比堆快,缺點是,存在堆疊中的資料大小與生存期必須是確定的,缺乏靈活性;堆的優勢是,可以動態地分配記憶體大小,生成期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的資料(兩個物件如果參考相同,則二者具有完全相同的物體,所謂的“垃圾收集”機制,就是周期性的簡稱某個物體是否已不再被任何物件所擁有,如果發現這樣的物體,就釋放物體占有的記憶體),但缺點是,由于要在運行時動態分配記憶體,存取速度較慢,
8.分配給物件的變數被習慣性的稱作物件的物體,沒有物體的物件稱作空物件,空物件不能使用,加入程式中使用了空物件,程式在運行時會出現例外NullPointerException,由于物件可以動態地被分配物體,所有Java編譯器對空物件不做檢查,因此,在撰寫程式時要避免使用空物件,
9.可變引數:
public void f(double a, int … x),可變引數串列x可看作陣列對待,
10.重寫與多載:
首先需要清楚方法頭和方法體的概念,其概念如下:
方法頭: 修飾符+回傳型別 +方法名(形參串列) 例如:public static void main(String []args)
方法體: { }的內容(包括這兩個大括號和內部所有語法)
重寫:與其父類方法方法名、形參串列完全相同;修飾符可以相同,可以不同(但不能降低訪問權限);回傳型別可以相同,也可以是父類方法的子型別;方法體的內容不一樣;所以可以理解成外殼相似,內部不一樣,
例如:假設A類有如下方法:
public void speak(int a){
System.out.println(“A”);
}
B繼承于A,如果B中定義一個方法如下:
public void speak(int b){//(也可以(public void speak(int a))
System.out.println(“B”);
}
則對此個例子來說,稱B類的speak方法重寫了A類中的speak方法
多載:兩個或多個方法的方法頭中除方法名相同外,其他都可以不相同,方法體也不相同,
例如:有一個方法定義為float add(float a, float b),然后,再定義一個方法long add(long a, long b)
11.包:
例如package tome.jiafei;
-
編譯:
(1)進入tom\jiafei的上一層目錄1000編譯,位元組碼默認保存在C:\1000\tom\jiafei中,
C:\1000> javac tom\jiafei\Student.java
C:\1000> javac tom\jiafei\Example.java
(2)使用通配符*,編譯全部源檔案
C:\1000\tom\jiafei> javac *.java -
運行:
必須到tom\jiafei的上一層目錄1000中來運行
C:\1000> java tom.jiafei.Example
12.訪問權限:

第五章:子類與繼承
1.如果子類與父類在同一包中,子類則繼承了父類中不是private的:成員變數、方法,繼承的成員變數和方法的訪問權限不變,如果子類與父類不在同一包中,則父類的private和友好訪問權限的:成員變數、方法,不會被子類繼承,
2.java中子類會不會繼承父類的static變數和static方法:無論是static修飾的變數,還是static修飾的方法,我們都知道他們是屬于類本身的,不是屬于某一個物件的,當宣告一個物件時,并不產生static變數和方法的拷貝,也就是說,用static修飾的變數和方法在類加載的時候,只分配一塊存盤空間,所有此類的物件都可以操控此塊存盤空間,注:這里要說明的是,當子類沒有與之同名的static變數(或方法時),子類的物件也可以操控這塊記憶體空間,但是子類并沒有繼承父類中static修飾的變數和方法,因為static修飾的變數和方法是屬于父類本身的,
3.當用子類的構造方法創建一個子類的物件時,不僅子類中宣告的成員變數被分配了記憶體,而且父類的成員變數也都分配了記憶體空間,但只將其中一部分,即子類繼承的那部分成員變數,作為分配給子類物件的變數,也就是說,如果在同一包中,父類的private成員變數盡管分配了記憶體空間,也不作為子類物件的變數,同樣,如果不在同一包中,那么子類也不繼承父類的友好成員變數,但是不是可以說子類創建物件時似乎浪費了一些記憶體呢,因為當子類創建物件時,父類的成員變數也都分配了記憶體空間,但只將其中一部分作為分配給子類物件的變數,答案是否定的,因為子類中還有一部分方法是從父類繼承的,這部分方法卻可以操作這部分未繼承的變數,
4.當用子類的構造方法創建一個子類物件時,子類的構造方法總時先呼叫父類的某個構造方法,也就是說,如果子類的構造方法沒有明顯地指名使用父類的哪個構造方法,子類就呼叫父類中不帶引數的構造方法,由于子類不繼承父類的構造方法,因此,子類在其構造方法中需使用super來呼叫父類的構造方法,而且super必須是子類構造方法的頭一條陳述句,即如果在子類的構造方法中沒有明顯地寫出super關鍵字來呼叫父類的某個構造方法,那么默認也有super();因此,在父類中定義多個構造方法時,應當包含一個不帶引數的構造方方法,以防子類省略super時出現錯誤,
5.final關鍵字:
- final類不能被繼承
- final方法不能被重寫
- final常量不能變值
6.java上轉型物件的理解,性質,優點:
-
理解:
若A類是B類的父類,當用子類(B類)創建一個物件b,并把此物件的參考賦值給父類(A類)的物件a中時,稱物件a是物件b的上轉型物件,
例如: A a = new A(); a = new B(); -
性質:
●上轉型物件可以訪問子類繼承的成員變數或成員方法也可以訪問子類重寫的成員方法,但不能操縱子類新增的成員變數或成員方法,
●可以將上轉型物件強制轉回為子類物件,

-
優點:
方便面向介面的編程思想和面向抽象的編程思想,(上轉型物件可理解為樹的主干,其每個子類可理解為樹枝),
7.多型性:指父類的某個方法被其多個子類重寫時,這多個子類可以按自己的需求,重寫此方法產生各自的功能行為,
8.java抽象類的例子,性質,優點:
- 例如:
public abstract class A {
abstract int add(int x,int y);
int sub(int x,int y) {
return x-y;
}
}
-
性質:
●抽象類的類名前加修飾符abstract,可以包含抽象方法(用abstract修飾,只有方法原型,沒有方法的實作),也可以包含非抽象方法,可包含常規類能包含的任何成員;
●抽象類是沒有具體實體物件的類,不能使用new方法進行實體化,只能用作超類,只有當子類實作了抽象超類中的所有抽象方法,子類才不是抽象類,才能產生實體,如果子類中仍有抽象方法未實作,則子類也只能是抽象類;
●只有抽象類才可以包含抽象方法, -
抽象方法的優點:
1.隱藏具體細節資訊,所有的子類使用的都是相同的方法原型,其中包含了呼叫該方法時需要了解的全部資訊;
2.強迫子類完成指定的行為,規定所有子類的標準行為,
9.java介面的介紹,性質,例子,優點:
- 介紹:
●介面包括介面宣告和介面體,介面體包括常量的定義(必有初值),方法的宣告(無方法體),
例如:
interface Shape2D {
public static final double pi = 3.14;//public static final可省略
public abstract double area();//public abstract可省略
}
-
性質:
●介面可理解為純抽象類;
●介面沒有構造方法;
●常量(final),方法(public abstract,注意實作類中方法的訪問權限為public);
●類實作某一介面要實作此介面的所有方法;
●介面的拓展:介面可繼承(extends)多個超介面, -
優點:
●建立類和類之間的“協議”口將類根據其實作的功能分組用介面代表,而不必顧慮它所在的類繼承層次;
這樣可以最大限度地利用動態系結,隱藏實作細節;
●實作多繼承的思想,
10.java介面回呼及介面多個性質的例子:
interface Shape {
public static final double pi = 3.14;//public static final可省略
public abstract double area();//public abstract可省略
}
interface another{
//只用來做多繼承思想的說明
}
class Circle implements Shape,another{//為多繼承思想的體現
double radius;//新增變數
public Circle(double r) {//新增方法
radius = r;
}
public double area() {//實作介面的方法
return (pi*radius*radius);
//呼叫介面中的pi常量(可理解為繼承過來的)
}
}
public class Exampleke9 {
public static void main(String[] args) {
Circle cir = new Circle(2.0);
System.out.println("Area of cir = "+cir.area());
Shape shape;//宣告介面變數
shape = new Circle(2.0);//介面變數中存放物件的參考
System.out.println("Area of cir = "+shape.area());
//shape.area()為介面回呼,若多個類implements一個介面,介面回呼可以體現多型性
}
}
11.abstract類與介面的比較:
abstract類除了提供重要的需要子類重寫的abstract方法外,也提供了子類可以繼承的變數和非abstract方法,
如果某個問題需要使用繼承才能更好地解決,例如,子類除了需要重寫父類的abstract方法外,還需要從父類繼承一些變數或繼承一些重要的非abstract方法,就可以考慮abstract類,
如果某個問題不需要繼承,只是需要若干個類給出某些重要的abstract方法的實作細節,就可以考慮使用介面,
12.自定義例外類:
一個方法在宣告時可以使用throws關鍵字宣告要產生的若干個例外,并在該方法的方法體中具體給出產生例外的操作,即用相應的例外類創建物件,并用throw關鍵字拋出該例外物件,導致該方法結束執行,程式必須在try-catch塊陳述句中呼叫可能發生例外的方法,try部分中發生例外時,try部分立刻結束執行,執行跳轉到catch部分,其中catch的作用就是捕獲throw關鍵字拋出的例外物件,
13.斷言:
斷言陳述句可以在某個錯誤發生時,要求程式必須立即停止執行,在除錯代碼階段非常有用,當程式正式運行時,就可以關閉斷言陳述句,使用assert關鍵字宣告,
第八章:常用實用類
1.String類常用方法:
- public int length()
- public boolean equals(String s)
- public boolean startsWith(String s) / endsWith(String s)
- public int compareTo(String s)
- public boolean contains(String s)
- public int indexOf(String s [, int startpoint]) / lastIndexOf(String s)
- public String substring(int startpoint [, endpoint])
- public String trim()
- public static String valueOf(其他型別 n)
- public void getChars(int start, int end, char[] c, int offset)
- public char[] toCharArray()
- public byte[] getBytes([String charsetName])
- public String replaceAll(String regex, String replacement)
- public String[] split(String regex)
2.StringTokenizer類:是String物件的分析器,可以分解String物件的字符序列,StringTokenizer物件稱為字串分析器,
3.StringBuffer類:可變字串物件,
4.正則運算式:


5.Date類、Calendar類與日期的格式化
6.Math類、BigInteger類和Random類
7.數字格式化:String.format()
8.Class類:該類的實體可以幫助程式創建其他類的實體,創建物件最常用的方式就是使用new運算子和類的構造方法,實際上也可以使用Class物件得到某個類的實體,
(1)public static Class forName(String className) throws ClassNot FoundException,該方法回傳一個和引數className指定的類相關的Class物件,如果該類在某個包中,className必須帶有包名,
(2)public Object newInstance() throws InstantiationException, IllegalAccessException,該方法使用Class物件呼叫newInstance()實體化一個className類的物件時,className類必須有無引數的構造方法,
9.Console類:在鍵盤上輸入一行文本時,不讓該文本回顯,即不再命令列顯示,
10.Pattern類與Matcher類
第九章:組件與事件處理
1.Java Swing概述:
- 容器類(Container)和組件類(Component),javax.swing包中JComponent類是java.awt包中Container類的一個直接子類,是java.awt包中Component類的一個間接子類,
- Component類的子類或間接子類創建的物件稱為一個組件,
- Container的子類或間接子類創建的物件稱為一個容器,
- 可以向容器中添加組件,Continer類提供了一個public方法add(),
- 容器呼叫removeAll()可以移除容器中所有組件,remove(Component c)可以移除某個組件,
- 容器本身也是一個組件,可以把一個容器添加到另一個容器中,
- 每當容器添加新的組件或移除組件時,應當讓容器呼叫validate()方法,以保證容器中的組件能正確顯示出來,
- 一個基于GUI的應用程式應當提供一個能和作業系統直接互動的容器,該容器可以直接被顯示、繪制在作業系統所控制的平臺上,例如顯示幕上,這樣的容器被稱作GUI設計中的底層容器,Java提供的JFrame類的實體就是一個底層容器,即通常所稱的視窗,
- 如果應用程式需要一個和用戶互動的按鈕,那么該按鈕必須出現在底層容器中,否則用戶無法看見,更無法操作,
- JFrame類時Container類的間接子類,當需要一個視窗時,可使用JFrame或其子類創建一個物件,視窗也是一個容器,可以添加組件,視窗默認被系統添加到顯示幕螢屏上,因此不允許將一個視窗添加到另一個容器中,
- 創建的普通容器習慣性地稱為中間容器,中間容器需要添加到底層容器中才能發揮作用,
2.常用容器:
- JPanel面板
- JTabbedPane選項卡窗格
- JScrollPane滾動窗格
- JSplitPane拆分窗格
- JLayeredPane分層窗格
3.常用布局:
- FlowLayout布局
- BorderLayout布局
- CardLayout布局
- GirdLayout布局
- null布局
- BoxLayout布局
4.常用組件:
-
JTextField(文本框)
-
JTextArea(文本區)
-
JButton(按鈕)
-
JLabel(標簽)
-
JCheckBox(復選框)
-
JRadioButton(單選按鈕)
-
JComboBox(下拉串列)
-
JPasswordField(密碼框)
-
附圖

5.事件:

第十章:輸入、輸出流

未完待續…
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231572.html
標籤:java
上一篇:Java 8 中的方法參考,輕松減少代碼量,提升可讀性!
下一篇:java UDP實作一個聊天工具
