天天看點

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、抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類對象調用。**

如果子類隻覆寫了部分抽象方法,那麼該子類還是一個抽象類。

适用情況:

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

抽象類比一般類多個了抽象函數。就是在類中可以定義抽象方法,定義的抽象方法不能定義實作的代碼,隻能由子類來實作方法。

抽象類不可以執行個體化

特殊:抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。