1. 程式人生 > >j2se學習中的一些零碎知識點2

j2se學習中的一些零碎知識點2

語句塊 繼承多態 this和super以及final 接口 抽象類

1、static修飾的變量叫做“靜態變量”(靜態變量,被存儲在方法區中,所有的java對象共享靜態變量,所有靜態變量是類級別的,使用“類名.”的方式訪問。),static修飾的方法叫做“靜態方法”(靜態方法中不能夠直直接訪問非靜態數據。工具類中的方法大部分都是靜態方法。 ),static還可以定義靜態語句塊。(靜態語句塊的語法為:static{java語句},靜態語句塊在類中可以有一個,也可以有多個。靜態語句塊在類加載的階段執行,並且執行一次。並且(如果有多個靜態語句塊)是自上而下依次執行。)

- 實例語句塊在每次調用構造方法之前執行,且(如果有多個實例語句塊)是自上而下依次執行。語法:{java語句}。

- 靜態的方法按照正規的方式“類名.”訪問,靜態的方法也能夠使用“引用.”訪問。(編譯階段會檢查出引用的類型,編譯通過,運行的時候,仍然使用“類名.”的方式去訪問,靜態方法執行不需要對象。)

- 成員變量在創建對象的時候初始化,靜態變量在類加載階段賦值,並且只賦值一次。

- 什麽是設計模式:設計模式是可以重復利用的解決方案,從結構上可以分為三類:創建型、結構型和行為型。最簡單的設計模式是單例設計模式:為了保證JVM中某一個類型的java對象永遠只有一個,節省內存的開銷。實現懶漢式單例設計模式的簡單方式:將構造方法私有化,並對外提供一個公開獲取這個類的對象的方法(該方法為靜態方法,采用(類名.)的方式調用。),以及在類中提供一個這個類類型的靜態變量。(懶漢式用到對象的時候才會創建。)(==兩邊如果是基本數據類型,可以比較這兩個基本數據類型是否相等,==兩邊如果是引用數據類型,則比較的是內存地址。)

- 餓漢式單例設計模式:在類加載時已經創建單例對象。

技術分享


2、引用類繼承最基本的作用是代碼重用。語法:[修飾符] class 子類名 extends 父類名。

- java語言中,類和類之間只支持單繼承。一個類如果沒有顯示的繼承其他類,則該類默認繼承Object。Object是SUN提供的java中的根類。(繼承是面向對象的重要概念,軟件中的繼承和現實中的繼承概念是一樣的)

- java語言中子類繼承父類,會將父類中所有數據全部繼承(構造方法無法被子類繼承),包括私有的也能夠繼承過來,但是在子類中無法直接訪問父類中的私有的數據,但是可以間接訪問。(通過setter和getter方法訪問和修改私有數據)

- 方法的覆蓋或者說是方法的重寫:(override或者overwrite)如果父類中的方法無法滿足當前子類中的業務需求,需要將父類中的方法進行重新寫一遍。(如果子類重寫父類中的方法之後,子類對象一定調用的是子類重寫的方法)。

- 發生方法覆蓋的條件:1、發生在具有繼承關系的兩個類之間;2、具有相同的方法名、相同的返回值類型、相同的參數列表;3、重寫的方法不能比被重寫的方法擁有更低的訪問權限;4、重寫的方法不能比被重寫的方法拋出更寬泛的異常;5、私有的方法不能被覆蓋;6、構造方法無法被覆蓋,因為構造方法無法被繼承;7、靜態的方法不存在覆蓋;8、覆蓋指的是成員方法,和成員變量無關。(繼承最基本的作用是代碼重用,最重要的作用是方法可以重寫。)


3、java語言中向上轉型(upcasting,子類轉父類)和向下轉型(downcasting,父類轉子類),無論是向上轉型還是向下轉型,兩個類之間必須要有繼承關系。

- 向上轉型又稱為自動類型轉換,父類型的引用指向子類型的對象(如Animal a = new Cat();),程序分為編譯階段和運行階段兩個階段,編譯階段只知道a是一個Animal類型,而程序在運行的時候堆中實際對象是Cat類型。(a.eat();)程序在編譯階段a被編譯器看作是Animal類型,所以程序在編譯階段a因喲i功能綁定的是Animal類中的eat方法(靜態綁定);而程序在運行的時候堆中的實際對象是Cat類型,而Cat已經重寫了eat方法,所以程序在運行階段對象綁定的方法是Cat中的eat()方法。(動態綁定)

- 向下轉型又稱之為強制類型轉換。(需要註意,Animal a = new Dog();Cat c = (Cat)a;編譯階段能夠通過,但是程序在運行期可能會出錯,會報java.lang.ClassCastException異常,所以在做強制類型轉換的時候是存在風險的。)

