OOP Day03
====================
關于類:
一個Java源文件只能有一個public class
文件名與公有類類名一致
源文件中可以有多個類, 但是不能都是公有的
如果沒有公有類, 文件名與某個類類名一致
一般情況下: 一個源文件一個類, 類是公有的!
類體(class body)中的成員:
屬性
方法
構造器
語句塊(以後講, 很少用)
成員不能重複!
屬性名不能重複
方法簽名不能重複
構造器簽名不能重複
1 方法簽名(方法的識別關鍵字)
方法簽名 = 方法名+參數類型列表
Java 類中不能存在相同方法簽名的方法
方法重載: 方法名一樣, 方法簽名不同的方法
char[] chs = {‘A’,’B’,’C’};
int[] ary = {‘A’,’B’,’C’};
System.out.println(chs);//ABC// println(char[])
System.out.println(ary);//[[@34ADCD//println(Object)
System.out.println(ary.toString());// [[@34ADCD
System.out.println(‘A’);//A // println(char) 打印字符
System.out.println(65);//65// println(int) 打印整數
打人
打牌
方法重載就是: 動詞的多意現象, 打人, 打牌, 打醬油, 打車
就是行爲的多態
洗衣服, 洗手, 洗照片
保存聯系人, 保存通話記錄, 保存訪問過的地址
save(Contact) save(Log) save(Url) save(Message)
2 java方法參數的傳遞規則: 基于值的傳遞, 是變量值的複制,
1) 基本類型就是其中值的複制,
2) 引用類型是引用值(地址)的複制, 對象不複制!
案例: ParamaterDemo.java
* 變量的值: a 基本類型的值是其本身,
b 引用變量的值是一個地址值,是被引用對象的首地址.
爲了避免引用參數傳遞的副作用, 建議一切結果使用
返回值帶回.
繼承, 類型的繼承
繼承涉及到語法:
屬性, 方法
構造器, 方法覆蓋
* A 繼承體現了自然邏輯系統中的分類關系
* B 父類型聲明所有子類的公共特征(公共屬性)和行爲(公共方法)
* C 子類可以繼承父類型的可以繼承的屬性和方法.
* D 繼承可以實現代碼的複用(重用), 子類可以不用再定義了
* E 子類可以聲明特有的屬性和方法, 叫: 特化(具體化, 特殊化)
* F 子類可以覆蓋(重寫)父類型的功能, 實現多態行爲
* 如: 具體鳥(企鵝)可能修改了父類型(鳥類)飛翔的行爲(多態)
3 繼承 用來表達概念上具體化延續的具體概念.
1 * 子類繼承父類的屬性和方法 (子類可見的方法)
2 * 構造器不能繼承!
3 實例化子類,會遞歸分配所有父類的空間
4 子類構造器一定調用父類構造器
* 類一定有構造器
4 關于繼承中的構造器:
1 * 子類構造器中, 一定調用父類構造器。
2 子類構造器 默認調用父類無參數構造器!
3 如果父類沒有無參數構造器,就必須在子類中明確指定調用
父類的有參數構造器!
4 使用super()調用父類構造器,必須寫在子類構造器第一行
this() 必須寫在子類構造器第一行
5 編程建議:所有的類都提供無參數構造器!減少繼承時候的
麻煩。
5 關于對象的實例化過程:
* 1 按需加載類(Koo.class) 以及所有的父類型, 只加載一次!
* 2 遞歸調用所有父類構造器(從最高的父類執行 A-B-C)
* 父類中
* A 分配父類屬性空間, 自動初始化爲默認值
* B 執行屬性初始化賦值
* C 執行父類構造器過程
* 子類中
* D 分配子類屬性空間, 自動初始化爲默認值
* E 執行子類屬性初始化賦值
* F 執行子類構造器過程
* 3 最後創建的對象(子類實例), 包含所有父類型聲明的屬性空間
*
* super 關鍵字:
* A super() 在構造器的第一行, 調用父類構造器, 默認自動添加
* B super在子類中代表父類型對象的引用, 用來訪問父類型的屬性/方法
* 如: super.a 訪問父類型實例的a屬性
* super.a() 訪問父類型的方法
* this 關鍵字:
* A this() 在構造器的第一行, 調用本類的構造器, 有this() 就
* 不再默認自動添加super()
* B this 代表當前對象的引用, 用來訪問當前對象的屬性, 和方法
* 如: this.a this.a()
* 如果能夠區別局部變量和屬性(實例變量), 可以省略this.
所有類默認繼承于Object=>所有類都是Object(東西)=>啥都是東西
繼承表達”是” 的關系
7 繼承中的語法現象
1 父類型變量可以引用子類型的實例,父類型的實現是多態的!
2 子類可以覆蓋父類的方法,修改父類的行爲。
* 方法覆蓋:子類覆蓋了父類“相同方法簽名”的方法。
方法的覆蓋是由方法動態綁定實現的,就是Java虛擬機運行
時候確定執行那個那個對象那個方法,java最終執行子類的方法。
作業:
1 練習課題案例
2 實現如下案例:
設計圖形(Shape)類及其子類(Circle、Rectangle)
(Shape 有屬性: Point(x,y) 是圖形位置,
1)Shape提供計算面積方法area,子類覆蓋
2) Shape提供檢查是否包含指定坐標的方法,子類覆蓋
3 試題(Question), 單選題(SingleChoice)和
多選題(MultiChoice)之間的繼承關系
要求:
1) Question 包含題幹屬性(text)
2) Question 包含檢測標准答案的方法
boolean check(int[] answers)
answers 是用戶提供的答案, 是單選就應該只有一個答案
3)MultiChoice和SingleChoice是Question類的子類,
MultiChoice 包含屬性
選項: String[] options
多選標准答案: int[] answers
SingleChoice 包含屬性
選項: String[] options
單選標准答案: int answer
4) 在MultiChoice實現參數爲(String text,
String[] options, int[] answers)的構造方法,
其中:
text 是題幹,
options 是選項,
answers 是多選標准答案, 是正確選項的序號
5) 在SingleChoice實現參數爲(String text,
Stirng[] options, int answer)的構造方法。
其中:
text 是題幹,
options 是選項,
answer 是標准答案, 是正確選項的序號
6)在MultiChoice和SingleChoice類中重寫
Question類check方法 提供具體的檢查用戶答案的邏輯
預習: final static Object
重要代碼演示說明:
單選題與多選題問題
/*選擇題父類 Question.java*/
/** 選擇題, 考題 是繼承的父類型, 要派生出子類型: 單選題和多選題
* A 繼承體現了自然邏輯系統中的分類關系
* B 父類型聲明所有子類的公共特征(公共屬性)和行爲(公共方法)
* C 子類可以繼承父類型的可以繼承的屬性和方法.
* D 繼承可以實現代碼的複用(重用), 子類可以不用再定義了
* E 子類可以聲明特有的屬性和方法, 叫: 特化(具體化, 特殊化)
* F 子類可以覆蓋(重寫)父類型的功能, 實現多態行爲
* 如: 具體鳥(企鵝)可能修改了父類型(鳥類)飛翔的行爲(多態)
**/
public class Question {
String title;//題幹
String[] options;//選項
public void print(/* Question this */){//打印題
System.out.println(this.title);
for(int i=0; i['A','B','C']
//方法是動態綁定到對象的方法上! 編譯期間按照類型檢查!
if(question.check(answers)){
System.out.println("行呀!");
}else{
System.out.println("還需努力!");
}
}
}
}