第五章 類和對象
1,面向對象概述
類和對象的定義面向對象程序設計具有以下特點:
封裝性:封裝是面向對象編程的核心思想,將對象的屬性和行爲封裝起來,其載體就是類。
類通常對客戶隱藏其實現細節,這就是封裝的思想。繼承性:類和類之間的聯繫(子類和父類),增加代碼的複用性,減少出錯的機率。
Java中將多繼承改成了接口,降低了代碼的複雜性。多態性:多態允許以統一的風格編寫程序,以處理種類繁多的已存在的類及相關類。根據父類統一化的風格處理,可以實例化子類對象
由於整個事件的處理只依賴於父類的方法,日後只要維護和調整父類的方法即可,降低了維護的難度。
2,類的基本知識
- 成員變量:在Java中對象的屬性也稱爲成員變量
- 成員方法:在Java中使用成員方法對應於類對象的行爲
權限修飾符:private,protected,public
public private protected
- 本類 可見 可見 可見
- 同包其他類或子類 不可見 可見 可見
- 其他包的類或子類 不可見 不可見 可見
- 當聲明類時不使用public、protected、private修飾符設置類的權限,則這個類預設爲包存取範圍,即只有一個包中的類可以調用這個類的成員變量或成員方法。
局部變量:如果在成員方法內定義一個變量,那麼這個變量被稱爲局部變量。局部變量在方法執行時創建,在方法執行結束時被銷燬。
- 局部變量在使用時必須進行賦值操作或初始化,否則會出現編譯錯誤。
- 局部變量的有效範圍:在互不嵌套的區域可以定義同名、同類型的的局部變量,在嵌套區域重複定義局部變量,編譯器會報錯。
this關鍵字:在Java語言中規定使用this關鍵字來代表本類對象的引用,this關鍵字被隱式的用於引用對象的成員變量和方法。
事實上,this引用的就是本類的一個對象構造方法:構造方法是一個與類同名的方法,對象的創建就是通過構造方法完成。每當類實例化一個對象時,類都會自動調用構造方法。
如果類中沒有明確定義構造方法,編譯器會自動創建一個不帶參數的默認構造方法。(如果定義了,則不會默認設置無參的構造方法)
可以在無參構造方法中使用this關鍵字調用有參的構造方法,但需要注意的是只可以在無參構造方法中的第一句使用this調用有參構造方法。
super關鍵字:
- 1.調用父類的構造方法
子類可以調用父類聲明的構造方法。但是必須在子類的構造方法中使用super關鍵字來調用。 - 2.操作被隱藏的成員變量和被覆蓋的成員方法
如果想在子類中操作父類中被隱藏的成員變量和被覆蓋的成員方法,也可以使用super關鍵字。
- 1.調用父類的構造方法
靜態變量、常量和方法:
被聲明爲static的變量、常量和方法被稱爲靜態成員。一般使用“類名.靜態成員”形式調用。
靜態數據與靜態方法的作用通常是爲了提供共享數據或方
法,如數學計算公式等。靜態成員同樣遵循着public、private和protected修飾符的約束。在靜態方法中不可以使用this關鍵字;
在靜態方法中不可以直接調用非靜態方法。
在Java中規定不能將方法體內中的局部變量聲明爲static的。
類的主方法:主方法是類的入口點,它定義了程序從何處開始;主方法提供對程序流向的控制,Java編譯器通過主方法來執行程序。
主方法的語法:public static void main(String[] args){}
- 主方法是靜態的,所以如果直接在主方法中調用其他方法,則該方法必須也是靜態的。
- 主方法沒有返回值。
- 主方法的形參爲數組。
3,對象
對象的創建:在Java語言中通過new操作符創建對象。每實例化一個對象就會自動調用一次構造方法,實質上這個過程就是創建對象的過程。
- 也就是說,可以在Java語言中使用new操作符調用構造方法創建對象。
- 在Java語言中對象的初始化與創建是被捆綁在一起的。
- 引用只是存放一個對象的內存地址,並非存放一個對象,嚴格地的說引用和對象是不同的。
對象的比較:在Java語言中有兩種對象的比較方式,分別爲“==”運算符和equals()方法。
- equals用於比較兩個對象引用所指的內容是否相等;String類中的該方法實際上是覆寫了Object類中的該方法。
- “==”比較的是兩個對象引用的地址是否相等。
對象的銷燬:其他語言中需要手動回收廢棄的對象,但Java擁有一套完整的垃圾回收機制,垃圾回收器將自動回收無用的但佔用內存的資源。
被Java虛擬機視爲垃圾的情況主要包括兩種:
- 對象引用超過其作用範圍,這個對象將被視爲垃圾。
- 將對象賦值爲null。
垃圾回收器只回收由new操作符創建的對象,其他的由Java中的finalize()方法回收。
由於垃圾回收器不受人爲控制,具體執行時間也不確定,所以finalize()方法也就無法執行。爲此,Java提供了System.gc()方法強制啓動垃圾回收器。
第六章 接口、繼承與多態
1,類的繼承
Object類:Java中所有的類都直接或間接繼承了java.lang.Object類。Object是所有類的父類。
Object類中主要包括euqals(),toString(),finalize()
等方法Object中的幾個重要的方法:
getClass()方法:該方法是Object類定義的方法,它會返回對象執行時的Class實例,然後使用此實例調用其他方法。
toString()方法:該方法的功能是將一個對象返回爲字符串形式,它會返回一個String實例。
在實際的應用中通常重寫toString()方法,爲對象提供一個特定的輸出模式。
當一個類轉換爲字符串或與字符串連接時,將自動調用重寫toString()方法。equals()方法:equals()方法的默認實現是使用“==”運算符比較兩個對象的應用地址,而不是比較對象的內容,
所以要想正真做到比較兩個對象的內容,需要在自定義類中重寫equals()方法。
對象類型的轉換:主要包括向上轉型和向下轉型。
向上轉型:例,Object obj=new Person();由於向上轉型是從一個較具體的類到較抽象的類的轉換,所以它總是安全的。
向下轉型:在做向下轉型操作時,將特性範圍小的對象轉換爲特性範圍大的對象肯定會出現問題,所以這時需要告知編譯器要做向下轉型的操作。
將父類對象強制轉換爲某個子類對象,這種方式稱爲顯示類型轉換。
使用instanceof操作符判斷對象類型:在程序執行向下轉型的操作時,如果父類對象不是子類對象的實例(Object obj=new Person()),就會發生ClassCastException異常,所以在執行向下
轉型之前需要養成一個良好的習慣,就是判斷父類對象是否爲子類對象的實例。使用格式:父類對象名 instanceof 子類類型;返回值爲布爾值。
2,方法的重載
- 參數類型不同,構成重載
- 參數個數不同,構成重載
- 參數順序不同,構成重載
不定長方法的語法如下:
返回值 方法名(參數數據類型… 參數名稱);在參數列表中使用“…”定義不定長參數,其實這個不定長參數就是一個數組。
3,多態
利用多態可以使程序具有良好的擴展性,並可以對所有類對象進行通用處理。
4,抽象類與接口
抽象類:
abstract是定義抽象類的關鍵字
使用abstract關鍵字定義的類稱爲抽象類,而使用這個關鍵字定義的方法稱爲抽象方法,抽象方法沒有方法體,這個方法本身沒有任何意義,除非它被重寫。
承載這個抽象方法的抽象類必須被繼承,實際上抽象類除了被繼承之外沒有任何意義。
如果聲明一個抽象方法,就必須將承載這個抽象方法的類定義爲抽象類,不可能在非抽象類中獲取抽象方法。
接口:
接口是抽象類的延伸,可以將它看做是純粹的抽象類,接口中的所有方法都沒有方法體。
接口使用interface關鍵字進行定義。
在接口中定義的方法必須被定義爲public或者abstract形式,其他修飾權限不被Java編譯器認可,即使不將該方法聲明爲public形式,它也是public。
在接口中定義的任何字段都自動是static和final的。
Java中多繼承的語法爲:Class 類名 implements 接口1,接口2,… ,接口n
第七章 類的高級特性
1,Java類包
Java中提供了一種管理類文件的機制,就是類包。類包名一般設定Internet爲域名,避免了包名衝突。
使用import關鍵字導入包,導入包時在包指定後加上“*”,這表示可以在程序中使用包中的所有類。
可以使用import導入靜態成員,語法:
import static 靜態成員;導入後,可以在主方法中直接使用這些靜態成員。
2,final關鍵字
final變量:由final定義的變量通常爲常量,且final關鍵字定義的變量必須在聲明時對其進行賦值操作。
定義爲final的數據無論是常量、對象還是數組,在主函數中都不可以被改變。
一個被定義爲final的對象只能指向唯一一個對象,不可以將它再指向其他對象,但一個對象本身的值卻是可以改變的,要做到使一個常量真正做到不可更改,
可以將常量聲明爲static final。
Java中定義全局變量,通常使用public static final修飾,這樣的常量只能在定義時被賦值。
final方法:定義爲final的方法不能被重寫。
將方法定義爲final類型可以防止子類修改該類的定義與實現方式,同時定義爲final的方法的執行效率要高於非final方法。
如果一個父類的某個方法被設置爲pivate修飾符,子類將無法訪問該方法,自然無法覆蓋,所以一個定義爲private的方法隱式被指定爲final類型,
這樣無須將一個定義爲private的方法再定義爲final類型。
final類:定義爲final的類不能被繼承。
- 如果將某個類設置爲final形式,則類中的所有方法都被隱式設置爲final形式,但final類中的成員變量可以被定義爲final或非final形式。
3,內部類
內部類可以分爲成員內部類、局部內部類以及匿名類
成員內部類:在一個類中使用內部類,可以在內部類中直接存取其所在類的私有成員變量。
在內部類中可以隨意使用外部類的成員方法以及成員變量,儘管這些類成員被修飾爲private。
內部類可以訪問它的外部類成員,但內部類的成員只有在內部類的範圍之內是可知的,不能被外部類使用。
如果在外部類和非靜態方法之外實例化內部類對象,需要使用外部類。
例,OuterClass out=new OuterClass();//內部類的對象實例化操作必須在外部類的非靜態方法中實現 OuterClass.innerClass in=out.doit();//doit()方法中有return new innerClass(); OuterClass.InnerClass in2=out.new innerClass();//也可以在外部類中實例化內部類。
局部內部類:暫時先忽略。。。
匿名內部類:匿名內部類的所有實現代碼都需要在大括號之間進行編寫。語法如下:
return new A(){ //內部類體 } 匿名內部類編譯以後,會產生以“外部類名$序號”爲名稱的.class文件,序號以1~n排列,分別代表1~n個匿名內部類。
第八章 String類
1,創建字符串
Java語言中字符串必須包含在一對雙引號之內。
String str=null;如果忽略null,表示str變量是未初始化的狀態,否則表示聲明的字符串的值等於null;
String類的常用構造方法包括String(char[] a);String(char[],int offset,int length);等方法
除了使用String類構造方法創建字符串變量外,還可以通過
字符串常量的引用賦值給一個字符串變量。
字符串的連接:
Java中一句相連的字符串不能分開在兩行中寫。如果字符串太長,可以用“+”連接
System.out.println(“I like”+
“Java”);和其他數據類型的連接:會自動調用toString()方法,將其轉換爲字符串,然後參與連接。
2,字符串的操作
獲取字符串的信息:
獲取字符串長度:str.length();
字符串查找:String類提供了兩種查找字符串的方法,即indexOf()與lastIndexOf()方法。
indexOf(String s);該方法返回字符串s在指定字符串中首次出現的索引位置。如果沒有檢索到s,該方法返回-1;
lastIndexOf(String str);該方法用於返回指定字符串最後一次出現的索引位置。同樣沒有檢索到,返回-1;
如果該方法中的參數是空字符串“”(沒有空格),返回的結果與調用該字符串length()方法返回的結果相同。獲取指定索引位置的字符串:charAt(int index);
獲取子字符串:通過substring()方法可對字符串進行截取。
substring(int beginIndex);該方法返回的是從指定的索引位置開始截取直到該字符串結尾的子串。
subString(int beginIndex,int endIndex);該方法返回的是從某一索引位置開始截取至某一索引位置結束的子串。包含頭,不包含尾。
去除空格:trim返回字符串副本,忽略前導空格和尾部空格。 str.trim();
字符串替換:replace()方法可實現將指定的字符或字符串替換成新的字符或字符串。
語法:str.replace(char oldChar,char newChar);
如果要替換的字符oldChar在字符串中重複出現多次,replace()方法會將所有oldChar全部替換成newChar。
判斷字符串的開始與結尾:startsWith()方法與endsWith()方法分別用於判斷字符串是否以指定的內容開始或結束。這兩個方法的返回值都爲boolean類型。
startsWith()該方法用於判斷當前字符串對象的前綴是否是參數指定的字符串。
endsWith()該方法用於判斷當前字符串是否以給定的子字符串結束。
判斷字符串是否相等:使用equals()方法和equalsIgnoreCase()方法。
按字典順序比較兩個字符串:compareTo()方法爲按字典順序比較兩個字符串,該比較基於字符串中各個字符的Unicode值,按字典順序將此String對象表示的字符序列
與參數字符串所表示的字符序列進行比較。
如果按字典順序此String對象位於參數字符串之前,則比較結果爲一負整數;
如果按字典順序此String對象位於參數字符串之後,則比較結果爲一正整數;
如果這兩個字符串相等,則結果爲0。
字母大小寫轉換:str.toLowerCase()和str.toUpperCase()。
字符串分割:使用split()方法可以使字符串按指定的分割字符或字符串對內容進行分割。
split(String sign);其中sign爲分割字符串的分隔符,也可以使用正則表達式。
如果想定義多個分割符,可使用符號“|”。例如,“,|=”表示分隔符分別爲”,”和”=”。
split(String sign,int limit);該方法可根據給定的分隔符對字符串進行拆分,並限定拆分的次數。
格式化字符串:String類的靜態方法用於創建格式化的字符串。format()方法有兩種重載形式。
format(String format,Object…args);該方法使用指定的格式字符串和參數返回一個格式化字符串,格式化後的新字符串使用本地默認的語言環境。
format(Local l,String format,Object…args);local l爲格式化過程中要應用的語言環境。如果l爲null,則不進行本地化。
可以實現日期格式化、時間格式化和格式化常見的日期時間組合
例,Date date=new Date(); String s=String.format("%te",date);//需要熟悉一些常用的日期格式化轉換符。 常規類型格式化可應用於任何參數類型。
使用正則表達式:正則表達式通常用於判斷語句中,用來檢查某一字符串是否滿足某一格式。
例如,”\d”表示數字0~9中的任何一個。
在正則表達式中”.”代表任何一個字符,因此在正則表達式中如果想要使用普通意義的點字符”.”,必須使用轉義字符”\”。
郵箱地址的正則表達式:”\w+@\w+(\.\w)*\.\w+”。
StringBuffer和StringBuilder:
StringBuffer:就是字符串緩衝區。用於存儲數據的容器。
特點:1,長度是可變的;2,可以存儲不同類型的數據;3,最終要轉成字符串進行使用;可以對字符串進行修改。
1,添加:
StringBuffer append(data); StringBuffer insert(index,data);
2,刪除:
StringBuffer delete(start,end):包含頭,不包含尾。 StringBuffer deleteCharAt(int index):刪除指定位置的元素
3,查找:
char charAt(index); int indexOf(string); int lastIndexOf(string);
4,修改:
StringBuffer replace(start,end,string); void setCharAt(index,char);
增刪改查 C(create)U(update)R(read)D(delete)
StringBuider:jdk1.5後出現了和StringBuffer一模一樣的對象,就是Stringbuider。
- StringBuffer是線程同步的,Stringbuilder是線程不同步的。
- 所以StringBuffer通常用於多線程,Stringbuilder通常用於單線程,提高了效率。
第九章 包裝類和Math類
Java.lang包中的Integer類、Long類和Short類,分別將基本類型int、long和short封裝成類。
這些類都是Number的子類,區別就是封裝不同的數據類型,其包含的方法基本相同。
例,Integer number=new Integer("45");要以數值型String變量作爲參數,否則會拋異常。
重點介紹Integer類中的parseInt()方法,該方法返回與調用該方法的數值字符串相應的整型值。
toString(); toBinaryString(); toHexString(); toOctalString();這些方法分別將值轉換成十進制、二進制、十六進制和八進制的字符串。
其他的包裝類還有Boolean、Byte、Character、Double、Float。
Math類:Java語言中提供了一個執行數學基本運算的Math類,該類包括了常用的數學運算方法,還提供一些常用的數學常量。方法基本上是靜態的。
常用的數學運算方法:sin();exp();sqrt();等方法。
取整函數的方法:主要包括ceil(),floor(),round()等方法。
隨機數:Java中主要提供了兩種方式產生隨機數,分別爲Math()類的random()方法和Random類。
Math.random()方法:默認生成大於等於0.0小於1.0的double型隨機數。
Random類:可以通過實例化一個Random對象創建一個隨機數生成器。在Random類中提供了獲取各種數據類型隨機數的方法。