java第三天學習內容回顧——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.讓步,僅訪問數據域中的靜態域

  • 這裏有一個方法 :工廠方法。

  • java中對於參數的傳遞只有一種形式:按值傳遞(先進行拷貝然後將拷貝得到的值進行傳遞)。於是這裏有一個因果:所以方法的參數如果是基本類型,那麼不會對其進行修改,但這裏有個看似特例但實際上是情理之中的情況:如果方法的參數是一個實例對象,是可以實現對其數據域的修改的,原因如下:對象實例本身就是一個相當於引用存在的指針(相當於),所以就算對其進行拷貝,得到的也是一個引用,然後兩個變量同時共享一個內存區,於是方法中對此內存區的修改是有效的

  • 注意,java中雖然對域(對象實例中的數據域,或者再高一層:存放在堆中的變量)可以進行默認的初始化例如數值默認初始化爲0,boolean默認初始化爲false,對象默認初始化爲null,但局部變量並不會進行默認初始化,而且作者不提倡使用默認初始化,因爲影響程序可讀性。此時發現,白皮書中所提到到的域應該有一個共同特性就是在存放在堆上,例如一個數組,也會被默認初始化,因爲數組其實是相當於一個指針=new,因此應該存儲在堆中,然後它被默認初始化了。是否所有存放在堆中的數據都將被默認初始化?

  • java中類中數據域的變量都可以被直接初始化,此處不同於C++,當然也能通過構造函數初始化。而且,java直接初始化時也可是利用到方法。詳述與白皮書P128頁。還涉及到初始化塊/靜態初始化塊,以及構造器的多重調用。。。。。。。。。。。。。此處較亂,真正用到時再琢磨。白皮書P131,有關內容詳述。

  • 發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章