從EmployeeTest深入理解類對象和構造器

package javalearning;

import java.time.LocalDate;

public class EmployeeTest {

	public static void main(String[] args) {
		
		//使用new操作符構造Employee[]數組對象。staff這個 對象變量必須使用構造器初始化後才能使用
		//也就是Employee存放在堆中,而staff這個對象變量引用存放在棧中,=的意思是將對象變量staff指定的地址和Employee對象綁定在一起
		Employee[] staff = new Employee[3];
		
		
		//對數組對象進行實例化
		//對於每個特定的類實例(對象)都有一組特定的實例域值。這些值的集合就是這個對象的當前狀態 ( state )
		staff[0] = new Employee("lili", 700, 1993, 12, 15);
		/*例如:使用上面這句new Employee("lili", 700, 1993, 12, 15);
		 * 會將實例域(對象中的數據)設置爲
		 *  name = "lili"; 
		 *  salary = 700; 
		 *  hireDay = LocalDate.of(1993,12, 15);
		 */
		staff[1] = new Employee("max", 100, 1998, 12, 15);
		staff[2] = new Employee("jiating", 750, 1987, 12, 15);
		
		//對對象調用方法改變其行爲(behavior),如果不調用方法,對象的狀態是不會改變的
		for (Employee e : staff)
			e.raiseSalary(5);
		
		for (Employee e : staff)
			System.out.println("name=" + e.getName() + ",salary=" + e.getsalary() + ", hireDay=" + e.gethireDay());
	}
}

class Employee {
	
	// 3個實例域用來存放將要--操作的數據--,對象中的數據稱爲實例域( instance field ), 操縱數據的過程稱爲方法( method )
	//關鍵字 private 確保只有 Employee 類自身的方法能夠訪問這些實例域
	//爲什麼不能不使用public申明實例域呢?這是因爲public數據域允許程序中的任何方法對其進行讀取和修改。 這就完全破壞了封裝。
	private String name;
	private double salary;
	private LocalDate hireDay;

	// 父類構造器
	public Employee(String n, double s, int year, int month, int day) {

		name = n;
		salary = s;
		hireDay = LocalDate.of(year, month, day);
	}

	/*
	 * name 是一個只讀域。一旦在構造器中設置完畢, 就沒有任何一個辦法可以對 它進行修改,這樣來確保 name 域不會受到外界的破壞。
	 */
	public String getName() {
		return name;

	}
	
	//雖然 salary 不是隻讀域,但是它只能用 raiseSalary 方法修改
	public double getsalary() {
		return salary;
	}

	public LocalDate gethireDay() {
		return hireDay;
	}
	
	//將調用這個方法的對象的salary實例域設置爲新值,新值爲通過該方法得到的salary值
	//raiseSalary方法中有兩個參數
	//第一個爲隱式參數,是出現在方法名前實例域salary;一般使用this.salary來區分實例域和局部變量raise
	//第二個爲顯示參數,位於方法名後面括號中的數值double byPrecent,即後者出現在方法的聲明中
	
	public void raiseSalary(double byPercent) {
		
		double raise = this.salary * byPercent / 100;
		this.salary += raise;
	}

}


  class Manger extends Employee{
  
	//子類構造器
  public Manger(String n, double s, int year, int month, int day) { 
	  super(n, s,year, month, day);
  
  }
  
  }
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章