服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java中Object用法详解

Java中Object用法详解

2023-05-10 01:04未知服务器之家 Java教程

目录 一. 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()方法

目录
  • 一. 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中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());
          }
      }

      上述代码执行结果如下图所示:

      Java中Object用法详解

      然后我们对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

      延伸 · 阅读

      精彩推荐