CoreJava(第四章)對象和類-03

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方法來完成相應的清理操作。

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