Object类为什么这么强?

题外话

万物皆有根,上了革命的小船,谁也不能下车,昨天从医院看看了奶奶,感慨万千.年纪大了,身子骨脆弱,在楼层间推着病床穿梭,看着各种各样的病人,看着他们难受的样子,那种气氛压迫的我难以呼吸,我的脑海浮现出很多很多画面,年轻人在奋斗的过程中也把爱分给自己一点吧,也记得照顾好自己.

Object

啥是Object类啊?(叫我声爸爸不过分吧!)

类Object是类层次结构的根。 每个类都有Object作为超类。 所有对象(包括数组)都实现此类的方法。 一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类;优秀就优秀吧,而且还懂事,Obeject在java.lang包下,你在用它是时候还不用导包,你说气人不气人?

//啥意思呢? 就是
	class Son{
    
    }
	//等价于
	class Son extends Object{
    
    }

这还不是更夸张的,更夸张的是它还能接收所有类的对象 ,太讲究了.

public class Demo01 {
    
    
    public static void main(String[] args) {
    
    
        Object food = new Food();
        Object meat = new Meat();
    }
}
class Food{
    
    }
class Meat{
    
    }

它能干啥?(它的方法)

先看看JDK的说辞:
在这里插入图片描述
深入源码中瞅方法:

	//返回此 Object的运行时类
	public final native Class<?> getClass();
	//用于哈希查找
	public native int hashCode();
	//用于比较指示 某个其他对象是否“等于”此对象
 	public boolean equals(Object obj) {
    
    
        return (this == obj);
    }
    //保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
 	protected native Object clone() throws CloneNotSupportedException;
 	public String toString() {
    
    
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    //该方法唤醒在该对象上等待的某个线程。
    public final native void notify();
    //该方法唤醒在该对象上等待的所有线程
    public final native void notifyAll();
    //wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
    public final void wait() throws InterruptedException {
    
    
        wait(0L);
    }
    public final native void wait(long timeoutMillis) throws InterruptedException;
    rotected void finalize() throws Throwable {
    
     }
    public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
    
    
        if (timeoutMillis < 0) {
    
    
            throw new IllegalArgumentException("timeoutMillis value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
    
    
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
    
    
            timeoutMillis++;
        }

        wait(timeoutMillis);
    }

我们平时用的比较多的无非是比较比较和toString()方法了.

如果不我们直接打印toString()方法是哈那?在源码中,可以发现通过反射,获取到了当前对象的全限定类名和@十六进制哈希值字符串。这就是不重写写toString()时直接打印输出的内容。

package week.third.test;

public class Demo02 {
    
    
    public static void main(String[] args) {
    
    
        Object s = new Student();
        System.out.println(s);
        //week.third.test.Student@49e4cb85
        
    }
}
class Student {
    
    }

现在我们就来操作操作吧.

public class Demo01 {
    
    
    public static void main(String[] args) {
    
    
        Object person = new Person("张三",18);
        Object person1 = new Person("张三",18);
        //演示: equals();  false
        System.out.println(person.equals(person1));

        //演示: toSting();  Person{Name='张三', age=18}
        System.out.println(person.toString());

    }
}
class Person{
    
    
    public String getName() {
    
    
        return Name;
    }

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

    public Person() {
    
    
    }

    public void setName(String name) {
    
    
        Name = name;
    }

    private String Name;

    public int getAge() {
    
    
        return age;
    }

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

    @Override
    public String toString() {
    
    
        return "Person{" +
                "Name='" + Name + '\'' +
                ", age=" + age +
                '}';
    }

    private int age;


}

这时候就发现问题了,明明是一样的,为什么是false,直接调用equals()方法默认进行比较的是两个对象的地址。即使 在对象的属性相同时,也会返回false.这个源码也有解释.

解铃还须系铃人,还需要重写一下比较的方法,这样就可以判断属性了.重新完之后,就返回true了.所以,引用类型的数据在进行比较时,应该先覆写equals()方法,不然比较的还是两个对象的堆内存地址值,必然不会相等.

 @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(Name, person.Name);
    }

原创不容易,希望客官,给个机会!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AzirBoDa/article/details/112862710