目录
- 一. Object简介
- 1. 简介
- 二. 常用方法
- 1. clone()方法
- 1.1 clone方法作用
- 1.2 clone源码分析
- 1.3 Java的浅克隆与深克隆
- 2. hashCode()方法
- 2.1 简介
- 2.2 hash值
- 2.3 案例
- 3. equals(obj)方法
- 3.1 equals简介
- 3.2 使用原则
- 3.3 基本特性
- 3.4 案例
- 4. getClass()方法
- 4.1 简介
- 4.2 案例
- 5. toString()方法
- 5.1 简介
- 5.2 案例
- 6. wait()、wait(long)、wait(long,int)、notify()、notifyAll()方法
- 7. finalize()方法
- 7.1 简介
- 7.2 案例
- 三. 结语
一. Object简介
1. 简介
在了解Object中的常用方法之前,我们先来看看Object类的源码,如下所示:
/** * Class {@code Object} is the root of the class hierarchy. * Every class has {@code Object} as a superclass. All objects, * including arrays, implement the methods of this class. * @author unascribed * @see java.lang.Class * @since JDK1.0 */ public class Object { ......
从Object类的源码注释可以知道,Object类是Java中所有类的父类,相当于是Java中的”万类之王“,处于最顶层。 所以在Java中,所有的类默认都继承自Object类。同时Java中的所有类对象,包括数组,也都要实现这个类中的方法。
所以,Object是Java中所有类的父类、超类、基类,位于继承树的最顶层。可以说,任何一个没有显式地继承别的父类的类,都会直接继承Object,否则就是间接地继承Object,并且任何一个类也都会享有Object提供的方法。又因为Object是所有类的父类,所以基于多态的特性,该类可以用来代表任何一个类,允许把任何类型的对象赋给 Object类型的变量,也可以作为方法的参数、方法的返回值。
我们知道,Java中还有一个==运算符,也可以对两个对象进行比较。如果是基本数据类型,==比较的是它们的值是否相同;如果是引用数据类型,比较的是它们的内存地址是否相同。而equals()方法则是比较两个对象的内容是否相等。
3.2 使用原则
我们在使用equals()方法时,需注意下面这些原则:
(1).equals()只能处理引用类型变量;
(2).一般情况下,equals()方法比较的是两个引用类型变量的地址值是否相等;
(3).但是String类、基本类型包装类、File类、Date类等,都重写了Object类的equals()方法,比较是两个对象的"具体内容"是否相同。
3.3 基本特性
另外Java语言规范也要求equals方法具有下面的特性:
自反性 : 对于任何非空引用x,x.equals(x)应该返回true;
对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true;
传递性:对于任何引用x,y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true;
一致性 : 如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果;
对于任何非空引用x,x.equals(null)应该返回false。
3.4 案例
/** * @author 一一哥Sun * 千锋教育 */ public class ObjectTest { public static void main(String[] args) { Dog dog01=new Dog("乔治01"); Dog dog02=new Dog("乔治02"); System.out.println("dog01对比dog02 "+(dog01==dog02));//false //equals()方法的底层默认还是利用==实现的 System.out.println("dog01对比dog02 "+(dog01.equals(dog02)));//false } }
从上面的案例中,我们也可以证明,equals()方法用于处理引用类型的变量,默认比较的是两个引用类型的变量地址是否相等。
4. getClass()方法
4.1 简介
getClass()方法可以用于获取对象运行时的字节码类型,得到该对象的运行时的真实类型。该方法属于Java的反射机制,其返回值是Class类型,例如 Class c = obj.getClass();。
通过对象c,我们可以进一步获取该对象的所有成员方法,每个成员方法都是一个Method对象。我们也可以获取该对象的所有成员变量,每个成员变量都是一个Field对象。同样的,我们也可以获取该对象的构造函数,构造函数则是一个Constructor对象。
4.2 案例
/** * @author 一一哥Sun * 千锋教育 */ public class ObjectTest { public static void main(String[] args) { //判断运行时d对象和c对象是否是同一个类型 Animal d = new Dog(); Animal c = new Cat(); //方式1:通过instanceof关键字判断 if((d instanceof Dog && c instanceof Dog) ||(d instanceof Cat && c instanceof Cat)) { System.out.println("是同一个类型"); }else { System.out.println("不是同一个类型"); } //方式2:通过getClass方法判断 if(d.getClass() == c.getClass()) { System.out.println("是同一个类型"); }else { System.out.println("不是同一个类型"); } } }
从上面的代码案例中,我们可以得知,getClass方法用于返回该对象的真实类型(运行时的类型),可以根据对象的字节码来判断两个对象是否是同一个对象。
5. toString()方法
5.1 简介
toString()方法可以说是一个进行“自我描述”的方法,可以返回某个对象的字符串,当要输出某个实例对象的信息时,我们可以通过重写该方法来输出自我描述的信息。该方法通常只是为了方便输出本类的描述信息,比如执行System.out.println("xyz")
这样的日志语句。一般情况下,当程序要输出一个对象或者把某个对象和字符串进行连接运算时,系统就会自动调用该对象的toString()方法返回该对象的字符串表示。
Object类的toString()方法会返回“运行时的类名@十六进制哈希码”格式的字符串,但很多类都重写了 Object类的toString()方法,用于返回可以表述该对象信息的字符串。
5.2 案例
/** * @author 一一哥Sun * 千锋教育 */ public class Dog implements Animal{ private String name; public Dog() {} public Dog(String name) { this.name = name; } @Override public void eat() { System.out.println("小狗"+this.name+"狗爱吃骨头"); } //@Override //public String toString() { //return "Dog name= " + name; //} } public class ObjectTest { public static void main(String[] args) { Dog dog=new Dog("乔治"); System.out.println("dog一号="+dog); System.out.println("dog二号="+dog.toString()); } }
上述代码执行结果如下图所示:
然后我们对Dog对象进行回收测试:
public class ObjectTest { public static void main(String[] args) { Dog dog=new Dog("乔治"); //手动将对象标记为垃圾对象 dog = null; //触发垃圾回收器,回收垃圾对象 System.gc(); } }
要想确保finalize()方法的执行,我们首先需要在相关对象中重新finalize()方法,然后将待回收的对象手动标记为null,最后再手动调用gc()方法,这样才有可能确保finalize()方法一定执行。
三. 结语
至此,就把Object类给大家介绍完毕了,这个类的内容并不是很难,主要是掌握几个常用的方法就可以了,尤其是equals()、hashCode()、toString()、getClass()等方法。
以上就是Java中Object用法详解的详细内容,更多关于Java Object的资料请关注其它相关文章!
原文地址:https://juejin.cn/post/7225269942756999225