欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Object类和类中常用的方法:hashCode(),getClass(),toString(),equals(Object obj)(默认),clone();

程序员文章站 2022-04-19 18:24:29
...

                                                              Object:代表所有的根类,任何类都继承自Object类

Object中长用的方法及其用法:

public int hashCode()返回该对象的哈希码值(和集合hashtable :哈希表)
                      每一个对象的哈希码值都不一样,  哈希码值不是实际意义上的地址值,可以理解为地址值

public final Class<?> getClass()返回此 Object 的运行时类。 (Java原理:运行的xx.class文件:字节码文件)
      Class:表示的字节码文件对象--->通过字节码文件对象使用反射的方式去加载当前字节码文件中的成员变量/成员方法/构造方法
                返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
       在Class类:
                public String getName() :以 String 的形式返回此 Class 对象所表示的实体(接口,类,数组...)名称

package org.westos.Demo4;

public class Student {

}
package org.westos.Demo4;
public class ObjectDemo {
	
	public static void main(String[] args) {
		//创建一个学生对象
		Student s1 = new Student() ;
		System.out.println(s1.hashCode());//118352462
		//创建第二个学生对象
		Student s2 = new Student();
		System.out.println(s2.hashCode());
		Student s3 = new Student();
		System.out.println(s3.hashCode());
		System.out.println("----------------------");
		
		//直接调用getClass() ;
		Class c1 = s1.getClass() ;
		//返回的字节码文件对象(Class对象)
		System.out.println(c1);//class westos.org.object_demo.Student
		//westos.org.object_demo.Student  :全路径名称
		String name = c1.getName() ; //Class类中getName() 
		System.out.println(name);//westos.org.object_demo.Student
	}
}

 

public String toString()  

                              返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。
                                            结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。重写后打印的是该对象的                                              名称和成员变量的值;                     

                               类中有成员变量:
                                              toString()的目的就是为了显示当前类的成员变量;
                               Integer类中:
                                              public static String toHexString(int i)返回一个整数参数的字符串表示形式。

package org.westos.Demo4;

//自定义学生类
public class Student1 {

	private String name;
	private int age;
	private String gender;

	public Student1() {
		super();
	}

	public Student1(String name, int age, String gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	// @Override
	// public String toString() {
	// return "Student1 [name=" + name + ", age=" + age + ", gender=" + gender +
	// "]";
	// }
	//

}
package org.westos.Demo4;

public class ObjectDemo1 {

	public static void main(String[] args) {

		// 创建一个学生对象
		Student1 s1 = new Student1("张三", 28, "男");
		// 直接输出对象名称
		System.out.println("s1:" + s1); // 输出对象名称打印出来地址值没意义
		// 重写toString(),直接输出对象名称,打印出来的是成员变量的值
		// [email protected]
		// westos.org.object_demo2.Student:类的全路径(全限定)名称
		// @:地址值标记
		// 70dea4e 这是一个16进制数据

		Student1 s2 = new Student1("李四", 29, "男");
		System.out.println(s2);

		/*
		 * System.out.println(s1.getClass().getName());//westos.org.object_demo2.Student
		 * System.out.println("@");//@
		 * System.out.println(Integer.toHexString(s1.hashCode()));//70dea4e
		 */
		System.out.println("------------------");
		// toString():不需要自己写, 直接自动生成
		

		// System.out.println(s1.getClass().getName()+"@"+Integer.toHexString(s1.hashCode()));
		// System.out.println(s1.toString());

	}
}

equals(Object obj):

                     某个对象是否与此对象“相等”。 

            基本数据类型:比较的他们的具体值是否相同
            引用数据类型:比较的是地址值是否相等(系统默认),重写之后比较两个对象中的内容是否相等

                        Object中的equals方法的源码
                                      public boolean equals(Object obj) {
                                                     return (this == obj);
                                       }
                         通过源码观察:equals方法默认比较的是两个对象的地址值是否相同
                                           所以默认地址值不够好,如果两个对象的成员变量一样,应该看成为同一个对象,就需要重写equals方法
           

             ==:(引用类型)比较的是地址值是否相等

package org.westos.Demo4;

//测试类
public class ObjectDemo2 {
	// 主方法
	public static void main(String[] args) {
		Student2 s1 = new Student2();// 两种初始化方式
		s1.setName("张三");
		s1.setAge(23);
		s1.setSex('男');

		Student2 s2 = new Student2("张三", 23, '男');

		System.out.println(s1);// 重写toString()后打印出类名+成员变量值
		System.out.println(s1 == s2);// false
		System.out.println(s2);
		System.out.println(s1.equals(s2));// false

		System.out.println("重写equals()之后");

		System.out.println(s1);
		System.out.println(s1 == s2);// false
		System.out.println(s2);
		System.out.println(s1.equals(s2));// ture

	}

}
package org.westos.Demo4;

//定义一个Student类
public class Student2 {
	private String name;
	private int age;
	private char sex;

	// 无参构造
	public Student2() {
		super();

	}

	// 有参构造
	public Student2(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	// setXXX()和getXXX方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	// 重写toString()
	@Override
	public String toString() {
		return "Student2 [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

	// 重写hashCode()
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + sex;
		return result;
	}

	// 重写equals方法
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student2 other = (Student2) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (sex != other.sex)
			return false;
		return true;
	}

}

Object中的clone()方法
           protected(保证数据的安全性) Object clone()throws CloneNotSupportedException
           创建并返回此对象的一个副本
注意:
           Object 类的 clone 方法执行特定的复制操做

           首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。

package org.westos.Demo4;
//测试类
public class ObjectDemo5 {
	//主方法 抛出异常
	public static void main(String[] args) throws CloneNotSupportedException {
		Student5 s1 = new Student5();//定义一个Student对象
		s1.setName("张三");
		s1.setAge(20);
		s1.setSex('男');
		
		Object o = s1.clone();//调用clone()复制对象s1,用Object的引用变量来接收
		
		Student5 s2 = (Student5)o;//向下转型
		System.out.println(s1);
		System.out.println(s2);
		
		System.out.println("-------------------------------------");
		//传统方式
		Student5 s3 = s1;
		System.out.println(s1);
		System.out.println(s3);
		
	}

}
package org.westos.Demo4;

//定义一个Student5类   要想使用Clone()这个方法必须实现Cloneable这个接口
class Student5 implements Cloneable {
	private String name;
	private int age;
	private char sex;

	// 无参构造
	public Student5() {
		super();

	}

	// 有参构造
	public Student5(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	// setXXX()和getXXX()
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	// 重写toString()
	@Override
	public String toString() {
		return "Student5 [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

	// 重写clone()
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}

}