一、概念 **1、public和private** 兩個都是訪問許可權修飾符,用於控制外界對類內部成員的訪問。 * public:表明對象成員是完全共有的,外界可以隨意訪問。用public修飾的數據成員、成員函數是對所有用戶開放的,所有用戶都可以直接進行調用。 * private:表明對象成員是完全私 ...
一、概念
1、public和private
兩個都是訪問許可權修飾符,用於控制外界對類內部成員的訪問。
- public:表明對象成員是完全共有的,外界可以隨意訪問。用public修飾的數據成員、成員函數是對所有用戶開放的,所有用戶都可以直接進行調用。
- private:表明對象成員是完全私有的,不容許外界的任何訪問。private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,包括子類。
2、static:static是控制類成員變化的修飾符之一。
static:靜態成員修飾符,其修飾的靜態變數脫離具體對象獨立存在,在記憶體中之後一份拷貝,所有的對象都公用這一個存儲空間,所以對static修飾的靜態變數進行的修改對該類的所有對象都起作用。static修飾的靜態函數代表所有對象的統一操作,只能調用靜態變數。static是針對面向對象中的“多態”而提出來的,static修飾的靜態成員不存在多態性。
static表示“全局”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static代碼塊,但是Java語言中沒有全局變數的概念。怎麼理解這句話?記住java是一個面向對象的語言,萬事萬物皆對象,無論你做什麼都需要創建一個對象,然後再調用這個對象的方法,所以java中壓根就沒有所謂的“全局變數”,但是沒有這個概念,不代表你不可以實現這個功能,java存在的目的就是讓人們使用它去達到人們想要的效果,所以static value就可以達到全局變數的作用。
進一步解釋一下。用public修飾的static成員變數和成員方法本質是全局變數和全局方法,當聲明這個類的對象時,不會生成static變數的副本,而是類的所有實例共用同一個static變數。只要這個類被載入,Java虛擬機就能根據類名在運行時數據區的方法區內找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。
3、final:final也是控制類成員變化的修飾符。
final:final用來修飾方法和屬性表示特殊的意義。修飾方法時表示方法不能被重寫;修飾屬性時表示屬性不能被改變,這裡屬性又分為對象和基本類型,修飾基本類型表示基本類型賦值以後不能再被賦值,修飾對象表示這個屬性不能再指向其他對象(引用不變),但是他指向的這個對象本身還是可以被改變的。
使用final關鍵字可以聲明類、成員變數和成員方法,一經聲明,便不可繼承、不可修改和不能覆蓋。還有,final方法不能被子類覆蓋。編譯器在調用final方法時會轉入內嵌機制(直接將方法主體插入到調用處),大大提高執行效率(50%左右)。API類中的許多方法,如Object類中的getClass方法為final方法。同時,final還不能用於修飾構造方法。
特殊情況:
class Base {
private final void method() {
System.out.println(“In Base…”);
}
}
class Sub extends Base {
public void method() {
System.out.println(“In Sub…”);
}
}
大家看上邊的代碼,雖然父類和子類中都有method這個方法,但是不算是重寫,因為基類中的method方法的訪問修飾符是private,就表示這個方法是私有的,對子類是不可見的,所以子類中的method方法其實是一個全新的方法,不是對基類方法的重寫,僅僅是同名罷了。
4、靜態變數和實例變數的區別
對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。
對於實例變數,每創建一個實例,就會為實例變數分配一次記憶體,實例變數可以在記憶體中有多個拷貝,互不影響(靈活)。
所以一般在需要實現以下兩個功能時使用靜態變數:
- 在對象之間共用值時
- 方便訪問變數時
5、靜態方法
-
靜態方法可以直接通過類名調用,任何的實例也都可以調用靜態方法。靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變數和實例方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為實例成員與特定的對象關聯!就是java面向對象的思想,實例是你這個類本身的屬性,你會用這個本身的屬性去做一些事情,而這些事情不是固定的,不能像靜態方法一樣一成不變。
-
由於static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。靜態方法是類內部的一類特殊方法,只有在需要時才將對應的方法聲明成靜態的,一個類內部的方法一般都是非靜態的。
-
有時你希望定義一個類成員,使它的使用完全獨立於該類的任何對象。通常情況下,類成員必須通過它的類的對象訪問,但是可以創建這樣一個成員,它能夠被它自己使用,而不必引用特定的實例。在成員的聲明前面加上關鍵字static(靜態的)就能創建這樣的成員。如果一個成員被聲明為static,它就能夠在它的類的任何對象創建之前被訪問,而不必引用任何對象。你可以將方法和變數都聲明為static。static 成員的最常見的例子是main( ) 。因為在程式開始執行時必須調用main() ,所以它被聲明為static。
-
聲明為static的方法有以下幾條限制:
- 它們僅能調用其他的static 方法。
- 它們只能訪問static數據。
- 它們不能以任何方式引用this 或super