1. 程式人生 > >例項變數和類變數、類方法和例項方法

例項變數和類變數、類方法和例項方法

類體中包括成員變數區域性變數,而成員變數又可以細分為例項變數和類變數,在宣告成員變數的時候,用static給予修飾的稱作類變數,否則稱作例項變數。(類變數也稱為static變數,靜態變數)
那麼,類變數和例項變數有什麼區別呢?
我們知道,一個類通過使用new運算子可以建立多個不同的物件,這些物件將被分配不同的成員變數,說的更精確寫就是:分配給不通物件例項變數咱有不同的記憶體空間,改變其中一個物件的例項變數不會影響其他物件的例項變數。
然而,如果類中有類變數,當使用new運算子建立多個不同的物件時,分配給這些物件的這個類變數佔有相同的一出記憶體,改變其中一個物件的這個類變數,那麼將會影響到其他對於下部分的這個類變數,也就算說不同的物件共享類變數。
既然這樣,那麼我要要怎麼訪問類變數呢?


不僅僅可以通過某個物件訪問,也可以直接通過類名訪問。而例項變數不同,只能用某個物件訪問。
物件呼叫例項方法
當類的位元組碼檔案被載入到記憶體是,類的例項方法不會被分配到入口地址,只有該類建立物件後,類中的例項方法才分配入口地址。從而例項方法可以被建立的任何物件呼叫執行。這裡需要注意的是,當我們建立第一個物件時,類中的例項方法就分配了入口地址,當再建立物件時,不再分配入口地址。也就是說,方法的入口地址被所有的物件共享,當所有的物件不存在時,方法的入口地址才會被取消。
例項方法中不僅可以操作例項變數,也可以操作類變數,當物件呼叫例項方法時,該方法中出現的例項變數就是分配給該物件的例項變數,該方法中出現的類變數也是分配給該物件的變數,只不過這個變數和所有其他的物件共享而已。
類名呼叫類方法

對於類中的類方法,在該類被載入到記憶體時,就分配了相應的入口地址,從而類方法不僅可以被類建立的任何物件呼叫執行,也可以直接通過類名呼叫,類方法的入口地址知道程式退出了才會被取消。需要注意的是例項方法不能通過類名呼叫,只能由物件呼叫。
和例項方法不同的是,類方法不可以操作例項變數,這是因為在類建立物件之前,例項成員變數還沒有分配記憶體。
關於設計類方法的原則
對於static方法,不必建立物件就可以用類名直接呼叫它(建立物件會導致類中的例項變數被分配到記憶體空間中)。如果一個方法不需要操作類中的任何例項變數,就可以滿足程式的需要的話,就可以考慮將這樣的方法設計為一個static方法。