1. 程式人生 > >學習《Java核心技術卷1:基礎知識》中物件與類一章中遇到的問題

學習《Java核心技術卷1:基礎知識》中物件與類一章中遇到的問題

P101

4.3使用者自定義類

①Employee類的程式碼要注意內部類問題;

②同一個包中類的重名問題,尤其是寫在同一個檔案中的類;

package class20110906;
import java.util.Date;
import java.util.GregorianCalendar;

//import EmployeeTest20110906.Employee;

public class EmployeeTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// fill the staff array with three Employee objects
		Employee[] staff = new Employee[3];
		//new Employee("James Bond", 100000, 1950, 1, 1);
		
		//Eclipe提示下面三行出錯了,注意Employee的內部類問題
		staff[0] = new Employee("Carl Cracker", 75000, 1987, 11, 15);
		staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
		staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);
		
		// raise everyone's salary by 5%
		for (Employee e : staff)
			e.raiseSalary(5);

		// print out information about all Employee objects
		for (Employee e : staff)
			System.out.println("name=" + e.getName() + ",salary="
					+ e.getSalary() + ",hireDay=" + e.getHireDay());

	}
}

class Employee {//該正後,Eclipse提示這個類早已被定義
		public Employee(String n, double s, int year, int month, int day) {
			this.name = n;
			this.salary = s;
			GregorianCalendar calendar = new GregorianCalendar(year, month - 1,
					day);
			// GregorianCalendar uses 0 for January
			this.hireDay = calendar.getTime();
		}

		public String getName() {
			return this.name;
		}

		public double getSalary() {
			return this.salary;
		}

		/**
		 * 不要編寫返回引用可變物件的訪問器方法,會產生下列問題
		 * Employee harry = ...;
		 * Date d = harry.getHireDay();
		 * double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000;
		 * d.setTime(d.getTime() - (long) tenYearsInMilliSconds)
		 *let's give Harry ten years added seniority多增加了十年的工齡
		 * 
		 * 措施:先對其克隆再返回
		 * 
		 * @return
		 */
		/*public Date getHireDay() {
			return this.hireDay;
		}*/
		public Date getHireDay(){
			return (Date) this.hireDay.clone();
		}
		

		public void raiseSalary(double byPercent) {
			double raise = this.salary * byPercent / 100;
			this.salary += raise;
		}

		private String name;
		private double salary;
		private Date hireDay;
}