import java.util.*; public class Employee { //构造器,-------------------------------------------------注意参数的命名规则 //默认构造器 public Employee() { } public Employee(String firstName , String lastName , double salary , int year, int month, int day) { this.firstName = firstName ;//不要在构造器中定义与实例域重名的局部变量,如:String firstName = f ; this.lastName = lastName ; this.salary = salary ; GregorianCalendar calendar = new GregorianCalendar(year,month - 1,day); // GregorianCalendar uses 0 for January this.hireDay = calendar.getTime() ; } public Employee(String firstName , String lastName , double salary) { this.firstName = firstName ; this.lastName = lastName ; this.salary = salary ; } public Employee(double salary) { this.salary = salary ; } /*public Employee(double salary) { //calls Employee(String, String, double) this() ; //nextId++ ; }*/ // 定义方法 public int getId() { return id ; } public String getName() { return firstName+" "+lastName ; } public double getSalary() { return salary ; } //----------------------------------------------若需返回一个可变数据域的拷贝,应该使用克隆,以免破坏封装性 public Date getHireDay() { return (Date)hireDay.clone() ; } //----------------------------------------------关键字this表示隐式参数 public void raiseSalary(double byPercent) { double raise = this.salary * byPercent /100 ; this.salary += raise ; } // 定义 equals 方法======================================================================= public boolean equals(Object otherObject) { // a quick test to see if the objects are identical if(this == otherObject) return true ; // must return false if the explicit parameter is null if(otherObject == null) return false ; //if the classes don't match , they can't be equal if(getClass() != otherObject.getClass()) return false ; // now we know otherObject is a non-null Employee Employee other = (Employee) otherObject ; // test whether the fields have idential values return firstName.equals(other.firstName) && lastName.equals(other.lastName) && salary == other.salary && hireDay.equals(other.hireDay) ; } // 定义hashCode方法====================================================================== public int hashCode() { return 7 * firstName.hashCode() + 11 * lastName.hashCode() + 13 * new Double(salary).hashCode() + 17 * hireDay.hashCode() ; } // 定义 toString 方法======================================================================= public String toString() { return getClass().getName() + "[ firstName= " + firstName + " , lastName= " + lastName + " , salary= " + salary + " , hireDay= " + hireDay +" ] " ; } //定义 域 private static int nextId ; private int id ; private String firstName = " ";//实例域初始化 private String lastName = " ";//实例域初始化 /* private final String firstName ;//String类是一个不可变的类,声明为final类型 private final String lastName ;//表示对象在构建之后不会再被修饰,即没有setName方法 */ private double salary ; private Date hireDay ; //静态初始化块 static { Random generator = new Random() ; //set nextId to a random number between 0 and 9999 nextId = generator.nextInt(10000) ; } //对象初始化块 { id = nextId ; nextId++ ; } }
public class Manager extends Employee { // 定义构造器,通过super 调用超类的构造器 public Manager(String firstName , String lastName , double salary , int year , int month , int day ) { super(firstName , lastName , salary , year , month , day) ; bonus = 0 ; } // 定义子类的getSalary方法,覆盖超类中的getSalary方法 public double getSalary() { double baseSalary = super.getSalary() ;//通过super调用超类的getSalary方法 return baseSalary + bonus ; } public void setBonus(double bonus) { this.bonus = bonus ; } // 定义子类Manager对象的equals方法,通过super调用超类的equals方法 public boolean equals(Object otherObject) { if(!super.equals(otherObject)) return false ; Manager other = (Manager) otherObject ; // super.equals checked that this and other belong to the same class return this.bonus == other.bonus ; } // 定义子类的hashCode方法 public int hashCode() { return super.hashCode() + 19 * new Double(bonus).hashCode() ; } // 定义子类的toString方法 public String toString() { return super.toString() + "[ bonus= " + bonus + " ]" ; } private double bonus ; }
public class EqualsTest { public static void main(String[] args) { Employee alices1 = new Employee("Alice", "Adams", 75000, 1987, 12, 15) ; Employee alices2 = alices1 ; Employee alices3 = new Employee("Alice", "Adams", 75000, 1987, 12, 15) ; Employee bob = new Employee("Bob", "Brandson", 50000, 1989, 10, 1) ; System.out.println("alices1 == alices2: " + (alices1 == alices2)) ; System.out.println("alices1 == alices3: " + (alices1 == alices3)) ; System.out.println("alices1.equals(alices3): " + alices1.equals(alices3)) ; System.out.println("alices1.equals(bob): " + alices1.equals(bob)) ; System.out.println("bob.toString(): " + bob) ; Manager carl = new Manager("Carl", "Cracker", 80000, 1987, 12, 15) ; Manager boss = new Manager("Carl", "Cracker", 80000, 1987, 12, 15) ; boss.setBonus(5000) ; System.out.println("boss.toString(): " + boss) ; System.out.println("carl.equals(boss): " + carl.equals(boss)) ; System.out.println("alices1.hashCode(): " + alices1.hashCode()) ; System.out.println("alices3.hashCode(): " + alices3.hashCode()) ; System.out.println("bob.hashCode(): " + bob.hashCode()) ; System.out.println("carl.hashCode(): " + carl.hashCode()) ; } }
public class EmployeeTest { public static void main(String[] args) { //fill the staff array with three Employee objects Employee[] staff = new Employee[3]; staff[0] = new Employee("Carl","Crack",75000,1987,12,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);//使用for each 循环结构 //print out information about all Employee objects for(Employee e : staff) System.out.println("name= " + e.getName() +",salary= "+e.getSalary() +",hireDay= "+e.getHireDay()); } }
public class ManagerTest { public static void main(String[] args) { // constructor a Manager object Manager boss = new Manager("Carl" , "Cracker" , 80000 , 1987 , 12 ,15) ; boss.setBonus(5000) ; Employee[] staff = new Employee[3] ; // fill the staff array with Manager and Employee objects staff[0] = boss ; //置换法则,将Manager类对象赋值给Employee类对象 staff[1] = new Employee("Harry" , "Hacker" , 50000 , 1989 , 10 ,1) ; staff[2] = new Employee("Tommy" , "Tester" , 40000 , 1990 , 3 , 15) ; //print out information about all Employee objects for(Employee e : staff) System.out.println("name=" +e.getName() + ", salary= "+e.getSalary()) ;//此处的变量e即引用了超类Employee的getSalary方法,又同时引用了子类Manager的getSalary方法,这种现象叫做多态。 } }
public class ParamTest { public static void main(String[] args) { /* Test 1: Methods can't modify numeric parameters 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型值) */ System.out.println("Testing tripleValue:"); double percent = 10 ; System.out.println("Before: percent= "+percent); tripleValue(percent); System.out.println("After: percent= "+percent); /* Test 2: Methods can change the state of object parameters 一个方法可以改变一个对象参数的状态 */ System.out.println("\nTesting tripleSalary: "); Employee harry = new Employee("Harry " , "Crack" , 5000); System.out.println("Before: salary= "+harry.getSalary()); tripleSalary(harry); System.out.println("After: salary= "+harry.getSalary()); /* Test 3: Methods can't attach new objects to object parameters 一个方法不能让对象参数引用一个新的对象 */ System.out.println("\nTesting swap: "); Employee a = new Employee("Eric" , "Zhang" , 70000); Employee b = new Employee("Huiyi" , "Chang" , 50000); System.out.println("Before: a= "+a.getName()); System.out.println("Before: b= "+b.getName()); swap(a,b); System.out.println("After: a= "+a.getName()); System.out.println("After: b= "+b.getName()); } //Test 1 public static void tripleValue(double x) //does'nt work { x = 3 * x ; System.out.println("End of Method: x= "+x ); } //Test 2 public static void tripleSalary(Employee x) //works { x.raiseSalary(200); System.out.println("End of Methods: salary= "+x.getSalary()); } //Test 3 public static void swap(Employee x , Employee y) { Employee temp = x ; x = y ; y = temp ; System.out.println("End of Methods: x = "+x.getName()); System.out.println("End of Methods: y = "+y.getName()); } } /*结果如下: Testing tripleValue:--------------------------------------未发生改变 Before: percent= 10.0 End of Method: x= 30.0 After: percent= 10.0 Testing tripleSalary: ------------------------------------发生改变 Before: salary= 5000.0 End of Methods: salary= 15000.0 After: salary= 15000.0 Testing swap: --------------------------------------------a,b未发生改变,x,y发生改变 Before: a= Eric Zhang Before: b= Huiyi Chang End of Methods: x = Huiyi Chang End of Methods: y = Eric Zhang After: a= Eric Zhang After: b= Huiyi Chang */
import java.util.*; public class CalendarTest { public static void main(String[] args) { //construct d as current date构造一个日历对象 GregorianCalendar d = new GregorianCalendar(); //2次调用get方法得到当时的日、月 int today = d.get(Calendar.DAY_OF_MONTH); int month = d.get(Calendar.MONTH); // set d to start date of the month将d设置为这个月的第一天 d.set(Calendar.DAY_OF_MONTH,1); //并且获得第一个月的第一天是星期几 int weekday = d.get(Calendar.DAY_OF_WEEK); //print heading System.out.println(" Sun Mon Tue Wed Thu Fri Sat "); // indent first line of calendar for(int i = Calendar.SUNDAY; i < weekday; i++) System.out.print(" "); do { //print day int day = d.get(Calendar.DAY_OF_MONTH); System.out.printf("%4d", day); //mark current day with * if(day == today) System.out.print("*"); else System.out.print(" "); //start a new line after every Saturday if(weekday == Calendar.SATURDAY) System.out.println(); //advanced d to the next day d.add(Calendar.DAY_OF_MONTH,1); weekday = d.get(Calendar.DAY_OF_WEEK); } while (d.get(Calendar.MONTH) == month); // the loop exits when d is day 1 of the the next month //print final end of line if necessary if (weekday != Calendar.SUNDAY) System.out.println(); } }