學號20162321 2016-2017-2 《程序設計與數據結構》第七周學習總結
教材學習內容總結
-
關鍵概念
- 多態引用在不同的時候可以指向不同類型的對象
- 多態引用在運行時才將方法調用與它的定義綁定在一起
- 引用變量可以指向聲明繼承於它的任意類的任何對象
- 對象的類型,而不是引用的類型,決定調用的是方法的哪個版本
- 接口是一組抽象方法,所以不能被實例化
- 繼承可適用於接口,所以一個接口可派生於另一個接口
- 接口引用可以指向實現這個接口的任意類的任何對象
- 方法的參數可以是多態的,這樣使方法具備了對其參數進行控制的靈活性
- 在偵聽器和所偵聽組件之間建立關系是通過多態完成的
-
重點總結
- 當一個類給出了接口中定義的每個抽象方法的實現是,就稱類實現了接口
- 如果接口中的某個方法沒在類中實現,則編譯錯誤
- 接口只保證類實現了某些方法,但它不限制類可以有其他的行為
- 多個類可以實現同一個接口,並在類中提供它們各自對方法的定義
- 接口中還可以包含常量,這些常量用final修飾符來定義
- 子接口繼承父接口中的所有抽象方法和常量。實現子接口的任何一個類必須實現所有的方法
- 接口中所有成員都是公有的
教材學習中的問題和解決過程
- 問題1:如何理解書中
對象的類型,而不是引用的類型,決定調用的是方法的那個版本
-
解決思路:當一個父類對象的引用變量,它引用子類對象時,決定調用誰的成員方法的條件是:被引用對象的類型而不是引用變量的類型。但是這個被調用的方法必須是在父類中定義過,也就是子類覆蓋過的方法。
-
問題2:關於動態綁定
1.關於綁定
綁定指的是一個方法的調用與方法所在的類(方法主體)關聯起來。對java來說,綁定分為靜態綁定和動態綁定;或者叫做前期綁定和后期綁定.
2.靜態(前期)和動態(后期)綁定
靜態:在程序執行前方法已經被綁定,java當中的方法只有final,static,private和構造方法是前期綁定。(個人認為將方法聲明為final既是為了方法被覆蓋也是為了關閉動態綁定,static,private由於不能被繼承所以在編譯時就可以確定值)
動態:在運行時根據具體對象的類型進行綁定。
3.動態綁定的細節(來自網絡)
- 編譯器檢查對象的聲明類型和方法名。假設我們調用x.f(args)方法,並且x已經被聲明為C類的對象,那么編譯器會列舉出C類中所有的名稱為f的方法和從C類的超類繼承過來的f方法
- 接下來編譯器檢查方法調用中提供的參數類型。如果在所有名稱為f 的方法中有一個參數類型和調用提供的參數類型最為匹配,那么就調用這個方法,這個過程叫做“重載解析”
- 當程序運行並且使用動態綁定調用方法時,虛擬機必須調用同x所指向的對象的實際類型相匹配的方法版本。假設實際類型為D(C的子類),如果D類定義了f(String)那么該方法被調用,否則就在D的超類中搜尋方法f(String),依次類推
4.我的例子
public class Testme {
public static void main(String[] args){
Father people = new Son();
people.high();
}}
class Father{
public void high(){
System.out.println("170");}}
class Son extends Father{
public void high(){
System.out.println("120");}}
聲明了Father類型變量people但它指向是一個Son的對象,其調用Son的方法,因為在運行時發生了動態綁定,在綁定過程中需要確定調用哪個版本的high方法實現。
- 問題3:關於接口的繼承問題
- 描述:書中介紹繼承的概念出適用於類外,還適用於接口,那么接口繼承是否和類繼承一般不支持多繼承。
(來自網絡)java接口可以多繼承。
Interface Extends Interface0, Interface1, interface3
不允許類多重繼承的主要原因是,如果A同時繼承B和C,而B和C同時有一個D方法,A如何決定該繼承那一個呢?
但接口不存在這樣的問題,接口全都是抽象方法繼承誰都無所謂,所以接口可以繼承多個接口。
代碼調試中的問題和解決過程
- 問題1:static關鍵字
- 描述:在做實驗時有如下代碼
public class Mydoc {
Document d;
public static void main(String[] args) {
d = new Document(new IntFactory());
d.DisplayData();
d = new Document(new FloatFactory());
d.DisplayData();
}
}
此時程序提示Non-static filed 'd' cannot be referenced from a static context
- 解決過程:因為靜態方法不會對具體的對象進行操作,所以它們不能引用只在類的實例中才存在的實例變量。所有的靜態方法,包括main方法,都只能訪問靜態變量或局部變量。
所以static Document d
代碼托管
- 代碼截圖
上周考試錯題總結
- 1.如果有以下的程序代碼:
Int x=100;
Int y=100;
Integer wx=x;
Integer wy=y;
System.out.println(x==y);
System.out.println(wx==wy);
在JDK5以上的環境編譯與執行,則顯示的結果是[true,true]
- 1.分析:不了解Integer類
Integer 類在對象中包裝了一個基本類型 int 的值。Integer 類型的對象包含一個 int 類型的字段。
此外,該類提供了多個方法,能在 int 類型和 String 類型之間互相轉換,還提供了處理 int 類型時非常有用的其他一些常量和方法。
- 2.如果有以下的程序代碼:
int[] arr1 = {1, 2, 3};
int[] arr2 = new int[arr1.length];
arr2 = arr1;
for(int value : arr2) {
System.out.printf("%d", value);
}
以下描述何者正確? [執行時顯示:123]
- 分析;fot-each語句,等價於下列語句
int value
while(arr2.hasNext()){
myBook = bookList.next();
System.out.println(value);}
結對及互評
- 本周結對學習情況
- 20162327
- 結對學習內容
- Complex復數類
- Junit單元測試
- 刪除數組元素
- 上周博客互評情況
其他(感悟、思考等,可選)
- 轉瞬間書本已經過半了,知識還很散,需要一次總結。
- 這周的實驗介紹了Junit進行單元測試,但對於編寫好的測試代碼還有很大很大的不足。
- 課外的知識汲取很有必要,沒事可以多看看別人的博客,交流經驗
- 多看課外書,這周的讀書讓我感受很多,收獲很多
第二次試驗Java面向對象程序設計
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第五周 | 200/1500 | 2/6 | 20/20 | |
第六周 | 200/1700 | 1/7 | 18/38 | |
第七周 | 500/2100 | 2/9 | 20/58 | |
第八周 | 000/0000 | 0/0 | 00/00 |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:XX小時
-
實際學習時間:XX小時
-
改進情況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)