1.Object类是java所有类的始祖,java中的每一个类都是由它扩展而来的。
2.如果没有明确的指出超类,Object就被认为是这个类的超类。
class a extends Object class a //可以缺省
3.可以使用Object类型变量引用任何类型的对象。
Object e = new Employee("w1",100,1988,1,1);
int[] a = new int[3]; Object obj = a; obj = new int[10];
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;
}
}
原文地址:http://blog.csdn.net/zhurui_idea/article/details/44702621