天天看點

Java&Android學習總結(1)

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.      應用

結合着接口的特性,接口的應用場景也就很好了解。

對比靜态工廠模式的實作。

到這裡,可以部分地了解設計模式的定義與産生的原因。