1.Object类是java所有类的始祖,java中的每一个类都是由它扩展而来的。
2.如果没有明确的指出超类,Object就被认为是这个类的超类。
class a extends Object class a //可以缺省
3.可以使用Object类型变量引用任何类型的对象。
Object e = new Employee("w1",100,1988,1,1);
4.在java中,只有基本类型不是对象,数组类型,不管是对象数组还是基本而类型的数组都可扩展于Object类。
int[] a = new int[3]; Object obj = a; obj = new int[10];
5.Object类中的equals方法用于检测一个对象是否等于另外一个对象。该方法判断的是两个对象是否具有相同的引用。
6.在子类中定义equals方法时,首先调用超类的equals。如果检测失败,对象就不可能相等,如果超类中的域都相等了,就需要比较子类中的实体域了。
7.java语言规范要求equals方法具有:a.自反性b.对称性c.传递性d.一致性e.非空引用返回false。
8.编写一个equals方法的思路:
a.检测是否引用同一对象。
b.检测比较对象是否为null。
c.检测是否属于同一个类。
d.对类中实体域进行比较。
9.散列码是由对象导出的一个整型值。没有规律。
10.由于hashCode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址。
11.hashCode方法应该返回一个整型数值,并合理地组织实例域的散列码,以便能够让各个不同的对象产生均有的散列码。
12.equals方法与hashCode方法的定义必须一致:如果x.equals(y)返回true,那么x.hashCode()必须与y.hashCode()具有相同的值。
13.在Object类中,toString方法用于返回表示对象值得字符串。
14.如果x是任意一个对象,并调用
System.out.println(x);
println方法就会直接调用x.toString(),并打印字符串。
15.Object类定义了toString方法,用来打印输出对象所属的类名和散列码。
相关实例程序
测试类
public class test { public static void main(String[] args) { Employee w1 = new Employee("worker1",1000,1989,1,1); Employee w2 = w1; Employee w3 = new Employee("worker1",1000,1989,1,1); Employee w4 = new Employee("worker4",2000,1991,1,1); System.out.println("w1 == w2:"+(w1==w2)); System.out.println("w1 == w3:"+(w1==w3)); System.out.println("w1.equals(w3):" + w1.equals(w3)); System.out.println("w1.equals(w4):" + w1.equals(w4)); System.out.println("w4.toString():" + w4); Manager m1 = new Manager("m1",1000,1981,1,1); Manager m2 = new Manager("m1",1000,1981,1,1); m2.setBonus(100); System.out.println("m2.toString():" + m2); System.out.println("m1.equals(m2):" + m1.equals(m2)); System.out.println("w1.hashCode():" + w1.hashCode()); System.out.println("w3.hashCode():" + w3.hashCode()); System.out.println("w4.hahaCode():" + w4.hashCode()); System.out.println("m1.hahaCode():" + m1.hashCode()); System.out.println("m2.hahaCode():" + m2.hashCode()); } }
雇员类
import java.util.*; public class Employee { private String name; private Date hireDay; private double salary; public Employee(String n,double s,int year,int month,int day) { name = n; salary = s; GregorianCalendar gr = new GregorianCalendar(year,month - 1,day); hireDay = gr.getTime(); } public String getName() { return name; } public double getSalary() { return salary; } public Date getHireDay() { return hireDay; } public void raiseSalary(double p) { double raise = salary * p / 100; salary += raise; } public boolean equals(Object otO) { if(this == otO) return true; if(otO == null) return false; if(getClass() != otO) return false; Employee o = (Employee) otO; return Objects.equals(name, o.name) && salary == o.salary && Objects.equals(hireDay, o.hireDay); } public int hashCode() { return Objects.hash(name,salary,hireDay); } public String toString() { return getClass().getName() + "name =" + name + ", salary =" + salary +", hireDay =" + hireDay; } }
经理类
public class Manager extends Employee { private double bonus; public Manager(String n,double s,int year,int month,int day) { super(n,s,year,month,day); bonus = 0; } public double getSalary() { double baseSalary = super.getSalary(); return baseSalary + bonus; } public void setBonus(double b) { bonus = b; } public boolean equals(Object otO) { if(!super.equals(otO)) return false; Manager m = (Manager) otO; return bonus == m.bonus; } public int hashCode() { return super.hashCode() + 11 * new Double(bonus).hashCode(); } public String toString() { return super.toString() + "bonus =" + bonus; } }
输出结果