java常用类三:Object

1.Object类概述
  java.lang.Object类是Java语言中的根类,即所有类的父类。一个类中只要没有明显的继承一个类,则肯定是Object类的子类。其中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。如果一个类没有特别指定父类, 那么默认则继承自Object类。那么既然继承了Object类,Object类有哪些作用呢?实际上Object类中提供了很多的方法,如下:

方法名称

类型

描述

public Object()

构造

构造方法

public boolean equals(Object obj)

普通

对象比较

public int hashCode()

普通

取得Hash码

public String toString

普通

对象打印时调用


2.Object类常用方法
这里介绍两个主要方法:toString()和equals()方法。

方法一:public String toString方法
  在讲解toString()方法之前,先看以下这段代码:

class Demo{  //定义Demo类,实际上就是继承了Object类
}

// 另外创建一个java.class文件:ObjectDemo01
public class ObjectDemo01{
	public static void main(String args[]){
		Demo d = new Demo();  //实例化Demo对象
		System.out.println("不加toString()输出:"+d); //	不加toString()输出:Object.Demo@34a245ab
		System.out.println("加上toString()输出:"+d.toString());//加上toString()输出:Object.Demo@34a245ab	
	}
}

从上面的程序运行结果可以看出,加与不加toString()最终的输出结果是一样的,也就是说对象输出的结果是一样的,也就是说对象输出时一定会调用Object类中的toString()方法打印内容。所以利用此特性就可以通过toString()取得一些对象的信息,如下面代码:

class Person{
	private int age;
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String toString(){  //此处重写toString方法
		return "姓名:" + this.name + "; 年龄:" + this.age;
	}
}

public class ObjectDemo02{
	public static void main(String args[]){
		Person per = new Person("张三",30);
		System.out.println("对象信息:"+per);
	}
}

程序的Person类中重写了Object类中的toString()方法,这样直接输出对象时调用的是被子类重写过的toString()方法。

方法二:对象的比较操作:public boolean equals(Object obj)
  Object类中的equals()方法实际上也是可以使用的,默认使用的是按地址进行比较,并不能对内容进行比较。

class Person{
	private String name;  //定义name属性
	private int age;  //定义age属性
	//创建构造方法来初始化该对象,给对象的成员变量赋初值
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public boolean equals(Object obj){
		if(this==obj){  //地址相等
			return true;  //肯定是同一个对象
		}
		if(!(obj instanceof Person)){  //不是Person对象
			return false;
		}
		Person per = (Person) obj;  //向下转型:通过父类实例化子类
		if(per.name.equals(this.name)&&per.age==this.age){
			return true;  //依次比较内容
		}else{
			return false;
		}
	}
	public String toString(){
		return "姓名:" + this.name + ":年龄:" + this.age;
	}
}

class OjectDemo03{
	public static void main(String args[]){
		Person per1 = new Person("张三",30);  //实例化Person
		Person per2 = new Person("张三", 30);  //实例化Person
		System.out.println(per1.equals(per2)?"是同一个人!":"不是同一个人!");
		System.out.println(per1.equals("hello")?"是同一个人!":"不是同一个人!");
	}
}

在Person类中重写了equals()方法,首先判断传递进来的对象与当前对象的地址是否相等,如果相等,则肯定是同一个对象,因为在equals()方法处传递参数是Object类型,所以任何对象都可以接收,这样在对象进行向下转型前就必须进行判断,判断传进来的对象是否是Person的实例,如果不是,则直接返回false;如果是,则将各个属性依次进行判断。

写在最后:既然Object类是所有对象的父类,则所有的对象都可以向Object进行转换,在这其中也包含了数组和接口类型(这里就不在演示了),即一切的引用数据类型都可以使用Object进行接收。

如果感觉看的有些生涩,可以把代码运行一下看看,代码都是调试好了的,结合代码会更容易懂的。