Java SE(2)

1.this的兩種用法:(1)當成員變量和局部變量重名是,能夠用關鍵字this來區分 。this表明對象,表明的是this所在函數所屬對象的引用(哪一個對象調用了this所在的函數,this就表明哪一個對象)(一個類中的成員想要被執行就必須有對象調用。靜態除外)  (2)this能夠用於在構造函數中調用其它構造函數(注意:只能定義在構造函數的第一行,由於初始化時必須被先執行)java

2.static關鍵字的特色:(1)static修飾符,使用於修飾成員(成員變量、成員函數) (2)static修飾的成員被全部的對象所共享設計模式

3.static優先於對象存在,由於static的成員隨着類的加載就已經存在。static修飾的成員多了一種調用方式,能夠直接用 類名.靜態成員 調用。static修飾的數據是共享數據,對象中存儲的是特有對象函數

4.成員變量(又叫實例變量)與靜態變量(又叫類變量)的對比:(1)兩個變量的聲明週期不一樣:成員變量隨着對象的建立而存在,隨着對象的被回收而釋放。靜態變量隨着類的加載而存在,隨着類的消失而消失。(2)調用方式不一樣:成員變量只能被對象調用;靜態變量能夠被對象調用,還能夠被類名調用 (3)別名不一樣:成員變量又叫實例變量;靜態變量又叫類變量 (4)存儲位置不一樣:成員變量存儲在堆內存的對象中,因此也叫對象的特有資源;靜態變量存儲在 方法區(靜態區),因此也叫對象的共享數據this

5.靜態使用的注意事項:(1)靜態方法只能訪問靜態成員(靜態變量、靜態函數。)靜態先在(隨着類的加載而存在)、非靜態後在(隨着對象的建立而存在),先在的不能夠訪問後在的,後在的能夠訪問先在的,即靜態的不能夠訪問非靜態的,但非靜態的能夠訪問靜態多的 ,也能夠訪問非靜態的 (2)靜態方法中不能使用this或super關鍵字  (3) 主函數是靜態的。spa

6.想要調用一個方法有兩種方式:類調用、方法調用。設計

7.方法區分爲靜態區和非靜態區。非靜態區裏全部成員都有一個this所屬,由於非靜態區只能被對象調用。靜態區中所屬都是類名。靜態成員前省略的是類名,非靜態前省略的是thiscode

8.靜態何時用?對象

(1)靜態變量:當分析對象中所具有的成員變量值都是相同的時,這個成員變量能夠用靜態修飾;只要數據在對象中都是不一樣的,就是對象的特有屬性,必須存儲在對象中,是非靜態的。blog

(2)靜態函數:函數是否用靜態修飾,就參考一點,就是該函數是否有訪問到對象的特有屬性,簡單點說從源代碼看,該功能是否須要訪問非靜態的成員變量,若是須要,該功能就是非靜態的;若是不須要,能夠將該功能定義成靜態的,固然也能夠定義成非靜態的。(對象是封裝特有數據的,若是方法沒有訪問特有數據,則對象的建立是沒有意義的,沒有訪問特有數據,能夠將該功能定義成靜態的,直接用類名調用便可)繼承

(3)靜態代碼塊:隨着類的加載而執行,並且只執行一次。

做用:用於給類進行初始化(注意:並非全部的類都經過構造函數初始化的,有的類是不須要建立對象就能夠完成初始化操做。若是類中全是靜態成員,則類不須要對象,只用靜態代碼塊便可初始化類)

(4)構造代碼塊:能夠給全部的對象進行初始化。(具有對象初始化的通用性)

(5)構造函數:是給對應的對象進行鍼對性的初始化(具有針對特定對象的初始化)

(6)局部代碼塊:限定局部變量的聲明週期

 1 /**
 2  * 需求: 寫一段代碼,分別驗證靜態代碼塊、代碼塊、構造函數在 
 3  * 一、初始化對象的時候的執行順序 
 4  * 二、直接用類名調用該類的靜態變量時的執行的順序
 5  * @param args
 6  */
 7 //執行順序:靜態代碼塊-->代碼塊-->構造函數
 8 public class TestFirstDemo {
 9 
10     public static void main(String[] args) {
11         
12         new StaticCodeConstructor();//初始化對象
13         String haha = StaticCodeConstructor.test;
14         sop(haha);    
15     }
16     //從新定義打印功能
17     public static void sop(Object obj){
18         System.out.println(obj);
19     }
20 }
21 
22 class StaticCodeConstructor{
23     //靜態代碼塊
24     static {
25         System.out.println("靜態代碼塊-->");
26     }
27     //代碼塊
28     {
29         System.out.println("代碼塊-->");
30     }
31     //構造函數
32     StaticCodeConstructor(){
33         System.out.println("構造函數-->");
34     }
35     //定義一個靜態變量
36     public static final String test = "靜態變量";   
37 }

9.執行順序:靜態代碼塊-->構造代碼塊-->構造函數

10.23種設計模式:對問題行之有效的解決方式,是一種解決問題的思想。

單例設計模式解決的問題是:能夠保證一個類在內存中的惟一性。

必須對於多個程序使用同一個配置信息對象時,需保證該對象的惟一性,那麼如何保證對象的惟一性?

(1)不容許其餘程序用new 建立該類對象

(2)在該類中建立一個本類實例

(3)對外提供一個方法,讓其餘程序能夠獲取該對象