- 為了避免ClassCastException的發生,java引入了instanceof。用法:instanceof運算符結果是boolean類型。(Cat a = new Cat();if(a instanceof Cat){Cat c = (Cat)a};如果結果是true,a引用指向堆中的java對象是Cat類型。)

- 多態的作用:項目的耦合度降低,項目的擴展能力增強。(盡量不要面向具體編程,面向父類型進行編程,面向抽象編程)


4、super不是引用類型,super中存儲的不是內存地址,super指向的不是父類對象,而是代表當前子類對象中的父類型特征。

- 什麽時候使用super?父類和子類中都有某個數據或者相同的方法,如果要在子類中訪問父類中的屬性或者方法,需要使用(super.)的方式。

- super可以使用在什麽地方?super可以在成員方法中;(super和this相同,都不能直接用在靜態上下文中)

- super關鍵字用在構造方法中,語法為:super(實參);,通過子類的構造方法去調用父類的構造方法,作用是給當前子類對象中的父類型特征賦值。(如果一個構造方法第一行如果沒有this(...);也沒有顯式地調用super(...);系統會默認調用super();)。super(...);的調用只能夠放在構造方法的第一行中,和this(...);一樣,所以this(...);和super(...);不能共存。

- 需要註意的是,super(...)調用了父類的構造方法,但是並不會創建父類對象。(構造方法執行不一定創建對象)

- 在java語言中,只要是創建了java對象,那麽Object中的無參數構造方法一定會執行。

- 父類的構造方法並不會被子類繼承,但是可以被子類調用。(單例模式的類型無法被繼承,即單例模式的類型沒有子類。原因是單例模式構造方法私有化,子類的構造方法無法使用super();調用父類的私有構造方法。)


5、final修飾的類無法被繼承,final修飾的方法無法被覆蓋,final修飾的局部變量一旦賦值,不可再改變,final修飾的成員變量必須“顯式的”初始化。class A{final int i;}編譯無法通過。(要麽final修飾的成員變量手動初始化,要麽在構造方法調用結束之前賦值也行。如class A{final int i = 1200}或者class A{final int = k; A(){k = 1200;}} )(一般情況下,final修飾的成員變量一般和static連用,稱之為常量。)

- 常量為值不可改變的變量,要求所有的常量大寫。


6、如何定義抽象類:class關鍵字前加上abstract。(抽象類無法被實例化,即抽象類無法創建對象。)

- 雖然抽象類沒有辦法實例化,但是抽象類也有構造方法,該構造方法是給子類創建對象使用的。

- 抽象類中可以定義抽象方法,抽象方法的語法為:在方法的修飾符列表中添加abstract關鍵字,並且抽象方法應該以“;”結束,不帶“{}”。(例如:public abstract void m();)

- 抽象類中不一定有抽象方法,但是抽象方法必須出現在抽象類中。

- 一個非抽象類繼承一個抽象類,必須將抽象類中的抽象方法覆蓋。

- 抽象類不能被final修飾;抽象方法不能被final修飾。(顯示為非法的修飾符組合)

- final修飾的引用類型,該引用不可再重新指向其他的java對象,但是final修飾的引用,該引用指向

的對象的屬性是可以修改的。


7、接口也是一種引用類型,可以等同看作類。

- 如何定義接口,語法為:[修飾符] interface 接口名{}(需要註意的是,接口中只能夠出現常量和抽象方法)

- 接口其實是一種特殊的抽象類,特殊在於接口是完全抽象的。

- 接口中也沒有構造方法,是無法被實例化的。

- 接口和接口之間可以進行多繼承。

- 一個類可以實現多個接口。(一個類實現一個接口,需要使用implements關鍵字,implements和extends意義相同,這裏的實現可以等同看作繼承。),一個非抽象的類實現接口,需要將接口中的所有的方法“實現”。(或者說是重寫)

- 在接口中常量用public static final修飾,public static final可以省略。接口中所有的抽象方法都是public abstract,public abstract可以省略。

- 接口的作用:1、可以使項目分層,所有層都面向接口開發,開發效率提高;2、接口使代碼和代碼之間的耦合度降低,就像內存條和主板的關系,變得“可插拔”,可以隨意地切換。

- 接口和抽象類都能完成某個功能,優先選擇接口。(因為接口可以多實現,多繼承,並且一個類除了實現接口之外,還可以去繼承其他類,保留了類的繼承。)



本文出自 “12392717” 博客,請務必保留此出處http://12402717.blog.51cto.com/12392717/1969685

j2se學習中的一些零碎知識點2