2020年3月5日16:55:21
注意构造器和C++中结构体的不同,为了防止错误,不应该写实例域。而且更不要将变量的命名与实例域重名。
隐式参数与显式参数
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
这个里面,double byPercent就是显式参数,它是明显地显示在方法声明的,而salary就是隐式参数,它并没有在方法中声明,但是它参与了方法,它出现在方法名的前面的某个类里面。类似于C++中较为大一点的局部变量(全局变量)。
2020年3月5日18:13:58
4.3.6中警告的内容涉及了,对象封装不好的弊端。
Employee harry = .....;
Date d = harry.getHireDate();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000 ;
d.setTime ( d.getTime () - ( long ) tenYearsInMilliSeconds ) ;
上面这个就是错误的,我没看懂这个代码啥意思。应该是d这个量减去十年
根据书上的叙述来说,主要问题是,对象的多方位更改,意思就是d这个变量能够直接更改这个harry.hireDay,造成了错误,这个不难理解,后面继续学习感悟。
2020年3月5日18:22:41
类的访问权限这个地方,意思就是说类里面的方法可以访问类里面的所有对象。
私有方法,这个地方,简单来说就是仅仅这类中可以使用这个方法,其他类是不能使用这个方法的。
这个final这个地方试了一下。
package test;
import java.time.*;
public class EmployeeTest{
public static void main(String[] args) {
Employee[] staff = new Employee[3];
staff [ 0 ] = new Employee ( " Carl Cracker " , 75000 , 1987 , 12 , 15 ) ;
staff [ 1 ] = new Employee ( " Carl Cracker1 " , 75000 , 1984 , 12 , 1 ) ;
staff [ 2 ] = new Employee ( " Carl Cracker2" , 7500 , 1986 , 1 , 1 ) ;
Employee tmp = new Employee("sssss", 75000 , 1987 , 12 , 15);
System.out.println("name = " + tmp.getName() + ",salary = " + tmp.getSalary() + ",hireDay = " + tmp.getHireDay());
tmp.changeName("qwerw");
System.out.println("name = " + tmp.getName() + ",salary = " + tmp.getSalary() + ",hireDay = " + tmp.getHireDay());
// for(Employee e : staff) {
// e.raiseSalary(5);
// System.out.println("name = " + e.getName() + ",salary = " + e.getSalary() + ",hireDay = " + e.getHireDay());
// }
}
}
class Employee{
private String name;
private double salary;
private LocalDate hireDay;
public void changeName(String n) {
name = n;
}
public Employee(String n,double s, int year, int month, int day) {
name = n;
salary = s;
hireDay = LocalDate.of(year,month,day);
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public LocalDate getHireDay(){
return hireDay;
}
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
}
在之前的代码上面加上了private String name;,这是可以实现的。(sssss变成了qwerw)
但是我们如果这样设置name
private final String name;
changeName的方法将会报错,也就是说name这个值将无法更改
这里就是有个小插曲是,关于日期的报错:
Employee tmp = new Employee("sssss", 75000 , 0, 0 , 0);
这时候是会出错的,而且是编译的时候出错,因为0这个数值无法对应月份。