java构造方法的签名_如何在 Java 中构造对象(学习 Java 编程语言 034)
1. 構造器
Java 對象都是在堆中構造的。
先看看 Employee 類的構造器:
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, double salary, int year, int month, int day) {
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
}
...
}
構造器與類同名。在構造 Employee 類的對象時,構造器會運行并初始化實例字段。
當使用下面這條代碼創建 Employee 類的實例時:
new Employee("James Bond", 100000, 1950, 1, 1);
將會把實例字段設置為:
name = "James Bond";
salary = 100000;
hireDay = LocalDate.of(1950, 1, 1); // 1950-01-01
有關構造方法,需要記住:
構造器與類同名
每個類可以有一個以上的構造器。
構造器可以有 0 個、1 個或多個參數。
構造器沒有返回值。
構造器總是伴隨著 new 操作符一起調用。
注意,不要在構造器中定義與實例字段同名的局部變量。例如:
public Employee(String n, double s, int y, int m, int d) {
String name = n; // 錯誤
double salary = s; // 錯誤
...
}
這個構造器聲明了局部變量 name 和 salary。這些變量只能在構造器內部訪問。這些變量會遮蔽同名的實例字段。有些程序員偶爾會不假思索地寫出這類代碼,因為它們的手指會不自覺地增加數據類型。這種錯誤很難檢查出來,因此,必須注意在所有方法中都不要使用與實例字段同名的變量。
2. 重載
有些類有多個構造器。
new StringBuilder();
new StringBuilder("String");
這種功能叫做重載(overloading)。如果多個方法有相同的名字、不同的參數,便出現了重載。
Java 允許重載任何方法,而不只是構造器方法。
編譯器必須挑選出具體調用哪個方法,它用各個方法首部的參數類型與特定方法調用中所使用的值類型進行匹配,來選出正確的方法。如果編譯器找不到匹配的參數,就會產生編譯時錯誤,因為根本不存在匹配,或者沒有一個比其他的更好。這個查找匹配的過程被稱為重載解析(overloading resolution)。
要完整地描述一個方法,需要指出方法名以及參數類型。這叫做方法的簽名(signature)。例如,String 類有 4 個名為 indexOf 的公共方法。它們的簽名是:
indexOf(int)
indexOf(int, int)
indexOf(String)
indexOf(String, int)
返回類型不是方法簽名的一部分。也就是說,不能有兩個名字相同、參數類型也相同卻有不同返回類型的方法。
3. 無參數的構造器
很多類都包含一個無參數的構造器,由無參數構造函數創建對象時,其狀態會設置為適當的默認值。例如,以下是無參數構造器:
public class Employee {
private String name;
private double salary;
protected LocalDate hireDay;
public Employee() {
name = "";
salary = 0;
hireDay = LocalDate.now();
}
}
如果寫一個類時沒有編寫構造器,就會為你提供一個無參數構造器。這個構造器將所有的實例字段設置為默認值。于是,實例字段中的數值型數據設置為 0、布爾型數據設置為 false、所有對象變量將設置為 null。
如果類中提供了至少一個構造器,但是沒有提供無參數的構造器,那么構造對象時如果不提供參數就是為不合法。
警告: 僅當類沒有任何其他構造器的時候,才會得到一個默認的無參數構造器。編寫類的時候,如果寫了一個你自己的構造器,要想讓這個類的用戶能夠通過以下調用構造一個實例:
new ClassName();
你就必須提供一個無參數的構造器,當然,如果希望所有的字段被賦予默認值,只需要提供以下代碼:
public ClassName() {
}
4. 參數名
在編寫很小的構造器時,常常在參數命名時感到困惑。
常常用單個字母作為參數名:
public class Employee {
...
public Employee(String n, double s) {
name = n;
salary = s;
}
}
但這樣做有一個缺點:只有閱讀代碼才能夠了解參數 n 和參數 s 的含義。
有些程序員在每個參數前面加上一個前綴 “a”:
public class Employee {
...
public Employee(String aName, double aSalary) {
name = aName;
salary = aSalary;
}
}
這樣很清晰。讀者一眼就能看懂參數的含義。
還有一種常用的技巧,它基于這樣的事實:參數變量會遮蔽同名的實例字段。如果將參數名命名為 salary,salary 將指示這個參數,而不是實例字段。但是,還是可以用 this.salary 訪問實例字段。this 指示隱式參數,也就是所構造的對象。
public class Employee {
...
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
}
5. 調用另一個構造器
關鍵字 this 指示一個方法的隱式參數。這個關鍵字還有另一個含義。
如果構造器的第一個語句形如 this(...),這個構造器將調用同一個類的另一個構造器。下面是一個典型的例子:
public class Employee {
...
public Employee (double s)
{
// calls Employee(String, double)
this("Employee #" + nextId, s);
nextId++;
}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
}
當調用 new Employee(6000) 時,Employee(double) 構造器將調用 Employee(name, double) 構造器。
采用這種方式使用 this 關鍵字非常有用,這樣對公共的構造器代碼只需要編寫一次即可。
6. 對象析構與 finalize 方法
由于 Java 會完成自動的垃圾回收,不需要人工回收內存,所以 Java 不支持析構器。
某些對象使用了內存之外的其他資源,例如,文件或使用了系統資源的另一個對象的句柄。在這種情況下,當資源不再需要時,將其回收和再利用顯得十分重要。
如果一個資源一旦使用完就需要立即關閉,那么應當提供一個 close 方法來完成必要的清理工作。可以在對象用完時調用這個 close 方法。
如果可以等到虛擬機退出,那么可以用方法 Runtime.addShutdownHook 增加一個 “關閉鉤”(shutdown hook)。在 Java 9 中,可以使用 Cleaner 類注冊一個動作,當對象不再可達時(除了清潔器還能訪問,其他對象都無法訪問這個對象),就會完成這個動作。在實際中這些情況很少見。
警告: 不要使用 finalize 方法來完成清理。這個方法原本要在垃圾回收器清理對象之前調用。不過,你并不知道這個方法到底什么時候調用,而且該方法已經被廢棄。
總結
以上是生活随笔為你收集整理的java构造方法的签名_如何在 Java 中构造对象(学习 Java 编程语言 034)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL模板测试通俗理解
- 下一篇: java s.charat_Java中s