面向对象——Object类

Object类介绍

 

什么是Object类:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。

 Object方法举例:

7740dfb97faf41eb84e0a9fd2bb7251f.png

 Object方法简介:

        public String toString() 返回该对象的字符串表示。

        public boolean equals(Object obj) 判断两个对象的地址是否相同。

        public native int hashCode() 返回该对象的哈希码值(集合讲)。

        public final native Class<?> getClass() 得到一个对象或者类的结构信息(反射讲)。

以下三个方法作用:等待,需要notify或notifyAll才能唤醒(多线程讲)

        public final void wait() throws InterruptedException;

        public final native void wait(long timeout) throws InterruptedException;

        public final void wait(long timeout, int nanos) throws InterruptedException;

 以下两个方法作用:唤醒(多线程讲)       

        public final native void notify();

        public final native void notifyAll();

native关键字解释:

native代表本地方法,所有用native修饰的方法都没有方法体。Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。可以将native方法比作Java程序同C程序的接口,使用native修饰的方法来访问底层的操作系统。

toString方法

toString 方法返回该对象的字符串表示,其实该字符串内容就是:对象的类型+@+哈希码。

【示例】toString代码底层

public String toString() {

     return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

【示例】重写toString方法案例

class TestDemo {

   String name;

   int age;

   public TestDemo(String name, int age) {

      this.name = name;

      this.age = age;

   }

   // 重写toString方法

   @Override

   public String toString() {

      return "TestDemo[name:" + name + " age:" + age + "]";

   }

}

public class ToStringDemo {

   public static void main(String[] args) {

      TestDemo demo = new TestDemo("小明", 18);

      // 输出:TestDemo[name:小明 age:18]

      System.out.println(demo);

   }

}

equals方法

Object类中的equals 方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类中的 equals 方法内部使用的就是==比较运算符。

 【示例】equals代码底层实现

public boolean equals(Object obj) {

     return (this == obj);

}

 【示例】equals方法使用案例

// Demo类

class Demo {

   String name;

   int age;

   public Demo(String name, int age) {

      this.name = name;

      this.age = age;

   }

}

// 测试类

public class EqualsDemo {

   public static void main(String[] args) {

      Demo d1 = new Demo("小明", 18);

      Demo d2 = new Demo("小明", 18);

      // d1和d2是不同的两个对象,那么在堆中的地址肯定不相同

      System.out.println(d1 == d2);  // 返回:false

      System.out.println(d1.equals(d2)); // 返回:false

      // 此时,d3和d1都指向堆中同一块地址

      Demo d3 = d1;

      System.out.println(d1.equals(d3)); // 返回:true

   }

}

 在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写 equals 方法根据对象的属性值进行比较。

【示例】判断Demo属性是否相同

// Demo类

class Demo {

   String name;

   int age;

   public Demo(String name, int age) {

      this.name = name;

      this.age = age;

   }

   /**

    * 重写equals方法,判断属性是否全部相同

    */

   @Override

   public boolean equals(Object obj) {

      // 1.判断传入的obj是否为null,为null则返回false

      if(obj == null) {

         return false;

      }

      // 2.判断地址是否相同,相同则返回true,否则继续判断属性是否相同

      if(this == obj) {

         return true;

      }

      // 3.依次判断对象中属性值是否相同,相同则返回true,否则返回false

      Parent p = (Parent)obj; // 强转

      if(this.name.equals(p.name) && this.age == p.age) {

         return true;

      }

      return false;  

}

}

// 测试类

public class EqualsDemo {

   public static void main(String[] args) {

      Demo d1 = new Demo("小明", 18);

      Demo d2 = new Demo("小明", 18);

      // 判断属性是否全部相同

      System.out.println(d1.equals(d2)); // 返回:true

   }

}

hashCode方法

【示例】使用hashCode方法案例

Student stu = new Student();

// 输出:2018699554

System.out.println(stu.hashCode());

// 输出:com.bjpowernode.objectClass.Studnet@7852e922

System.out.println(stu);

// Integer.toHexString()方法是把哈希值转化为16进制

// 输出:7852e922

System.out.println(Integer.toHexString(p.hashCode()));

因为hashCode方法没有用final修饰,所有我们可以重写hashCode方法。一般重写了equals方法都要重写hashCode方法

如果obj1.equals(obj2)的结果为true,那么可以推出obj1对象和obj2对象的hashCode肯定相等,但是hashCode相等不一定就满足equals。

不过为了提高效率,应该尽量使上面两个条件接近等价。

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深山老林.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值