4.12.重載
4.12.1定義
重載:具有相同的名字,不同的參數。
4.12.2例子
package com.eleven.oop_03;
/**
* 重載:
* 1.具有相同的名字,不同的參數
* @author sywangu
*
*/
public class HeavyLoad {
public static void main(String[] args) {
Person p = new Person();
p.getPerson(); // 無參數!
p.getPerson(1); // 只有id參數
p.getPerson(1, "伊萊文"); // 有id和name兩個參數
p.getPerson(1, "伊萊文", 21); // 有id、name和age3個參數
}
}
class Person{
private int id;
private String name;
private int age;
public void getPerson() {
System.out.println("無參數!");
}
public void getPerson(int id) {
System.out.println("只有id參數");
}
public void getPerson(int id,String name) {
System.out.println("有id和name兩個參數");
}
public void getPerson(int id,String name,int age) {
System.out.println("有id、name和age3個參數");
}
}
4.13默認域初始化
4.13.1定義
在構造器中沒有顯式的給實例域賦初值,那麼就會被自動賦爲默認值:數值爲0,布爾值爲false,對象引用爲null
4.14無參數的構造器
4.14.1定義
1.對象由無參數構造函數創建時,其狀態會設置爲適當的默認值。
2.只有當類沒有提供任何構造器時,系統纔會提供一個默認的構造器。
4.14.2例子
package com.eleven.oop_03;
import java.time.LocalDate;
/**
* 無參數的構造器
* 1.對象由無參數構造函創建時,會設置爲默認值。
* 2.如果在編寫一個類沒有編寫默認構造器時,系統就會自動提供一個無參數構造器。
* @author sywangu
*
*/
public class ParamConstructor {
public static void main(String[] args) {
System.out.println(new Per());
}
}
class Per{
private String name;
private double salary;
private LocalDate hireDay;
// 無參構造
public Per() {
name = "";
salary = 0;
hireDay = LocalDate.now();
}
}
4.15顯示域初始化
4.15.1定義
可以保證不管怎麼調用構造器,每個實例域都可以被設置爲一個有意義的初始值。
4.15.2例子
package com.eleven.oop_03;
/**
* 顯式域初始化
* 1.可以保證不管怎麼調用構造器,每個實例域都可以被設置爲一個有意義的初始值。
*
* @author sywangu
*
*/
public class DisplayDomainInit {
}
class Emp {
// 在執行構造器之前,先執行賦值語句,將一個值賦予給任何域。
private String name = "";
}
4.16參數名
4.16.1描述
1.單個字符命名。2.參數前面加前綴"a"。3.採用this形式訪問實例域。
4.16.2例子
package com.eleven.oop_03;
/**
* 參數名
* @author sywangu
*
*/
public class ParamName {
private String name;
private double salary;
private int age;
// 01用單個字符命名
public ParamName(String n) {
name = n;
}
// 02可以在每個參數前面加上一個前綴"a"
public ParamName(String aName,double aSalary) {
name = aName;
salary = aSalary;
}
// 03採用this的形式訪問實例域,this指示的是隱式參數
public ParamName(String name, double salary, int age) {
this.name = name;
this.salary = salary;
this.age = age;
}
}
4.17調用另一個構造器
4.17.1定義
關鍵字this除了是表示引用方法的隱式參數外,還有另外一個含義:this(…)表示這個構造器將調用同一個類的另一個構造器。
4.17.2例子
package com.eleven.oop_03;
/**
* 調用另外一個構造器
* 1.關鍵字this除了是表示引用方法的隱式參數外,還有另外一個含義:
* 2.this(...)表示這個構造器將調用同一個類的另一個構造器。
* @author sywangu
*
*/
public class CallAnotherConstructor {
private static int nextId = 1; // 靜態域id
private double salary;
// 採用這樣方式使用this關鍵字,可以使公共的構造器代碼只編寫一次
public CallAnotherConstructor(double aSalary) {
// 02-程序在執行這個
this("CallAnotherConstructor:" + nextId ,aSalary);
// 04-程序在執行這個
nextId++;
}
public CallAnotherConstructor(String string, double aSalary) {
// 03-程序在執行這個
System.out.println("調用CallAnotherConstructor(String string, double aSalary)這個構造器");
}
public static void main(String[] args) {
// 01-程序先執行這個
new CallAnotherConstructor(5000); // 將會調用CallAnotherConstructor(String string, double aSalary)這個構造器
// 05-程序結束退出
}
}
4.18初始化塊
4.18.1定義
1.除了具有"在構造器中設置值"和"在聲明中賦值"以外,還有一種"初始化塊"。
2.在一個類的聲明中,可以包含多個代碼塊。只要構造類的對象,這些塊就會被執行。
4.18.2例子
package com.eleven.oop_03;
/**
* 初始化塊
* 1.在一個類的聲明中,可以包含多個代碼塊。只要構造類的對象,這些塊就會被執行。
*
* @author sywangu
*
*/
public class InitBlock {
private static int nextId;
private int id;
private String name;
private double salary;
// 初始化構造塊
/// 02-在運行初始化塊
{
id = nextId;
nextId++;
}
public InitBlock(String aName, double aSalary) {
name = aName;
salary = aSalary;
}
/// 03-然後在運行構造器的主體部分
public InitBlock() {
name = "";
salary = 0;
}
public static void main(String[] args) {
/// 01-先執行這個
new InitBlock();
}
}
4.19淺談對象析構與finalize方法
4.19.1定義
以回收分配給對象的存儲空間。
1.由於Java具有自動的垃圾回收機制,所以不需要人工回收內存,所以Java不支持析構器。
2.finalize方法是在垃圾回收器清除對象之前進行調用。
3.如果某個資源在使用完畢後立刻被關閉,那麼就需要由人工來管理,對象用完後,可以使用close方法來完成相應的清理操作。