Java读书笔记05 类与对象
本文為java中對象與類等的基本知識,包括方法、構造、析構、靜態域、初始化、包、路徑等。
對象與對象變量
在Java中,任何對象變量的值都是對存儲在另外一處的一個對象的引用。new操作符的返回值也是一個引用。
可以把Java中的數據類型分為兩類,一類是基本數據類型,即前面提到的8種基本數據類型(4種整型,2種實數,1種字符,1種布爾);另一類是引用類型(reference type)。
下列語句:
Date deadline = new Date();
有兩個部分。表達式new Date()構造了一個Date類型的對象,并且它的值是對新創建對象的引用,這個引用被存儲在變量deadline中。
可以顯示地將對象變量設置為空(null)
應該將Java的對象變量看作是C++的對象指針。
引用類型是用在對象上的,一個對象可以被多個引用所指向,但同一時刻,每個引用只能指向唯一的一個對象。如果一個對象被多個引用所指向,那么無論哪個引用對對象屬性進行了修改,都會反映到其他的引用當中。
C++中沒有空引用,并且引用不能被賦值。
所有的Java對象都存儲在堆中。變量包含的是指向堆對象的指針。引用存放的是對象的地址。
在Java中使用clone方法來獲得對象的完整拷貝。
?
用戶自定義類
在一個源文件中,只能有一個公有類,但可以有任意數目的非公有類。
源文件名必須與公有類的名字相匹配。
當編譯源程序時所有使用到的類都會被編譯。
?
方法
Java中所有的方法都必須在類的內部定義,但并不像C++那樣把類內部定義的方法作為inline,是否將某個方法作為內聯方法是Java虛擬機的任務。
若需要返回一個可變數據域的拷貝,就應該使用clone。
?
構造器
構造器即構造函數,工作方式與C++基本相同。但是所有的Java對象都是在堆中構造的,構造器總是伴隨著new操作符一起使用。
如果在編寫一個類時沒有編寫構造器,系統就會提供一個默認構造器(默認構造器是指沒有參數的構造器)。系統提供的這個默認構造器會將所有的實例域設置為默認值。
如果類中至少提供了一個構造器,但是沒有提供默認的構造器,那么在構造對象時若不提供構造參數就視為不合法。用戶如果希望不提供參數時,所有域擁有默認的值,可以提供一個空的默認構造器。
如果構造器的第一個語句形如this(…),那么這個構造器將調用同一個類的另一個構造器。
注意:在C++中一個構造器不能調用另一個構造器,必須將抽取出的公共初始化代碼編寫成一個獨立的方法。
?
方法參數
?
隱式參數與顯式參數
每一個方法中,this表示隱式參數,表示對象。
顯式參數是列在方法括號中的數值。
?
方法參數的傳遞
C++有值調用和引用調用,引用參數標有&符號。
Java程序設計語言使用值調用,方法得到的是參數值的一個拷貝。
即對于Java中的方法參數傳遞,無論傳遞的是原生數據類型,還是引用類型,統一是傳值(pass by value)。
對于基本數據類型來說,方法中的變量被初始化為實參的一個拷貝,方法結束后,原來的在方法外部的變量并不改變,而方法中的變量不再使用。
對于對象引用來說,方法中的變量被初始化為對象引用值的拷貝,即一個對象的引用。方法可以改變一個對象參數的狀態。
但是認為Java對對象采用的是引用調用,這種理解是不對的。如果將兩個對象的引用的拷貝在方法中交換,這樣并不能夠真的交換這兩個對象。這說明一個方法不能讓對象參數引用一個新的對象。
?
靜態域與靜態方法
?
靜態域:
如果將域定義為static,那么每個類中只有一個這樣的域。而每一個對象對于所有的實例域卻都有一份自己的拷貝。
?
靜態常量:
public static final double PI=3.1415926535;
public static final PrintStream out=…;
?
靜態方法:
靜態方法是不能向對象實施操作的方法。即沒有隱式的參數this。
main方法是一個靜態方法,因為在啟動程序的時候還沒有任何一個對象。
(每個類可以有個main方法,這是對類進行單元測試時一個常用技巧。)
因為靜態方法不能操作對象,所以不能在靜態方法中訪問實例域。但是靜態方法可以訪問自身類中的靜態域。
以下兩種情況使用靜態方法:
1.當一個方法不需要訪問對象狀態,所有參數都是通過顯示參數提供的。
2.當一個方法只需要訪問類的靜態域。
?
顯式域初始化
在執行構造器之前先進行賦值,當一個類的所有構造器都希望將相同的值賦予某個特定的實例域時,這種方法特別有用。
初始值不一定是常量,域可以調用方法來進行初始化。
?
靜態初始化:
對靜態域進行初始化可以將代碼放在一個塊中,并標記關鍵字static。在類第一次加載的時候,將會進行靜態域的初始化,與實例域一樣,靜態域的默認初始值為false或null,除非將它們顯式設置成其他值。
所有的靜態初始化語句以及靜態初始化塊 都將按照類定義中出現的順序執行。
?
對象析構與finalize方法
Java有自動的垃圾回收器,不需要人工回收內存,所以不支持析構器。
當使用了內存之外的其他資源,如文件或使用了系統資源的另一個對象的句柄,在這種情況下,當資源不再需要的時候,將其回收和再利用十分重要。
可以為任何一個類添加finalize方法,該方法將在垃圾回收器清除對象之前被調用。在實際應用中,不要使用finalize方法回收任何短缺的資源,這是因為很難知道這個方法什么時候才能夠被調用。
如果某個資源需要在使用完畢后立刻被關閉,就需要人工管理。提供一個類似dispose或close這樣的方法,用來做相應的清理。如果一個類使用了這樣的方法,當對象不再使用時一定要調用它。
?
包
package將類組織起來。
所有標準的Java包都處于java和javax包層次中。
使用包的主要原因是確保類名的唯一性,Sun公司建議將公司的英特網域名以逆序的形式作為包名,并且對于不同的項目使用不同的子包。
包嵌套的唯一目的是管理唯一的名字。從編譯器的角度來看,嵌套的包之間沒有任何關系。每一個都擁有獨立的類集合。
?
類的導入
一個類可以使用所屬包中的所有類,以及其他包中的公有類。
訪問另一個包中的共有類有兩種方式:
1.在每個類名之前添加完整的包名。如:
java.util.Date today = new java.util.Date();
2.使用import語句(位于源文件頂部,package語句的后面)導入一個特定的類或者整個包。如:
import java.util.*;
還可以導入一個包中的特定類:
import java.util.Date;
?
靜態導入
import語句不僅可以導入類,還增加了導入靜態方法和靜態域的功能。
import static java.lang.System.*;
?
將類放入包中
要想將一個類放入包中,就必須將包的名字放在源文件的開頭。如:
package com.horstmann.corejava;
如果沒有在源文件中放置package語句,那么這個源文件中的類就被放置在一個默認包中,默認包是一個沒有名字的包。
?
虛擬機如何定位類
類存儲在文件系統的子目錄中,類的路徑必須與包名匹配。
另外,還可以利用JAR實用程序將類文件添加到歸檔文件中。在一個歸檔文件中,可以包含多個類文件和子目錄,這樣既可以節省又可以改善性能。
類路徑所列出的目錄和歸檔文件是搜尋類的起始點,是所有基目錄的集合,基目錄中的子目錄可以用于包含類文件。
設置類路徑的方法取決于編譯環境。如果使用JDK,那么就有兩種選擇:為編譯器和字節碼解釋器指定-classpath選項,或者設置CLASSPATH環境變量。
具體的設置細節取決于操作系統。
句點.表示當前目錄,Windows環境中,各基目錄以分號;間隔。
由于運行時庫文件(在jre/lib與jre/lib/ext目錄下的rt.jar和一些其他的JAR文件)會被自動地搜索,所以不必將它們顯式地列在類路徑中。
為編譯器設置類路徑:
javac –classpath …
也可以用-cp代替-classpath
javac編譯器總是在當前目錄中查找文件,而java解釋器僅在類路徑中有.目錄的時候,才查看當前目錄。
?
包作用域
標記為public的部分可以被任意的類使用;
標記為private的部分只能被定義它們的類使用。
如果沒有指定public或private,那么這個部分可以被同一個包中的所有方法訪問。
總結
以上是生活随笔為你收集整理的Java读书笔记05 类与对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux中压缩、解压缩(tar/zip
- 下一篇: 基于高德地图Windows Phone