您的位置:首页 > 移动开发 > Objective-C

Object(所有类的超类)一些有用的方法讲解与实例演示

2015-04-17 19:12 369 查看

Object是所有类的始祖,java中的每个类的都是它拓展而来的。

Object的euqals方法、hashCode方法、getClass方法和toString方法在操作对象时是非常有用的方法。


1.euqals方法
euqals方法用于检测一个对象是否等于另外一个对象(两个对象是否指向同一块存储区域),java语言规范要求euqals方法具有以下特性:

自反性、对称性、传递性、一致性并且对于任意的非空引用x,x.equals(null)应返回false.

java7在java.util包下新增了Objects工具类,用于操作对象,下面是其原版API的介绍:

public final class Objects extends Object

This class consists of static utility methods for operating on objects.

These utilities include null-safe or null-tolerant methods for computing the hash code of an object, returning a string for an object, and comparing two objects. Since: 1.7

2.hashCode方法

hashCode(散列码)是由对象导出的一个整型值,没有规律。

特别注意euqals方法和hashCode方法必须一致,如果x.euqals(y)返回true,那么x.hashCode()=y.hashCode()

3.toString方法

toString方法用于返回表示对象的字符串。

如果要打印多维数组,需要调用java.util.Arrays.deepToString()方法。java.util包下从jdk1.2开始增加的Arrays工具类,包含了大量操作数组的有用的方法,它也重写了Object的很多方法,用于操作对象。

4.getClass方法

返回包含对象信息的类对象,java提供了类运行时的描述,它的内容被封装在java.lang.Class类中。

java.lang.Class类的方法:

String getName() ---- 返回这个类的名字

Class getSuperClass() ---- 以Class对象的形式返回这个类的超类信息

下面是一个完整的实例,以一个员工类的例子演示了这几个方法的应用(请于不低于JDK1.7环境编译运行):

1.员工类

/**
*员工类
*/
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Objects;
public class Employee
{
	/**
	*@param name 员工姓名
	*@param salary 员工工资
	*@param hireDate 雇用日期
	*/
	private String name;
	private double salary;
	private Date hireDay;
	/**
	*构造方法 初始化员工类的字段
	*/
	public Employee(String n,double s,int year,int month,int day)
	{
		name=n;
		salary=s;
		GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
		hireDay=calendar.getTime();
	}
	/**
	*私有字段访问器
	*/
	public String getDate()
	{
		return name;
	}
	public double getSalary()
	{
		return salary;
	}
	public Date getHireDay()
	{
		return hireDay;
	}
	/**
	*涨工资的方法
	*/
	public void raiseSalary(double byPercent)
	{
		double raise=salary*byPercent/100;
		salary+=raise; 
	}
	/**
	*重写euqals方法、hashCode方法和toString方法
	*/
	@Override
	public boolean equals(Object obj)
	{
		if(this==obj)	return true;
		if(obj==null)	return false;
		if(getClass()!=obj.getClass())	return false;
		Employee other=(Employee)obj;
		return Objects.equals(name,other.name)&&salary==other.salary&&Objects.equals(hireDay,other.hireDay);
	}
	@Override
	public int hashCode()
	{
		return Objects.hash(name,salary,hireDay);
	}
	@Override
	public String toString()
	{
		return "\t"+getClass().getName()+"\t员工姓名:\t"+name+"\t员工工资:\t"+salary+"\t雇用日期:\t"+hireDay;
	}
}


2.经理类(继承员工)

/**
*经理类 增加了奖金字段
*/
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 void setBonus(double b)
	{
		bonus=b;
	}
	/**
	*重写Employee的getSalary、equals和方法
	**/
	@Override
	public double getSalary()
	{
		double base=super.getSalary();
		return base+bonus;
	}
	@Override
	public boolean equals(Object obj)
	{
		if(!super.equals(obj))	return false;
		Manager other=(Manager)obj;
		return other.bonus==bonus;
	}
	@Override
	public String toString()
	{
		return super.toString()+"\t经理奖金:\t"+bonus;
	}
}


3.测试类



//测试类
/**
*@author lijtaos@sina.com
*@version 1.0 2015-04-17
**/
public class Test
{
	public static void main(String[] args)
	{
		Employee tom=new Employee("Tom",7500,2010,3,15);
		Employee tom1=tom;
		Employee tom2=new Employee("Tom",7500,2010,3,15);
		tom1.raiseSalary(15);
		Manager bob=new Manager("Bob",10000,2010,3,15);
		bob.raiseSalary(10);
		bob.setBonus(25000);
		System.out.println("tom==tom1:\t"+(tom.equals(tom1)));
		System.out.println("tom==tom2:\t"+(tom.equals(tom2)));
		System.out.println("bob=======\t"+bob);
		System.out.println("tom=======\t"+tom);
		System.out.println("tom1======\t"+tom1);
		System.out.println("tom2======\t"+tom2);
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: