今天來談談修飾子(Modifier)。
修飾子我覺得可以分為三大類,第一種就是封裝用的修飾子,第二種為宣告屬性或方法是否為靜態,第三種是final。
- 封裝用修飾子
封裝用修飾子有4種:public, protected, default, private。其中default修飾子在程式中的表達方式是不需要註明,直接留空就代表你要讓類別或者屬性、方法為default的範圍了。
而封裝用修飾子的對象有4種:class, field, method, constructor。
我時常覺得,只要當我們研究的事物開始有一個以上的維度後,就不是那麼容易了,因為交互影響下就會產生很多可能,而有些可能就會變成特例,就需要時間來思考學習了,但也要清楚,這些的目的都是為了表達出我們想設計的程式而產生的規則。
- 類別可以宣告protected或private嗎?
不能,因為沒有意義。但是內部類別(inner class)可以。
- 如果類別宣告為default,但是有的成員為public,那這個public成員是不是有點怪怪的?
沒有錯,這個public成員是有點沒意義的,因為最終包裹這個成員的類別只能被同套件(package)的類別取用,不過這樣的程式是可以編譯並執行的。
- 如果類別被其他類別繼承,那private的成員也有被繼承到嗎?
不會呦。(JLS8.2)
-
靜態(Static)
剛剛提到的學習維度問題,很遺憾的static讓它又增加了一個維度。不過只要了解到,靜態修飾子的目的就是讓類別中的成員變成是類別所擁有、公用的,而不是在創建實例後讓各個實例擁有的成員。會叫做靜態就是這個意思,因為被宣告維靜態的成員在JVM類別載入後就成立了,而不是在創建實例時才成立,所以有靜態的意味。
能夠被宣告維static的成員有field, method, inner class, block(程式區塊,這部分之後應該會寫一篇)。
-
final
一般我們在程式要存放值的時候,就會宣告出一個變數來存; 那我們是不是可以在之後用同樣的變數存放其他的值? 當然可以囉,不過原本存放的值就會被蓋掉了,這種現象叫做狀態(state)改變。那可不可以讓變數在儲存一個值之後,就不可以指派其他值進去? 可以的,這時候就需要用到final修飾子,它可以讓變數成為常數(constant)。
final的對象可以為class, field, method; 如果為class或method,就代表對象無法被繼承或被覆寫。
- 可不可以同時宣告某個成員為static以及final?
可以,同時宣告static final就表示該成員在類別載入時就已創建完成,而且不可被修改,絕對的常數。
目前能想到的就這些了,總感覺還有很多種可能沒想到,真毛。