11.單例模式步驟:(1)私有化該類的構造函數 (2)經過new,在本類中建立一個本類對象  (3)定義一個公有的方法,將建立的對象返回

12.單例的例子:

 1 public class Single {
 2     private static final Single s = new Single();//經過new在本類中建立一個本類對象
 3     private Single(){};//私有化該類的構造函數
 4     public static Single getInstance(){//定義一個公有的方法,將建立的對象返回
 5         return s;
 6     }
 7 }
 8 
 9 class SingleDemo{
10     public static void main(String[] args){
11 //        餓漢式或者懶漢式
12     }
13 }

13.繼承:(抽取)

java僅支持單繼承

單繼承:一個子類只能有一個直接父類

多繼承:一個子類能夠有多個直接父類(java不支持,但進行了改良),不直接支持的緣由是,當多個父類中有相同成員時,會產生調用的不肯定性

14.java支持多重繼承(多層繼承即繼承體系),當要使用一個繼承體系時 (1)查看該體系頂層類,瞭解該體系基本功能  (2)建立該體系中的最子類對象,完成調用

 

15.當本類中的成員和局部變量同名時用this區分(this表明本類對象的引用)

當子父類中的成員變量同名時,用super區分,super表明父類

當子父類中出現成員函數同樣狀況,會首先用子類函數,這種現象叫 覆蓋。

子類不能直接調用父類中私有的屬性成員,若是父類對外提供方法,子類能夠經過 super.方法名 間接調用

16.函數的兩個特性:(1)重載(overloading):同一個類中   (2)覆蓋(重寫overriding):在子類中,故須要有繼承關係

17.重載:能夠改變返回值類型,口訣:兩同、三不一樣即同一個類、同一方法名、參數列表(方法簽名)的個數、類型、順序不一樣

18.覆蓋(重寫)注意事項:

(1)子類方法覆蓋父類方法時,子類權限必須大於等於父類權限 

(2)靜態子類只能覆蓋靜態父類

19.覆蓋即保留父類功能,實現子類特有內容。那麼應該何時使用覆蓋操做:

當對一個類進行子類擴展時,子類須要保留父類的功能聲明。可是要定義子類中該功能的特有內容,那麼就應該使用覆蓋來完成。

20.當子類構造對象時,發現訪問子類的構造函數,父類也被訪問。緣由是:在子類的構造函數的第一行有隱式的super();這是默認的

21.子類的實例化過程都會默認去訪問父類的空參構造方法。若是子類想訪問父類的含參構造方法,則在子類構造方法中,手動寫入super(參數)

22.爲何子類實例化的時候要訪問父類的構造函數?

super語句,必須定義在子類構造函數第一行,由於父類初始化動做要先完成。

23.抽象類中有構造函數嗎? 有,用於給子類對象初始化

24.抽象類中能夠不定義抽象方法嗎?能夠,可是不多見,目的就是不讓類建立對象

25.抽象關鍵字abstract不能夠和哪些關鍵字共存?

private 緣由:抽象方法要被子類方法覆蓋,若是私有,隱藏方法,則子類方法沒法完成覆蓋

static   緣由:若是成員變靜態,成爲共享數據,則不須要對象;抽象類也不須要對象,能夠直接使用類名.方法名(),抽象方法體運行無心義,由於無內容

final     緣由: final的做用是修飾變量:表示此變量不可修改;修飾方法:表示此方法不可被重寫(覆蓋);修飾類:表示此類不可被繼承。abstract修飾抽象方法,須要子類實現其抽象方法。所以不可與final一同使用

26.抽象類與通常類的特色:

相同點:抽象類與通常類都用來描述事物,都在內部定義了成員

不一樣: (1)通常類有足夠的描述信息;抽象類描述事物的信息可能不足

   (2)通常類中不能定義抽象方法,只能定義非抽象方法;抽象類中能夠定義抽象方法,同時也可定義非抽象方法

   (3)通常類能夠被實例化;抽象類不能夠被實例化

27.抽象類必定是父類嗎? 是的,由於須要子類覆蓋其方法,才能夠對子類進行實例化。

28.類與類之間是繼承關係;類與接口之間是實現關係;接口與接口之間是繼承關係,並且能夠多繼承

實現:接口中的方法都是未實現的,用的時候都得本身實現

29.一個類在繼承另外一個類的同時,還能夠擴展功能,實現多個接口,接口的出現避免了單繼承的侷限性。

30.抽象類與接口的區別?

(1)抽象類須要被繼承,並且只能單繼承。接口須要被實現,並且能夠多實現,即實現多個接口

(2)抽象類中能夠定義抽象方法與非抽象方法,子類繼承後能夠直接調用非抽象方法;接口中只能定義抽象方法(即接口中所有是未實現的方法),子類必須所有實現其方法,不然子類只能被定義爲抽象類

(3)抽象類之間是繼承,is a 關係,是定義該體系的基本共性內容(抽取而來);接口的實現是like a關係,是定義體系額外的擴展功能

31.多態(一個對象,多種形態),在代碼中的體現:父類或接口的引用指向子類的對象

32.多態的好處:提升了代碼的擴展性,前期定義的代碼後期可用

    弊端:前期定義的內容,不能使用(調用)後期子類的特有內容

33.多態的前提:(1)必需要有關係,繼承或者實現關係  (2)要有覆蓋

 

若有錯誤,歡迎你們指正!謝謝

相關文章
相關標籤/搜索