Object类的toString和Equals方法,以及Objects类的Equals方法

简介: Object类 toString()方法 public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name =

Object类


toString()方法


public class Person {
    private String name;
    private int age;
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    /*
    直接打印对象的地址值没有意义,需要重写Object类中的toString方法
    打印对象的属性(name,age)
     */
    /*
    @Override
    public String toString() {
        //return "abc";
        return "Person{name="+name+",age="+age+"}";
    }*/
    //alt+fn+insert直接插入toString(),可默认重写
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
==========================================================
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/*
java.lang.Object
类Object是类层次结构的根类
每个类(Person,Student...)都使用Object作为超(父)类
所有对象(包括数组)都实现这个类的方法
 */
public class Demo01 {
    public static void main(String[] args) {
        /*
        Person类默认继承了Object类,所以可以使用Object类中的toString方法
        String toString()返回该对象的字符串表示
         */
        Person p=new Person("zhangsan",18);
        String s=p.toString();
        System.out.println(s);  
        //com.Object.Person@1b6d3586    /abc    /Person{name=zhangsan,age=18}
        //直接打印对象的名字,其实就是调用对象的toString方法 p=p.toString();
        //打印对象在堆内存中的地址值
        System.out.println(p);  
        //com.Object.Person@1b6d3586    /abc    /Person{name=zhangsan,age=18}
        //看一个类是否重写了toString,直接打印这个类的对象即可;如果没有重写toString方法那么打印的是对象的地址值
        Random r=new Random();      //未重写toString方法
        System.out.println(r);//java.util.Random@4554617c
        Scanner sc=new Scanner(System.in);      //重写了toString方法
        System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+..
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list);//[1, 2, 3]    重写了toString方法
    }
}


Equals方法


import java.util.Objects;
public class Demo03_Objects {
    public static void main(String[] args) {
        String s1 = "abc";
        //String s1 = null;
        String s2 = "abc";
        //boolean b = s1.equals(s2); //NullPointerException null是不能调用方法的,会抛出空指针异常
        //System.out.println(b);
        /*
        Object类的equals方法:对两个对象进行比较,防止空指针异常
        public static boolean equals(Object a, Object b){
            return (a == b) || (a != null && a.equals(b));
        }
         */
        boolean b2 = Objects.equals(s1, s2);
        System.out.println(b2);
    }
}
================================================================================
import java.util.Objects;
public class Person {
    private String name;
    private int age;
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    /*
    Object类的equals方法,默认比较的是两个对象的地址值,没有意义
    所以我们要重写equals方法,比较两个对象的属性(name,age)
    问题:
        隐含着一个多态
        多态的弊端:无法使用子类特有的内容(属性和方法)
        Object obj = p2 = new Person("古力娜扎",19);
        解决:可以使用向下转型(强转)把obj类型转换为Person
     */
    /*@Override
    public boolean equals(Object obj) {
        //增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序效率
        if (obj==this){
            return true;
        }
        //增加一个判断,传递的参数obj如果是null,直接返回false,提高程序的效率
        if (obj==null){
            return false;
        }
        //增加一个判断,防止类型转换异常ClassCastException
        if (obj instanceof Person){
            //使用向下转型,把obj转换为Person类型
            Person p = (Person)obj;
            //比较两个对象的属性,一个对象是this(p1),一个对象是p(obj->p2)
            boolean b = this.name.equals(p.name) && this.age == p.age;
            return b;
        }
        //不是Person类型,直接返回false
        return false;
    }
*/
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        //getClass() != o.getClass() 使用反射技术判断o是否是Person类型   等效于 obj instanceof Person
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}


相关文章
|
2月前
|
Java
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
7天前
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
13 0
|
2月前
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
2月前
|
前端开发 Java 编译器
【前端学java】java中的Object类和前端中的Object有什么区别(9)
【8月更文挑战第10天】java中的Object类和前端中的Object有什么区别
33 0
【前端学java】java中的Object类和前端中的Object有什么区别(9)
|
2月前
|
UED 开发工具 iOS开发
Uno Platform大揭秘:如何在你的跨平台应用中,巧妙融入第三方库与服务,一键解锁无限可能,让应用功能飙升,用户体验爆棚!
【8月更文挑战第31天】Uno Platform 让开发者能用同一代码库打造 Windows、iOS、Android、macOS 甚至 Web 的多彩应用。本文介绍如何在 Uno Platform 中集成第三方库和服务,如 Mapbox 或 Google Maps 的 .NET SDK,以增强应用功能并提升用户体验。通过 NuGet 安装所需库,并在 XAML 页面中添加相应控件,即可实现地图等功能。尽管 Uno 平台减少了平台差异,但仍需关注版本兼容性和性能问题,确保应用在多平台上表现一致。掌握正确方法,让跨平台应用更出色。
34 0
|
2月前
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
|
5月前
|
Java
Java Object 类
5月更文挑战第16天
|
2月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
29 5
|
3月前
|
Java
Java中的Object类 ( 详解toString方法 | equals方法 )
Java中的Object类 ( 详解toString方法 | equals方法 )
|
5月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
49 2
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
下一篇
无影云桌面