Java基础系列23-常用api之Object类

x33g5p2x  于2021-12-18 转载在 其他  
字(3.7k)|赞(0)|评价(0)|浏览(451)

一.Object类概述

Object是类层次结构的根类,所有的类都直接的或者间接的继承自该类。

Object 类api文档

二.Object类案例

2.1 Object类的toString()方法

Object:是类层次结构的根类,所有的类都直接的或者间接的继承自该类。
构造方法:Object()

直接输出对象名,输出底层调用的是该对象的toString()
查看API,我们发现建议所有子类都重写toString()。
到底该如何重写该方法呢?自动生成的就可以。

代码:
object1

package Java_study;

/**
 * 
 * @author  只是甲
 * @date    2021-06-30
 * @remark   Object类的toString()方法
 *
 */
public class object1 {
	private String name;
	private int age;
	
	public object1() {
		
	}
	
	public object1(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	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;
	}
	
	@Override
	//第一次打印object1对象时还没有重写toString方法,打印出来的是一串地址值
    //由于所有类的都默认继承Object类,所以也可以使用父类的toString(),默认打印了包名+类名+@+内存地址
    //重写tostring()可以自定义实现打印输出的结果
	public String toString() {
		return "object1[" +
	                "name='" + name + '\'' +
	                ",age=" +  age + 
	                ']';
	}
	
}

objectTest1

package Java_study;

/**
 * 
 * @author  只是甲
 * @date    2021-06-30
 * @remark   Object类的toString()方法-测试类
 *
 */
public class objectTest1 {
	public static void main(String[] args) {
		object1 student = new object1();
		student.setName("杜兰特");
		student.setAge(32);
		//1。重写toString方法前: Java_study.object1@15db9742
        //2. 重写toString方法后:objectTest1[name='杜兰特', age=32]
		System.out.println(student);
		
		/*//按住ctrl点击println查看打印方法的源码
		public void println(Object x) { //相当于子类对象赋值给父类的引用--多态的方式向上转型,即=> Object x = student;
		    String s = String.valueOf(x);
		    synchronized (this) {
		        println(s);
		    }
		}*/
		

		/* //再次按住ctrl点击valueOf方法查看源码,因为student对象不为null,所以实际上又调用了toString方法
		public static String valueOf(Object obj) {
		    return (obj == null) ? "null" : obj.toString();
		}
		*/

		 //输出结果与直接打印对象名一致
		//直接输出对象名,输出底层调用的是该对象的tostring()
		System.out.println(student.toString());

		/* //再次按住ctrl点击toString方法查看源码 返回的是类名+包名+@+内存的哈希地址
		public String toString() {
		    return getClass().getName() + "@" + Integer.toHexString(hashCode());
		}
		*/
		
	}

}

2.2 Object类的equals()方法

==:
  可以比较基本数据类型,比较基本数据类型的时候比较的是基本数据类型的值是否相同
  也可以比较引用数据类型,比较引用数据类型的时候比较的是引用数据类型的地址值是否相同

而我们现在想比较的是对象的内容是否相同?该怎么办呢?
通过查看API,我们找到了比较对象是否相等的方法:
  public boolean equals(Object obj)
  Object类中的equals()方法默认比较的是对象的地址是否相同。
如果我们想比较对象的内容是否相同,就必须自己重写该方法。

代码:
object2

package Java_study;

/**
 * 
 * @author  只是甲
 * @date    2021-06-30
 * @remark  学生类    Object类的equals()方法
 *
 */
public class object2 {
	private String name;
	private int age;
	
	public object2() {
		
	}
	
	public object2(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	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;
	}
	
	@Override
	public boolean equals(Object obj) {
		//执行语句: s1.equals(s2)
		//this: 表示 s1
		//obj:  表示 s2
		
		//没有加括号的if语句只能控制一个分号内的方法体,s1==s2不成立,所以此条return true不执行
		if (this == obj) return true;
		// obj == null -- 比较的对象是否为空(不成立)
        // getClass() != obj.getClass() -- 比较的对象是否不是同一个类的对象,如果不是同一个类的则没有比较的意义(不成立)
        // a||b表示:当a、b有一个为真时,结果为真。a、b都为假时结果为假。
        // false || false  =>  false  所以此条return false不执行
		if (obj == null || getClass() != obj.getClass()) return false;
		
		//obj向下转型(强转)
		object2 that = (object2) obj;
		
		// a&&b表示:当a、b都为真时,结果为真。有一个为假或者都为假时结果为假。
        // age == that.age 表示 s1.age == s2.age 判断结果为true
        // name.equals(that.name)  表示 s1.name == equals(s2.name) 比较字符内容是否相同,判断结果为true
        // true && true => true ;所以此条 return true 给测试类Demo3ObjectMethodEquals
		return age == that.age && name.equals(that.name);
		
	}

}

objectTest2

package Java_study;

/**
 * 
 * @author  只是甲
 * @date    2021-06-30
 * @remark  学生测试类    Object类的equals()方法
 *
 */
public class objectTest2 {
	public static void main(String[] args) {
		object2 s1 = new object2("杜兰特",32);
		object2 s2 = new object2("杜兰特",32);
		
		//object2对象 重写equals方法前:【false】
        //object2对象 重写equals方法前:【true】
		System.out.println(s1.equals(s2)); //true
		
		
		//s1,s2代表实例的引用 位于栈中,真正的对象实例存储在堆中,s1,s2存储了其实例在堆中的内存地址
        //重写equals方法前,比较的是s1,s2的地址值,因为是两个不同对象,所以地址值不同,结果为【false】
        //重写equals方法后,我们指定比较两者的属性值,结果为【true】
        Integer a = 123;
        Integer b = 123;
        System.out.println(a == b);//true
	}

}

参考:

  1. https://blog.csdn.net/qq_43529621/article/details/115379095

相关文章