我的java学习笔记(9)关于Object:所有类的超类

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;
	}
}

输出结果


技术分享



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。