题外话
万物皆有根,上了革命的小船,谁也不能下车,昨天从医院看看了奶奶,感慨万千.年纪大了,身子骨脆弱,在楼层间推着病床穿梭,看着各种各样的病人,看着他们难受的样子,那种气氛压迫的我难以呼吸,我的脑海浮现出很多很多画面,年轻人在奋斗的过程中也把爱分给自己一点吧,也记得照顾好自己.
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);
}
原创不容易,希望客官,给个机会!