java中Object类4种方法详细介绍

作者:小应学长 时间:2023-11-03 16:06:12 

Object(四大方法):

文章干货满满,耐性看完~~
何为Object?
首先先来看看官方对Object的介绍:
在这里附上Java官方的查阅工具:https://docs.oracle.com/en/java/javase/17/docs/api/index.html

java中Object类4种方法详细介绍

由官方介绍可见,object属于Java.lang包内的一个类,而且提供了很多种方法, Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。简单的说Object类就是所有类的父类,包括我们所写的类,我们在使用类的时候就会利用Object类中的方法,之所以我们在日常学习和开发中见不到object这个类,是因为所有的父类都自动的继承了这个类,并且拥有object类的所有方法,并且可以对这些方法进行重写,达到我们的业务需求。

hashCode()方法:

hashCode()介绍:
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整 数。这个哈希码的作用是
确定该对象在哈希表中的索引位置。

用法:

//新建一个HashTest类
public class HashTest {
}

//测试类
public class TestMain {
   public static void main(String[] args) {
       HashTest h = new HashTest();      

int hash = h.hashCode();   //调用hashCode()方法
       System.out.println(hash);  //输出可以得到一串整数
   }
}
//460141958
//这个数也就是哈希码,也称为散列码,
//作用是确定该对象在哈希表中的索引位置

equals()方法:

参考官方文档可知:equals(Object obj),需要传入一个对象
所以这个方法的作用就是判断其他对象是否“等于”此对象,返回值也就是布尔类型。
上代码:

public class HashTest {
}  //还是使用那个类

public class TestMain {
   public static void main(String[] args) {
       HashTest h1 = new HashTest();
       HashTest h2 = new HashTest();  //用一个类去创建两个对象,判断是否相等

System.out.println(h1.equals(h2));  //语法:h1.equals(h2)
   }
}

//结果:false

到这里,很多人就会有疑问了,同样的一个类去创建两个对象,为什么会不一样呢?OK,首先我们看一下equals的源码,看看它的判断原理是什么:

//equals源码
  public boolean equals(Object obj) {
       return (this == obj);
   }

源码很简单,不就是两个==号,但是我们知道类的引用类型的数据,而用两个等于号去判断两个引用类型,是去判断两者的内存地址是否相同,当一个类去new一个新对象时,是在堆内存内开辟了一个新的空间,当去创建两个或者多个类的时候,每个类肯定有属于自己的空间,所有也有一个独一无二的地址,这就是为什么这个判断为什么不成立的原因。但是比较对象的引用对于我们在实际开发中没有意义,我们一般还是要重写该方法,比如去判断两者的参数是否相等:

public class HashTest {

private int age;

public HashTest() {
   }

public HashTest(int age) {
       this.age = age;
   }

public int getAge() {
       return age;
   }

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

//重写equals方法,只要HashTest生成的对象,传入age参数相等,即可判断两者一致
//重写后的equals,就不在是去判断两者的地址是否相同
   @Override
   public boolean equals(Object obj){
       HashTest h = (HashTest) obj;    //多态
       if(this.age == h.getAge()) {
           return true;
       }
       return false;
   }
}

//测试类:
public class TestMain {
   public static void main(String[] args) {
       HashTest h1 = new HashTest(5);
       HashTest h2 = new HashTest(5);

System.out.println(h1.equals(h2));
   }
}

//结果:true

//若吧其中一个age改成6:
public class TestMain {
   public static void main(String[] args) {
       HashTest h1 = new HashTest(5);
       HashTest h2 = new HashTest(6);

System.out.println(h1.equals(h2));
   }
}
//结果:flase

== 和 equals 的区别是什么?

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同 一个对象。
(基本数据类型== 比较的是值,引用数据类型 == 比较的是内存地址)

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有重写equals() 方法。则通过 equals() 比较该类的两个对象时, 等价于通过“==”比较这两个对象。
情况2:类重写了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象 的内容相等;若它们的内
容相等,则返回 true (即,认为这两个对象相等)

hashCode()与equals()的相关规定:

如果两个对象相等,则hashcode一定也是相同的 两个对象相等,对两个对象分别调用equals方法都返
回true, 两个对象有相同的hashcode值,它们也不一定是相等的。因此,equals 方法被重写过,则 hashCode 方法也必须被重写,hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指 向相同的数据)

