標籤:tin 情境 out image 文法 建立 value tcl 構造方法
動手實驗1:
運行 TestInherits.java 樣本,觀察輸出,注意總結父類與子類之間構造方法的調用關係修改Parent構造方法的代碼,顯式調用GrandParent的另一個建構函式,注意這句調用代碼是否是第一句,影響重大!
1)輸出結果:
2)結論:通過 super 調用基類構造方法,必須是子類構造方法中的第一個語句。
動手實驗2:
參看ExplorationJDKSource.java樣本
此樣本中定義了一個類A,它沒有任何成員:
class A { }
樣本直接輸出這個類所建立的對象
public static void main(String[] args) {
System.out.println(new A());
}
1)輸出結果:
2)結論:前面樣本中,main方法實際上調用的是:public void println(Object x),這一方面內部調用了String類的valueOf方法。valueOf方法內部又調用Object.toString方法:public String toString() {
return getClass().getName() +"@" + Integer.toHexString(hashCode());
}
hashCode方法是本地方法,由JVM設計者實現:public native int hashCode();
動手實驗3:
我們來看一段代碼(樣本Fruit.java ):
注意最後一句,一個字串和一個對象“相加”,得到以下結果:
結論:在“+”運算中,當任何一個對象與一個String對象,串連時,會隱式地調用其toString()方法,預設情況下,此方法返回“類名 @ + hashCode”。為了返回有意義的資訊,子類可以重寫toString()方法。
動手實驗4:物件導向語言為什麼要引入“介面”?
先來看一個現實生活中的執行個體:
鴨子是一種鳥,會遊泳,
同時又是一種食物。
如何使用物件導向的思想,為上述情境建立一個 系統模型(建模)?
什麼叫“建立一個系統模型”?
簡單地說,就是”你打算設計哪些類來“模擬” 鴨子這一現實事物?
因為“鴨子是一種(IS_A)鳥,又是一種(IS_A)食物”,所以我們可以建立三個類,Bird代表鳥,Food代表食物,Duck代表鴨子,讓Duck派生自Bird和Food。
這個方案存在的問題:
(1)Java不支援多繼承
(2)“會遊泳”這個方法放在哪個類中?放到Bird中似乎並不合適,因為只有部分鳥類會遊泳。放到Duck中也不好,因為會遊泳的水鳥不止鴨子一種
能否把“會遊泳”、“能被吃”這種特性獨立出來作為一種“可選項”,可以被“附加”到具體對象上?
這樣一來,水鳥可以擁有“會遊泳”這個特性,其它種類的鳥就不具備這個特性,但它可能有其他的特性。
在物件導向世界中,可以使用“介面(interface)”來抽象對象的行為特性。
public interface IFood {
public void Cook();
}
public class Duck extends Bird implements IFood{
public void Cook() {
……
}
……
}
Java中“介面”的文法特性
定義一個介面,採用關鍵字interface,實現一個介面,採用關鍵字implements
介面的成員函數自動成為public的,資料成員自動成為
static和final的。
如果介面不聲明為public的,則自動變為package。
一個類可以同時實現多個介面。
介面的使用:
IFood f = new Duck();
介面類型 介面類型的變數=new 實現了介面的具體類型()
可以通過繼承介面來擴充已有介面,並形成一個新的介面。
介面的補充:
interface OneInterface {
void f1();
}
interface TwoInterface extends OneInterface {
void f2();
}
實現子介面的類,必須實現“父”“子”介面所定義的所有方法,才能被執行個體化(即new出一個對象)。
利用介面定義常量
public interface ArrayBound {
public static final int LOWBOUND=1;
public static final int UPBOUND=100;
}
只要一個類聲明實現了這個介面,就可以直接使用這些常量名
在實際開發中,這種編程方式非常常見。
注意:定義在介面中的常量必須被初始化。
介面與抽象類別的區別:
抽象類別是一個不完全的類,而介面只是表明類應該具有哪些“外部”特徵,不涉及任何實現細節。
介面基本上不具備繼承的任何具體特點,它僅僅承諾了外界能夠調用的方法。
一個類一次可以實現若干個介面,但一個類只能繼承一個父類。
java課堂練習7