Object类和@Data注解

Posted sunxuesong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Object类和@Data注解相关的知识,希望对你有一定的参考价值。

特别说明:若是有不对的地方欢迎指正

简要概述:

Object类是java中所有类默认继承的一个类。下面介绍一下Object类中的一些重要的方法,面试中也是经常会被问到的。尤其是==和equals的区别

1、getClass();

 1 package com.test;
 2 
 3 import lombok.Data;
 4 
 5 /**
 6  * @Title: StudyObj
 7  * @Description: Object类方法
 8  * @author: sunxuesong@hztianque.com
 9  * @date: Created in 12:46 2019/8/3
10  * @Modifired by:
11  */
12 @Data
13 public class StudyObj 
14 
15     public static void main(String[] args) 
16         StudyObj studyObj = new StudyObj();
17         // 得到运行状态中该类的路径 输出结果为:class com.test.StudyObj
18         System.out.println(studyObj.getClass());
19     
20 

 

2、clone();   // 顾名思义得到该类的一个副本,基本上不用

3、wait();、notify(); 、notifyAll()// 分别是等待、唤醒当前、唤醒所有的意思,基本上不用

4、hashCode(); // 得到该对象的一个hash码,返回值是int类型,基本上不用

5、finalize(); // 若该对象调用了finalize()方法则表示通知jvm去回收该对象进行资源释放,一般也不会被调用

6、toString(); // 输出的是类名+@+hashcode, 该方法一般都会被重写,若类中在加入@Data注解的时候,toString()会被重写返回的是属性和值

7、equals(Object); // 这里着重说说equals,请看下面的代码和注释说明

 1 package com.test;
 2 
 3 import lombok.Data;
 4 
 5 /**
 6  * @Title: StudyObj
 7  * @Description: sunxuesong
 8  * @author: sunxuesong@hztianque.com
 9  * @date: Created in 12:46 2019/8/3
10  * @Modifired by:
11  */
12 @Data
13 public class StudyObj 
14 
15     private String name;
16 
17     private StudyObj(String name) 
18         this.name = name;
19     
20 
21     public static void main(String[] args) 
22 
23         StudyObj studyObj1 = new StudyObj("张三");
24         StudyObj studyObj2 = new StudyObj("张三");
25         /*
26          * 答案是false
27          * 说到这里就有人会疑问了,参数里面明明是同一人问什么却是false,这里就牵扯到jvm的堆内存了
28          * 首先我们要知道凡是通过new关键字生成的对象都是在堆内存中,这中情况下比较的是堆中的内存地址
29          * 若该对象不是单例的或者该对象没有重写equals方法那么equals比较出来的将永远都是false
30          * 因为该类上面加了@Data注解,这个注解重写equals方法,所以当内容都是张三的时候返回的是true
31          * 抛去@Data注解则是false,我们一般用这个注解的目的是去除get和set方法来达到代码简洁的目的
32          * 所以这个注解要慎用
33          */
34         if (studyObj1.equals(studyObj2)) 
35             System.out.println(true);
36         else 
37             System.out.println(false);
38         
39         /*
40         * 这里返回的是false,和equals一样比较的是jvm堆中的内存地址是不是指向同一个内存
41         * 说明:对象比较的是内存,像下面的String进行equals比较的则是值(切记)
42         * 但是==比较的还是堆内存地址是否指向同一个内存
43         */
44         if (studyObj1 == studyObj2) 
45             System.out.println(true);
46         else 
47             System.out.println(false);
48         
49 
50         String str1 = new String("aaa");
51         String str2 = new String("aaa");
52         // true
53         System.out.println(str1.equals(str2));
54         // false
55         System.out.println(str1 == str2);
56 
57     
58 

总结:==和equals区别:

对象:==和equals比较的都是内存地址是否指向同一块内存

String:比较的是值是否相同

若类上面加了@Data注解则表示重写了equals方法,对象中的属性值一致的话也是返回为true,否则为false

若是单例模式则返回的是true,为什么呢??下结将说明单例的好处,以及为什么在写代码的时候要用单例?

以上是关于Object类和@Data注解的主要内容,如果未能解决你的问题,请参考以下文章

Object类 包装类和数学处理类 String类

object类和内部类

kotlin学习总结——object关键字数据类密封类嵌套类和内部类

Object类和常用方法

python 新式类和经典类(了解)

Java基础—API及Object类和String类