getClass()方法:

返回此 Object 运行时的类,,获取对象的真实类的全名称
比如在使用多态时,父类引用变量,使用getClass()方法就可以看到真实的类:

public class HashTest {
}

//测试类
public class TestMain {
   public static void main(String[] args) {
       HashTest h1 = new HashTest();

System.out.println(h1.getClass());  //调用getClass()
   }
}

输出值:class HashTest

这个就比较好理解,简单的说就是看当时使用该方法的对象,到底是哪个类。还有一个应用场景,在使用多态的时候,在代码多的时候我们做不到用肉眼去找这个多态是用哪子类,即使找得到,也很浪费时间,那么getClass()方法就派上用场了:


//在polymorphismTest包下创建了Person类,作为父类
package polymorphismTest;
public class Person {
   public void eat(){
       System.out.println("我会吃饭");
   }
}

//创建Student类,继承Person
package polymorphismTest;
public class Student extends Person{

@Override    //重写父类eat方法
   public void eat(){
       System.out.println("我是学生,我也还吃饭");
   }
}

//测试类
package polymorphismTest;
public class TestMain {
   public static void main(String[] args) {

Person p = new Student();    //使用多态
       p.eat();                     //这里其实就是使用了Student子类的方法
       System.out.println(p.getClass());  //查看p到底是什么类
   }
}

//输出结果:
//我是学生,我也还吃饭
//class polymorphismTest.Student

用父类去引用子类的方法时,可以执行子类的方法,当用getClass()方法去查看,结果也是Student子类不使用多态,使用类本身去创建对象时:

package polymorphismTest;

public class TestMain {
   public static void main(String[] args) {

Person p = new Person();  //当这里不使用多态,而是使用本身的时候
       p.eat();
       System.out.println(p.getClass());
   }
}

//我会吃饭
//class polymorphismTest.Person
//这里返回的就是Person类了

toString()方法:

返回一个字符串来标识当前对象
对于这个方法,我们先来看看toString()源码:

public String toString() {
       return getClass().getName() + "@" + Integer.toHexString(hashCode());
   }

其实也很简,就是 类名+符号@+对象的哈希码值

public class TestMain {
   public static void main(String[] args) {

Person p = new Person();
       System.out.println(p.toString());
   }
}
//结果:polymorphismTest.Person@1b6d3586

但是这个返回值视乎没什么意义,所以,为了返回值有更多的意义,我们可以重写这个方法

来源:https://blog.csdn.net/m0_57310550/article/details/122414564

标签:Java,Object
0
投稿

猜你喜欢

  • mybatis错误之in查询 <foreach>循环问题

    2023-11-17 01:10:09
  • 使用Android开发接入第三方原生SDK实现微信登录

    2023-04-05 09:41:14
  • java中Executor,ExecutorService,ThreadPoolExecutor详解

    2023-10-31 10:50:56
  • Android 判断是否有外网连接

    2022-12-02 21:48:13
  • C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

    2022-01-22 20:55:59
  • Spring Boot实现图片上传功能

    2023-05-17 05:06:05
  • Java图论进阶之最小生成树算法详解

    2022-05-28 12:17:54
  • C#中事件的动态调用实现方法

    2022-08-29 03:27:28
  • JAVA中阻止类的继承(官方和非官方)

    2023-06-29 16:02:56
  • Mybatis结果集自动映射的实例代码

    2023-07-09 02:13:58
  • Java并发的CAS原理与ABA问题的讲解

    2023-11-25 12:17:21
  • JAVA面试题 简谈你对synchronized关键字的理解

    2022-09-17 17:06:05
  • C# Winform 调用系统接口操作 INI 配置文件的代码

    2023-03-04 11:49:54
  • mybatisPlus实现倒序拼接字符串

    2021-11-16 08:50:29
  • Android 获得View宽高的几种方式总结

    2021-11-12 05:06:49
  • java实现文件重命名的方法

    2022-11-06 05:42:25
  • Android Studio 代码导航快捷键

    2023-09-28 09:58:11
  • 浅谈C#中的值类型和引用类型

    2023-10-30 21:41:41
  • Java中将String类型依照某个字符分割成数组的方法

    2022-04-24 16:50:19
  • android.enableD8.desugaring = false引发问题解决

    2023-11-03 16:06:15
  • asp之家 软件编程 m.aspxhome.com