Java基础之初识Java中的Object类

Object所属包:java.lang

Object在Java_API帮助文档中的描述:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

本次讲述类Object的hashCode()方法,getClass()方法,toString()方法,equals()方法

首先创建一个JavaBean类Student,其中的属性包括姓名,年龄,性别,代码如下:

public class Student {
	private String name;
	private Integer age;
	private String sex;
	public Student() {     // 空参构造
		super();
	}
	public Student(String name, Integer age, String sex) {     // 有参构造
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
        /*
         * 生成属性的get,set方法(使用快捷键-Alt+Shift+s 生成)
         */
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

(类Object的hashCode()方法)

hashCode():返回该对象的哈希码值;返回值类型为int型。

import com.heima.bean.Student;
public class Demo1_Hashcode {
	/*
	 * 不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。
	 */
	public static void main(String[] args) {
		Object obj = new Object();
		System.out.println(obj.hashCode());	
		Student stu1 = new Student("张三", 23, "男");    // Ctrl + Alt + 下建   向下复制一行
		Student stu2 = new Student("李四", 24, "男");
		System.out.println(stu1.hashCode());
		System.out.println(stu2.hashCode());
	}
	
}

我们会发现三个输出语句输出的结果都不相同。

(类Object的getClass()方法)

getClass():返回该对象正在运行的类;通过obj.getClass().getName()来获取当前正在运行的Java对象的类的名称,返回值为String类型的字符串。

public class Demo2_GetClass {
	public static void main(String[] args) {
		Student stu = new Student();
		
		Class clazz = stu.getClass();      // 获取该对象的字节码文件
		String name = clazz.getName();     // 获取类的名称
		System.out.println(name);
	}

}

(类Object的toString()方法) 

toString():返回该对象的字符串表示,建议所有子类都重写此方法;返回值为String类型的字符串。

public class Demo3_ToString {
	/* 没有重写toString()方法时输出
	 * com.heima.bean.Student@15db9742
	 * public String toString() {
	 * 		return getClass().getName() + "@" + Integer.toHexString(hashCode());
	 * }
	 * 左边:类名
	 * 中间:@
	 * 右边:hashCode的十六进制表现形式,返回值为String
	 * toString()方法一般重写,用来更方便的显示对象的属性值
	 * 而getXxxx()方法可以获取值,除可以显示属性值之外,还可以进行修改和其他操作
	 */
	public static void main(String[] args) {
		Student stu = new Student("张三", 23, "男");
		System.out.println(stu.toString());
		System.out.println(stu);    // 如果直接打印对象的引用,或默认调用toString()方法
		
		System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge() + ",性别:" + stu.getSex());		
	}
}

toString()源码中的 Integer.toHexString(hashCode()) 我们通过查看API中的Integer可知:

toHexString(int i):以十六进制无符号整数形式返回一个整数参数的字符串表现形式。

在Student类中重写toString()方法:

        // 使用快捷键生成toString()方法 - Alt+Shift+s
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

(类Object的equals()方法)

equals():用于比较两个对象是否相等,使用类Object中的equals()方法时,一般会重写equals()方法;返回值类型boolean型。

public class Demo4_Equals {	
	/*
	 * equals()方法,用于比较两个对象是否相等
	 * public boolean equals(Object obj) {
	 *     return (this == obj);
	 * }
	 * 类Object中的equals()方法是比较对象的地址值,没有什么实际意义,
	 * 因为在开发过程中我们通常比较的是对象的属性值,我们认为相同的属性是同一对象,
	 * 因此我们一般要重写equals()方法
	 */
	public static void main(String[] args) {	
		Student stu1 = new Student("张三", 23, "男");
		Student stu2 = new Student("张三", 23, "男");
		boolean b = stu1.equals(stu2);
		System.out.println(b);
		System.out.println(stu1 == stu2);    // 比较两个对象是否相等,其实equals()方法的底层原理使用的就是-(this == obj)
		
	}

}

重写类Object中的equals()方法:

	@Override
	public boolean equals(Object obj) {       // stu1.equals(stu2);
		// (Object obj)与(stu2): 父类引用指向子类对象,所以父类无法反问子类所特有的属性和行为,需向下转型
		Student stu = (Student) obj;
		return this.name.equals(stu.name) && this.age == stu.age && this.sex.equals(stu.sex);
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章