1. Java知識
本章節介紹Java的一般文法知識,以及面向對象的繼承,封裝,多态的基本實作方法。
1.1. 構造函數
構造函數沒有傳回值;并且可以重載;不會被重載。
class Person{
Person(){
}
Person(sting name, int age){
}
}
1.2. this
指的是對象的那個成員變量。一般new了一個對象後,通過在class中使用this可以通路到new出來的對象的那些成員變量。
通過this可以為不同的對象做目前對象的成員通路進行控制。
1.3. static
a. 靜态成員變量:static string name;
所有new出來的對象都使用同一個成員變量,一改全改。
b. 靜态函數static void funcA();
靜态函數隻能通路靜态成員變量,不能通路非靜态變量。
c. 靜态代碼塊
Static{
}
靜态代碼塊沒有名字,如何調用?作用是什麼呢?
靜态代碼塊無需調用,裝載該類的時候執行,主要作用是為靜态變量賦初始值。
1.4. 繼承
class Student extends Person{
}
Java隻支援單繼承。一個子類隻能繼承一個父類,一個父類可以被多個子類繼承。
目的是将沒有差別的代碼定義在父類中,将差別的内容新定義一個類,實作分别的功能。
減少重複代碼。
1.5. 子類的執行個體化過程
a. 生成子類的過程
在子類的構造函數中,必須先調用父類的構造函數。自己不寫,編譯器會自動加入無參數的構造函數。
自己寫代碼,則通過super()來實作。至于怎麼調用,則有super()的參數決定。
子類為什麼必須調用父類的構造函數呢?構造函數為對象配置設定空間,子類不調用父類的構造函數,如何配置設定空間,沒有空間也就沒有辦法進行通路。
b. 使用super調用父類的方法
使用super()調用可以通路父類的構造函數,以消除重複代碼。
super(name, age); 子類調用父類的構造函數。
必須要是調用函數的第一條語句。
原因:為了解決子類無法繼承父類的構造函數,通過super實作子類通路父類的構造函數的功能。
1.6. 函數的複寫
overwrite。在具有父子關系的兩個類當中,子類定義一個與父類完全相同的函數(函數名,傳回值,參數清單),覆寫父類對應的函數。這樣在new對象時,将調用子類的方法。
與overload的比較:重載是在同一個類當中,定義一些類函數名稱相同其他不同的函數,這樣就是重載。
應用:對繼承到的父類的方法,有不滿意的話,可以通過複寫來實作自己的方法。
通過super實作子類調用父類的成員函數。super.eat()。
應用:當複寫時,如果發現自己隻是在父類基礎上增加一些功能,可以先調用super.eat()實作部分功能,然後再實作自己的功能。
1.7. 對象的轉型
對象的多态性的展現。
a. 概念:向上轉型:将子類的對象指派給父類的引用。一定成功。
Student student = new Student();
Person person = stu;
使用方法:
一個引用能夠調用哪些成員(函數&方法)取決于這個引用的類型。
比如,stu轉成了per以後,per不能調用stu下的方法。
轉型後調用重載的函數:
一個引用調用的是哪一個方法取決于這個引用的指向。
比如,per調用introduce方法,父子類都有的方法,就執行子類的方法。
b. 概念:向下轉型:将父類的對象指派給子類的引用。不一定成功。
先把一個對象向上轉型,在強制進行向下轉型。
Student student 1 = new Student();
Person person = student;
Student student 2 =( Student) person;
使用方法
一個引用能夠調用哪些成員(函數&方法)取決于這個引用的類型。
1.8. 抽象類和抽象方法
a. 抽象類
abstract Person{
string name;
abstract void eat();
}
注意:
· 一個類當中,擁有一個或多個抽象函數必須被定義為抽象類。基于本限制,子類可以複寫父類的抽象函數。
· 抽象類不能生成對象,抽象類天生就是當爹的,用來被繼承。
· 如果有一個類,不想讓别人生成對象,可以将其定義為抽象類。
· 抽象類為基類,最基礎的類。
· 抽象類可以有構造函數。因為存在super通路的問題,沒有構造函數,如何實作通路super的成員變量,抽象類提供構造函數為子類通路。
b. 抽象函數:隻有函數的定義,沒有函數體的函數。
abstract int eat();
問題:抽象函數沒有函數體,調用時候執行什麼呢?
解答:由于抽象類不能生成對象,隻能用來被繼承,子類通過複寫父類的抽象函數,讓自己沒有抽象函數,進而實作可以進行生成對象。
基于此說法,父類定義抽象函數,可以實作規定子類必須實作某些方法。
c. 抽象類的作用。
定義一些必須實作的方法,保證在編譯的語義上防止子類漏實作必須的功能。
1.9. 軟體包的權限問題
a. package關鍵字
将class放置到一個包中,使用package關鍵字實作;實際在編譯時使用-d來實作指定編譯。通路有package的需要具體指定該class的路徑執行。
這樣,其實一個類的實際的名字就是helloworld.test。
包名的命名:包名的字母必須小寫;一般情況下為域名倒過來寫(如org.honeuwell.person定義了類)。
一個類的全名:包名+類名。
b. 權限問題
如果兩個類,不在一個包當中,必須寫類的全路徑。Default
· Public:解決兩個類在不同包中的問題。
如果兩個類不在統一個包中,沒有定位儀public,則兩外一個包中無法通路該類。
在一個包的外部調用一個類的方法或成員變量,必須把一個類的方法或成員變量定義為public。
· Private:隻能在目前的class中使用,不能外部使用。
一般情況隻能修飾變量和方法。
· Default
為同一個包中的通路,不同包是不行的。繼承後,子類是不能通路
· Protected
該字段主要與繼承相關。
如果子類與父類不在同一個包中,子類無法繼承到父類的default成員變量和方法?實際應該是可以繼承到,不能通路是因為權限不夠。
隻能修飾成員變量與方法,可以實作跨包通路。
與public相比,public為包外部所有的class都可以通路,而protected在包外部隻有子類能夠使用該成員變量和方法。
c. Import
可以使用import關鍵字導入一個類,如:import org.android.mypackage.*
1.10. 接口
a. 定義&文法
· 使用interface定義。
Interface USB{
Public void plugin();
}
· 接口中的方法全部為抽象方法,通路權限為public。
· 使用implement關鍵字實作類似類繼承的操作。在class中在實作對接口中的抽象方法進行實作。
· 一個類可以實作多個接口,一個類隻能繼承一個父類。
Class Phone implement USB, WiFi{
}
· 一個接口可以繼承多個接口。
Interface A extend B, C{
}
b. 應用
結合着接口的特性,接口的應用場景也就很好了解。
對比靜态工廠模式的實作。
到這裡,可以部分地了解設計模式的定義與産生的原因。