Object类

Object类

Object类是所有类的父类(基类),如果一个类没有明确的继承某一个具体的类,则将默认继承Object类,拥有Object类的方法。

image-20211119105435684

示例:

public class Person{}
<=>  
public class Person extends Object {}

使用Object可以接收任意的引用数据类型。

示例:

public class Person{
    public static void main(String[] args) {
        Person person = new Person();
        show(person);
    }
    public static void show(Object o) {
        System.out.println(o);
    }
}

运行结果:image-20211119104633520

1.toString方法

建议每个子类都重写这个方法。

image-20211119105556773

示例:

/**
 * Person类
 * @author 孟祥宽
 *
 */
public class Person{
	
	private String name;
	private int age;
	
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}

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

/**
 * 测试类
 * @author 孟祥宽
 *
 */
public class Test {

	public static void main(String[] args) {
		Person person = new Person();
		System.out.println(person.toString());
	}
}

运行结果:image-20211119105957717

toString()源码如下:

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());// 默认返回的是类名加上哈希码
    }

如果想要展示我们想要展示的信息则需要重写toString()方法:

/**
 * Person类
 * @author 孟祥宽
 *
 */
public class Person{
	
	private String name;
	private int age;
	
	public Person() {
		// TODO Auto-generated constructor stub
		this("默认名字",15);
	}

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

	/**
	 * 重写toString
	 */
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "姓名:" + this.name + ";\n年龄:" + this.age;
	}
}

/**
 * 测试类
 * @author 孟祥宽
 *
 */
public class Test {

	public static void main(String[] args) {
		Person person = new Person();
		System.out.println(person.toString());// <=> System.out.println(person);
        /*
        	因为println() 方法 如果参数是字符串 执行这个方法
        	public void println(String x) {
        		synchronized (this) {
            		print(x);
            		newLine();
        		}
    		}
    		但是参数是对象的时候执行
    		public void println(Object x) {
        		String s = String.valueOf(x);
        			--这个valueOf()的源码:
        				public static String valueOf(Object obj) {
        					return (obj == null) ? "null" : obj.toString();// 他会执行Object的toString()方法;
    					}
        			--
        		synchronized (this) {
            		print(s);
            		newLine();
        		}
    		}
        */
	}
}

重写之后再执行:image-20211119110440914

2.equals方法

image-20211119155918899

最好创建一个类就重写一个equals方法。

/**
	 * 重写equals
	 */

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

※ == 和 equals 区别:

== 比较的是虚拟地址,equals比较的是地址中储存的值。

public static void main(String[] args) {
		Person person1 = new Person();
		Person person2 = new Person();
		String str1 = "基本信息";
		String str2 = "基本信息";
		String str3 = new String("基本信息");
		String str4 = new String("基本信息");
		int a = 1;
		int b = 1;
		/**
		 * == 比较的是内存地址
		 */
		System.out.println(person1.equals(person2));// false 因为person1和person2的地址
		System.out.println(person1 == person2);// false 同上
		System.out.println("-----------------");
		System.out.println(str1);
		System.out.println(str2);
		System.out.println("**********");
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		System.out.println("基本信息".hashCode());// 获取“基本信息”的虚拟地址
		System.out.println("**********");
		System.out.println(str1 == str2);// true str1和str2是同一个虚拟地址
		System.out.println(str1.equals(str2));// true 这个调用的是String类里重写的equals方法判断是值
//		System.out.println(a == b);
		System.out.println("-----------------");
		System.out.println(str3);
		System.out.println(str4);
		System.out.println(str3 instanceof String);
		System.out.println(str3 == str4);// false new关键字开辟不同的堆内存 虚拟地址不一致
		System.out.println(str3.equals(str4));// true 这个调用的是String类里的equals方法
	}

未完待续...

posted @ 2021-11-25 10:50  雨溟  阅读(83)  评论(0)    收藏  举报