標籤:java 自學第三天
java物件導向程式設計中使用到名詞理解:對象標識==一個執行個體的變數名、對象行為==一個類的方法、對象狀態==類中的資料域(嚴格講是可以發生變化的資料域);
類之間的關係:use_a,has_a,is_a三種
java中的Math類有些特殊,它只封裝了功能而並不涉及資料域,所以不需要也不必隱藏資料
java中的物件變數名更像是個指標(像),聲明一個對象執行個體後必須用new構造對象然後用=將兩者連結起來,也可以用=將兩個不同的物件變數串連起來,但此時需要注意,就像指標賦值一樣,兩個變數自此將共用同一個對象執行個體,物件變數並沒有包含一個對象執行個體,而是引用了一個對象執行個體,可以顯式的將物件變數設定為NULL,用於表示此物件變數並沒有引用任何對象執行個體,需要注意的是局部(對象)變數不會自動初始化,需要通過new或者null(必須小寫)對其賦值
java中的物件變數全都放在堆中,當一個對象包含另一個物件變數時,就是這個對象包含指向另一個堆對象的指標。
java中深拷貝對象必須利用clone方法
java中Date類用於表示時間點GregorianGalendar類用於表示日曆,Date類提供了before、after方法用於比較時間點,同時也提供了getDay等方法,但是作者不提倡使用
更改器方法:修改類對象資料域的方法
訪問器方法:僅讀取類對象資料域的方法、與前者在文法上並沒有區別
在同一個源檔案中,僅允許出現一個public類用於裝載main方法,當編譯時間會將源檔案中所有的類建立對應的.class檔案,然後將有main方法的類名給位元組碼解譯器以啟動,但main方法可以包含於其他的類中,這樣方便單元測試,可以通過IDE選定目標類,然後單元測試目標了,此時目標類中的main將會發揮啟動作用。
對於變種for迴圈,發現整型數組在迴圈塊中的修改並不會儲存下來,但如果是對象的話將會保留修改痕迹
注意構造器是沒有傳回值的
這裡有一個因果關係:因為java中所有對象都放在堆中,所以建立時用new,與c++有區別
java中不能再構造器中聲明與資料域同名的變數,雖然不會報錯。
java中所有的方法必須在類內部定義(外殼類),但這並不代表所有的方法都是內聯的。
對於訪問器方法的關註:訪問器方法不應該 直接 返回 狀態域(資料域) 的對象,因為接收變數會與此對象共用記憶體,從而可以通過接收變數間接修改此對象(雖然private) 應該做的是 返回此對象的拷貝,此處利用到.clone方法;
對於類的存取權限問題:一個類的方法可以訪問 所有 此類的對象執行個體中的資料域。而不是特定的對象執行個體中的資料域。 與C++不同
static 類中若存在此類型的資料,那麼此類的所有對象執行個體都將會共用此資料,引用時是通過類名.引用,用於強調此資料是直屬類域並非屬於特殊的對象執行個體,靜態常量 類型可以使類中的公開變數很安全。
雖然理論上不能修改靜態常量,但是如果利用setOut方法 可以突破這一約定,原理是此方法是本地方法,它將繞過java實現
對於靜態方法:不需要對象執行個體,直接通過類名.調用,這裡有一個因果:所以不能訪問對象執行個體中的資料域,這裡有一個特例:除非對象執行個體中的資料域中存在待用資料,這樣靜態方法還是可以訪問此資料的。同類中的靜態變數類似,調用靜態方法建議使用類名直接調用,從而達到強調其不依賴對象執行個體,是靜態方法的目的。
對20進行總結:使用靜態方法的要求:1.不訪問執行個體的資料域。2.讓步,僅訪問資料域中的靜態域
這裡有一個方法 :Factory 方法。
java中對於參數的傳遞只有一種形式:按值傳遞(先進行拷貝然後將拷貝得到的值進行傳遞)。於是這裡有一個因果:所以方法的參數如果是基本類型,那麼不會對其進行修改,但這裡有個看似特例但實際上是情理之中的情況:如果方法的參數是一個執行個體對象,是可以實現對其資料域的修改的,原因如下:對象執行個體本身就是一個相當於引用存在的指標(相當於),所以就算對其進行拷貝,得到的也是一個引用,然後兩個變數同時共用一個記憶體區,於是方法中對此記憶體區的修改是有效
注意,java中雖然對域(對象執行個體中的資料域,或者再高一層:存放在堆中的變數)可以進行預設的初始化例如數值預設初始化為0,boolean預設初始化為false,對象預設初始化為null,但局部變數並不會進行預設初始化,而且作者不提倡使用預設初始化,因為影響程式可讀性。此時發現,白皮書中所提到到的域應該有一個共同特性就是在存放在堆上,例如一個數組,也會被預設初始化,因為數組其實是相當於一個指標=new,因此應該儲存在堆中,然後它被預設初始化了。是否所有存放在堆中的資料都將被預設初始化?
java中類中資料域的變數都可以被直接初始化,此處不同於C++,當然也能通過建構函式初始化。而且,java直接初始化時也可是利用到方法。詳述與白皮書P128頁。還涉及到初始化塊/靜態初始化塊,以及構造器的多重調用。。。。。。。。。。。。。此處較亂,真正用到時再琢磨。白皮書P131,有關內容詳述。
本文出自 “developing_Rookie” 部落格,請務必保留此出處http://8942041.blog.51cto.com/8932041/1627799
java第三天學習內容回顧——java白皮書第四章