java中final、static和abstract的特點

最近在做面試題的時候經常遇見final、static和abstract的特點的問題,現在就來總結一下,這些都是在網上參考別人的總結,我只是歸納了一下。方便自己以後學習。
一、final
變量定義爲final,一旦被初始化便不可改變,這裏不可改變的意思對基本類型來說是其值不可變,而對於對象變量來說其引用不可再變。
方法定義爲final,是爲了防止任何繼承類改變它。
類定義爲final,則該類無法給任何類繼承。

final類不能被繼承,沒有子類,final類中的方法默認是final的。 

final方法不能被子類的方法覆蓋,但可以被繼承。 

final成員變量表示常量,只能被賦值一次,賦值後值不再改變。 

final不能用於修飾構造方法。 

注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。

1、final類
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴展,那麼就設計爲final類。
2、final方法
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明爲final方法。使用final方法的原因有二:
**①把方法鎖定,防止任何繼承類修改它的意義和實現。
②高效,編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。**

二、static
在瞭解某樣東西的時候我們通常會從它是什麼,爲什麼,和怎麼樣在三方面來衡量,對於java中的static,我們也這樣討論下,要明確以下幾點:

1、 static在java中到底代表什麼,爲何要用它?

2、 static在java中怎麼用?

3、 static 有那些特點和使用的“侷限”?

4、當成員變量被靜態修飾後,和非靜態成員變量的區別?

1、 static在java中到底代表什麼,爲何要用它?

  static――靜態――“指定位置“
  首先,我們來看看java的內存:java把內存分爲棧內存和堆內存,棧內存用來存放一些基本類型的變量和數組及對象的引用變量,而堆內存主要是來放置對象的。
  用 static的修飾的變量和方法,實際上是指定了這些變量和方法在內存中的“固定位置”-static storage。既然要有“固定位置”那麼他們的 “大小”似乎就是固定的了,有了固定位置和固定大小的特徵了,在棧中或堆中開闢空間那就是非常的方便了。如果靜態的變量或方法在不出其作用域的情況下,其引用句柄是不會發生改變的。
  我們常看到:static變量有點類似於C中的全局變量的概念;靜態表示的是內存的共享,就是它的每一個 實例都指向同一個內存地址。把static拿來,就是告訴JVM它是靜態的,它的引用(含間接引用)都是指向同一個位置,在那個地方,你把它改了,它就不會變成原樣,你把它清理了,它就不會回來了。
  注:java的主類中main()方法本身就是一個static的,所以main方法的執行就是在沒有產生新的實例的情況。

2、 static在java中怎麼用?

static是一個修飾符,用於修飾成員(成員變量和成員函數)。
當成員被靜態修飾後,就多了一個調用方式,除了可以被對象調用外,還可以直接被類名調用:類名.靜態成員。

3、 static 有那些特點和使用的“侷限”?
(一)特點

靜態成員隨着類的加載而加載;
靜態成員優先於對象存在;
靜態成員被所有對象所共享;
靜態成員多了一箇中調用方式,可以被類名直接調用。

(二)利弊
利:
對對象的共享數據進行單獨空間的存儲,節省空間,沒有必要每一個對象中都存儲一份;
可以直接被類名調用。
弊:
生命週期過長;
訪問出現侷限性,只能訪問靜態。

(三)注意事項

**靜態方法只能訪問靜態成員, 非靜態方法既可以訪問靜態又可以訪問非靜態;**
**靜態方法中不可以定義this,super關鍵字;**(因爲this代表是對象,而靜態存在時,有可能沒有對象,且靜態優先於對象存在。所以靜態方法運行時,this是沒有任何對象代表的。 簡單說,先進內存的數據不可以訪問後進內存的數據,可是後進內存數據可以訪問先進內存的數據)

主函數是靜態的

4、當成員變量被靜態修飾後,和非靜態成員變量的區別?

靜態變量也稱爲類變量,也就是直接可以被類名調用的變量,這個變量是所屬於類的;
非靜態變量稱爲成員變量,或者實例變量,是被對象調用的,是所屬具體對象的。
靜態變量隨着類的加載而加載,也意味着隨着類的消失而消失,生命週期最長; 
實例變量,隨着對象的創建而加載,隨着對象的消失而消失,按照對象的生命週期而存在。
靜態變量存儲在方法區的靜態區中;
實例變量存在於對象所屬的堆內存中。
靜態變量數據,被所有對象所共享;
實例變量是對象中的特有數據。

三、abstract

抽象類的特點:
**1、抽象方法一定在抽象類中。
2、抽象方法和抽象類都必須被abstract關鍵字修飾。
3、抽象類不可以用new創建對象。因爲調用抽象方法沒意義。
4、抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類對象調用。**
如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。

適用情況:

該如何描述事物,就如何描述事物,只不過,該事物出現了一些看不懂的東西,這些不確定的部分,也是該事物的功能,需要明確出現。但是無法定義主體。通過抽象方法來表示。

抽象類比一般類多個了抽象函數。就是在類中可以定義抽象方法,定義的抽象方法不能定義實現的代碼,只能由子類來實現方法。
抽象類不可以實例化
特殊:抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。

發佈了38 篇原創文章 · 獲贊 33 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章