java高级 —- Object类,Objects类

1551-龙同学

发表文章数:45

首页 » Java » 正文

java高级 —- Object类,Objects类

Object类的理解概述:

java.lang.Object类是所有类的最终父类,没有指定父类的类默认继承Object类。有一般方法返回对象的字符串表示,比较两个对象的内容是否一样。

Object类的是使用概述:

  • toString方法默认返回的字符串内容为"对象类名@内存地址",需要重写该方法返回对象属性值的字符串表现形式,IntelliJ IDEA中alt+insert可使用自动重写的toString()方法,可根据具体需求在自动实现的基础上手动重写。
  • equals(Object obj)方法默认判断调用对象与参数对象的内存地址是否相等,需要重写方法判断对象属性值是否相同,IntelliJ IDEA中alt+insert可使用自动重写的equals(Object obj)方法,可根据具体需求在自动实现的基础上手动重写。

Objects类的理解概述:

Objects类是对Object类可能出现空指针问题进行的优化。包含null-save(空指针安全的)或null-tolerant(容忍空指针的)的静态方法,用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。

Objects类的使用概述:

  • import java.util.Objects;导入Objects包类,直接用Objects类名调用equals(Object obj1,Object obj2)。
  • IDEA中自动重写equals()方法,选择java.util.Objects.equals and hashCode(java 7+)。

Object类toString(),equals()方法,,Objects类中equals()方法最终测试代码:

package com.baishi.stage1.day10;
/**
 * 构造用户类不重写Object类toString(),equals()方法
 * 构造用户类重写Object类toString(),equals()方法
 */

import java.util.Objects;

class User1/*extends Object*/ {
    private String name;
    private String keyword;

    User1() {
    }

    User1(String name, String keyword) {
        this.name = name;
        this.keyword = keyword;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getKeyword() {
        return keyword;
    }
    /*默认的toString()方法底层代码:
   public String toString(){
       return getClass().getName()+"@"+Integer.toHexString(hashCode());
   }
*/

/*   默认的equals(Object obj)方法底层代码:
 public boolean equals(Object obj){
        return (this == obj);
//默认的equals()方法同"==",基本数据比较的数值,引用类型数据比较的是对象中的属性
}
*/
}

class User2/*extends Object*/ {
    private String name;
    private String keyword;

    User2() {
    }

    User2(String name, String keyword) {
        this.name = name;
        this.keyword = keyword;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getKeyword() {
        return keyword;
    }

    //code-generate 选择自动重写toString()方法
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '/'' +
                ", keyword='" + keyword + '/'' +
                '}';
    }

    //  同上,选择自动重写equals()方法连同hashCode()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User2 user = (User2) o;
        return Objects.equals(name, user.name) &&
                Objects.equals(keyword, user.keyword);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, keyword);
    }
}

/**
 * 创建默认类的有一个,重写类两个都为同属性的对象
 * 测试分别调用Object类默认的,重写的toString()方法
 * 测试分别调用Object类默认的,重写的,Objects类的equals()方法
 */
public class MyTest {
    public static void main(String[] args) {
        Object obj1 = new User1("萨曼莎", "123456");//Object类可以用为任何类创建多态对象。
        Object obj2 = new User2("萨曼莎", "123456");
        Object obj3 = new User2("萨曼莎", "123456");
        //
        //直接打印对象的名字,就是调用对象的String  p=p.toString();
        //默认的toString()方法就是“包类名”+@+内存地址值
        String a = obj1.toString();
        System.out.println(a); //com.baishi.stage1.day10.User1@1b6d3586
        //System.out.println(obj1); com.baishi.stage1.day10.User1@1b6d3586
        //
        //重写后覆盖默认方法,返回有效新信息对象属性值
        String b = obj2.toString();
        System.out.println(b);  //User{name='萨曼莎', keyword='123456'}
        //System.out.println(obj2);//User{name='萨曼莎', keyword='123456'}
        //
           /*
            Objects类的默认的equals方法:对两个对象进行比较,防止空指针异常
            public static boolean equals(Object a, Object b) {
                return (a == b) || (a != null && a.equals(b));
            }
         */
        //默认的equals()方法只有同一内存地址对象时返回为真
        System.out.println(obj1.equals(obj2));//false 内存地址不同
        //System.out.println(Objects.equals(obj1, obj2));
        System.out.println(obj1.equals(null));//IDEA中null空指针异常可自动编译为false
        //System.out.println(Objects.equals(obj1, null));
        //
        //重写后的equals()方法在同一类对象+属性值相同时返回为真
        System.out.println(obj2.equals(obj1));//false 多态下的子类不同
        System.out.println(obj2.equals(obj3));//true
        //System.out.println(Objects.equals(obj2, obj3));
    }
}

 

未经允许不得转载:作者:1551-龙同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《java高级 —- Object类,Objects类》 发布于2021-02-16

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录