閱讀645 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java 筆記02

繼承:

父類(SuperClass)和 子類(SonClass)。

父類的非私有化屬性和方法可以默認繼承到子類。

Class Sonextends Father{

}

而如果父類中的私有方法被子類調用的話,則編譯報錯。

 

父類的構造方法子類不可以繼承,更不存在覆蓋的問題。(非構造方法可以)

如果子類訪問父類的構造方法,則在編譯的時候提示訪問不到該方法。

JAVA中不允許多繼承,一個類有且隻有一個父類(單繼承)。

JAVA的數據結構為樹型結構,而非網狀。(JAVA通過接口和內部類實現多繼承)

 

方法的覆蓋(overriding)

方法的重載並不一定是在一個類中:子類可以從父類繼承一個方法,也可以定義一個同名異參的方法,也稱為overloading。

當子類從父類繼承一個無參方法,而又定義了一個同樣的無參方法,則子類新寫的方法覆蓋父類的方法,稱為覆蓋。(注意返回值類型也必須相同,否則編譯出錯。)

如果方法不同,則成重載。

 

對於方法的修飾詞,子類方法要比父類的方法範圍更加的寬泛。

父類為public,那麼子類為private則出現錯誤。

之所以構造方法先運行父類再運行子類是因為構造方法是無法覆蓋的。

以下範圍依次由嚴到寬:

private :本類訪問;

default :表示默認,不僅本類訪問,而且是同包可見。

Protected:同包可見+不同包的子類可見

Public :表示所有的地方均可見。

 

當構造一個對象的時候,係統先構造父類對象,再構造子類對象。

構造一個對象的順序:(注意:構造父類對象的時候也是這幾步)

①  遞歸地構造父類對象;

②  順序地調用本類成員屬性賦初值語句;

③  本類的構造方法。

 

Super()表示調用父類的構造方法。

Super()也和this一樣必須放在第一行。

This()用於調用本類的構造方法。

如果沒有定義構造方法,那麼就會調用父類的無參構造方法,即super()。

 

要養成良好的編程習慣:就是要加上默認的父類無參的構造方法。

思考:可是如果我們沒有定義無參的構造方法,而在程序中構造了有參的構造方法,那麼如果方法中沒有參數,那麼係統還會調用有參的構造方法麼?應該不會。

 

多態:多態指的是編譯時類型變化,而運行時類型不變。

多態分兩種:

①  編譯時多態:編譯時動態重載;

②    運行時多態:指一個對象可以具有多個類型。

 

對象是客觀的,人對對象的認識是主觀的。

例:

Animal a=new Dog();查看格式名稱;

Dog d=(Dog)a。聲明父類來引用子類。

(思考上麵的格式)

 

運行時多態的三原則:(應用時為覆蓋)

1、   對象不變;(改變的是主觀認識)

2、           對於對象的調用隻能限於編譯時類型的方法,如調用運行時類型方法報錯。

在上麵的例子中:Animal a=new Dog();對象a的編譯時類型為Animal,運行時類型為dog。

注意:編譯時類型一定要為運行時類型的父類(或者同類型)。

對於語句:Dog d=(Dog)a。將d強製聲明為a類型,此時d為Dog(),此時d就可以調用運行時類型。注意:a和d指向同一對象。

3、           在程序的運行時,動態類型判定。運行時調用運行時類型,即它調用覆蓋後的方法。

 

關係運算符:instanceof

a instanceof Animal;(這個式子的結果是一個布爾表達式)

a為對象變量,Animal是類名。

上麵語句是判定a是否可以貼Animal標簽。如果可以貼則返回true,否則返回false。

在上麵的題目中: a instanceof Animal返回 True,

                 a instanceof Dog也返回 True,

instanceof用於判定是否將前麵的對象變量賦值後邊的類名。

Instanceof一般用於在強製類型轉換之前判定變量是否可以強製轉換。

 

如果Animal a=new Animal();

Dog d=Dog()a;

此時編譯無誤,但運行則會報錯。

 

Animal a=newDog()相當於下麵語句的功能:

Animala=getAnimal();

Public staticAnimal.getAnimal;

Return newDog();

 

封裝、繼承、多態為麵向對象的三大基石(特性)。

 

運行時的動態類型判定針對的是方法。運行程序訪問的屬性仍為編譯時屬性。

 

Overloading針對的是編譯時類型,不存在運行時的多態。

 

習題:建立一個shape類,有circle和rect子類。

Shape類有zhouchang()和area()兩種方法。

(正方形)squ為rect子類,rect有cha()用於比較長寬的差。

 

覆蓋時考慮子類的private及父類的public(考慮多態),之所以這樣是避免調用A時出現實際調用B的情況。而出現錯誤。

11.29下午講的是教程上的Module6

Module6-7包括:麵向對象高級、內部類、集合、反射(暫時不講)、例外。

麵向對象高級、集合和例外都是麵向對象的核心內容。

 

 

麵向對象高級:   修飾符:

static:①可修飾變量(屬性);②可修飾方法;③可修飾代碼塊。

Static int data語句說明data為類變量,為一個類的共享變量,屬於整個類。

Int data為實例變量。

例:

static intdata;

m1.data=0;

m1.data++的結果為1,此時m2.data的結果也為1。

Static定義的是一塊為整個類共有的一塊存儲區域,其發生變化時訪問到的數據都時經過變化的。

其變量可以通過類名去訪問:類名.變量名。與通過訪問對象的編譯時類型訪問類變量為等價的。

 

Publicstatic voidprintData(){}

表明此類方法為類方法(靜態方法)

靜態方法不需要有對象,可以使用類名調用。

靜態方法中不允許訪問類的非靜態成員,包括成員的變量和方法,因為此時是通過類調用的,沒有對象的概念。This.data是不可用的。

 

一般情況下,主方法是靜態方法,所以可調用靜態方法,主方法為靜態方法是因為它是整個軟件係統的入口,而進入入口時係統中沒有任何對象,隻能使用類調用。

 

覆蓋不適用於靜態方法。

靜態方法不可被覆蓋。(允許在子類中定義同名靜態方法,但是沒有多態,嚴格的講,方法間沒有多態就不能稱為覆蓋)

當static修飾代碼塊時(注:此代碼塊要在此類的任何一個方法之外),那麼這個代碼塊在代碼被裝載進虛擬機生成對象的時候可被裝載一次,以後再也不執行了。

一般靜態代碼塊被用來初始化靜態成員。

 

Static通常用於Singleton模式開發:

Singleton是一種設計模式,高於語法,可以保證一個類在整個係統中僅有一個對象。>/���0ϛ

區分實例變量和局部變量時一定要寫this。

最後更新:2017-04-02 16:47:43

  上一篇:go Android: ViewPager and Fragments
  下一篇:go android界麵研究 :Activity的Title設置