面向對象語言的三大特性:封裝、繼承、多态
确切地說,那些沒有聲明成static的部分,才是對象的原型。
(static的被稱為類變量和類方法,由屬于該類的所有對象共享)
對象中的變量,稱為“屬性”或"執行個體變量"。
實作各種行為的過程和函數,稱為"方法"。
建立對象執行個體
如果不使用new的話,隻有對象的引用(也就是指針)而沒有配置設定記憶體空間。
Student jolin = new Student();
Student jolin = new Student("Jolin","female",160,21);//構造函數
類的繼承
class 子類名稱 extends 父類名稱
Java子類不能繼承父類的構造函數。
重寫(或覆寫):即子類中的同名函數會取代父類的執行個體方法。
不過,對于父類中的類方法,子類想要覆寫它必須也将該同名函數定義為類方法來取代它,稱為“隐藏”。
隐藏父類的成員變量
隻要變量名稱相同,就算資料類型不同,也一樣可以隐藏父類的成員變量。
如何在子類中,使用父類的構造函數、被重寫的方法、被隐藏的成員變量?
super.xxx(父類中的函數名)
接口
隻有常量和抽象方法(隻有聲明,沒有實作)。
寫法:
IArea是一個接口,類使用implements實作接口。
接口也可以不止一個,用逗号分隔。
常量類型:
final
interface IArea{
final double PI = 301415926;
void area();
}
class Circle implements IArea{
public void area(){
//計算圓面積
}
}
接口也可以繼承。
在Java中,類不允許多重繼承(表示父類不止一個),但卻允許接口的多重繼承。
接口一定是抽象類。
抽象類
除了有抽象方法,也可以有屬性(變量)和操作。
寫法:
abstract class Account{
private string id;
private double amount;
public abstract void calInterest();//抽象方法
double getBalance(){...};//抽象類中也可以有操作
}
抽象類可以用來作為資料類型,聲明引用子類的對象變量。
因為父類的對象變量可以引用子類的對象。(也就是父類的指針可以指向子類吧。)
比如:
Java可以同時繼承抽象類且實作接口
常量類
避免繼承,防止子類通路和重寫
嵌套類
嵌套類的特點
- 成品和零件的關系
- 嵌套類也是外層類的成員
-
擁有相同的通路權限
在Java程式檔案中隻允許有一個public的類,而且程式檔案名需與此類名相同。
匿名嵌套類,通常用于Java的Swing開發和Android接口元件的事件處理。
使用類繼承來實作多态
動态綁定
多個子類實作同一抽象方法,在調用時根據對象的類型決定實際調用的方法。
包
即namespace,在Java中稱作packages。
packages是一組相關類和接口的集合,簡單來說,包是面向對象程式設計的零件庫,程式開發者可以直接選用包中現成的各種類零件,組合零件來建立對象集合,完成Java應用程式的開發。
建立包
package xxx.myShape;
導入包和類
import xxx.myShape.Circle;//導入Circle類
import xxx.myShape.* //導入整個包(含包中的所有類)
異常處理
在Java程式執行時産生的異常是一個對象,屬于Thorwable類或其子類的執行個體對象。兩種子類如下:
- Error類:嚴重錯誤,會導緻程式終止運作,無法使用異常處理
- Exception類:可以進行補救
try{
//檢查是否産生異常對象,抛出
...
}
catch(ExceptionType e){
//(抛出異常後才執行的)異常處理
...
}
finally{
//可有可無,主要是進行程式善後
//不論異常是否産生都會執行
...
}
可以用多個catch同時處理多種類型的異常。
集合對象
舊版Java中主要指 Vector和Hashtable對象。
JDK 1.2後的版本提供Java Collections Framework(集合架構),這是儲存和處理集合對象的統一軟體架構。
泛型
類似C++的templates
提供編譯階段的集合對象類型檢查功能,可以減少程式代碼中取出集合對象所需的大量類型轉換。
寫法
使用泛型
HashSet<Byte> hset0 = new HashSet<Byte>();
HashSet<Float> hset0 = new HashSet<Float>();
HashSet<String> hset0 = new HashSet<String>();
Java SE7 支援下,可以簡寫為