详解Java中的println输入和toString方法的重写问题

 更新时间:2022年04月22日 14:39:03   作者:是小鱼儿哈  
这篇文章主要介绍了Java中的println输入和toString方法的重写,一个对象数组在调用Arrays.toString打印时,相当于遍历数组,然后打印里边每个对象,这再打印对象就调用对象自己的toString了,需要的朋友可以参考下

println()直接打印

我们都知道println()如果打印的是基本数据类型的话直接打印出来的就是值,你如果是引用数据类型呢?

916a11449a3e1757f28a248eb07ff780.png

🍑除掉这四类八种基本类型,其它的都是对象,也就是引用类型,包括数组。

让我们来测试一下

public class test1 {
    public static void main(String[] args) {
        int[] ret = {1, 2, 3, 4}; 
        System.out.println(ret); // 括号里是一个引用数据类型
    }
}

🍑这是个什么东东,是地址吗?

让我们扒开println的源码看看,在IDEA中只需鼠标放到println的位置,然后ctrl + 鼠标左键点过去就行了,就能看到println的源码了

😎然后我们来到了valueof方法内部

😎最后来到了object类中的toString方法内部

😎再来看看刚才我们的输出:

好像,我们用println()打印出来的就是上面toString方法里的内容,

而:

toString()方法是在Object类里面的方法,它返回的是String型的数据:类名+@+哈希值的16进制形式

📝其实具体Object类中的toString方法干了什么我们不用弄得太清楚,我们只要知道println()在打印引用数据类型的时候打印的是Object类中的toString内容就好了。

但对于这个Object类,我们得说道说道。

Object 是Java类库中的一个特殊类,也是所有类的父类。也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类。

toString的使用

🌰先看看这个栗子

class Student1 {
    private String name;
    private int score;
    public Student1(String name, int score) {
        this.name = name;
        this.score = score;
    }
}
public class test2 {
    public String author = "what!!!";
    public static void main(String[] args) {
        // 我们自定义了一个学生对象student1
        Student1 student1 = new Student1("张三", 42); 
        System.out.println(student1);
    }
}

那我们该怎样输出引用类型的值呢?

我们上面不是说了吗?Object是所有类的父类,既然在打印引用变量的时候调用了Object类的toString方法,我们可以可以在object的子类重写toString方法

🍑那么我们就可以在我们自定义的学生类里重写父类toString的方法

🍑同时告诉大家一个好消息,在IDEA里有相应的快捷方式,可以帮助我们重写父类的方法toString

🏀然后我们的代码就变成了这样

class Student1 {
    private String name;
    private int score;
    public Student1(String name, int score) {
        this.name = name;
        this.score = score;
    }
     //在我们自定义的子类里重写toString方法
    @Override
    public String toString() {
        return "Student1{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
}
public class test2 {
    public static void main(String[] args) {
        // 我们自定义了一个学生对象student1
        Student1 student1 = new Student1("张三", 42);
        System.out.println(student1);

📝 这样的话,我们就在自己的类中重写了Object的toString方法,那么println()调用的就是我们重写的toString方法,自然就打印出来了值。

其他的一些情况

🍑如果我们想打印一个数组呢?

public class test2 {
    public static void main(String[] args) {
        int[] ret = new int[]{1, 2, 3};
        System.out.println(ret);
    }
}

📝如果是一个数组,我们想重写toString方法都不知道应该在哪个地方重写。这时候我们该怎么办呢?别急在Arrays类中专门提供了一个打印数组类型的方法——toString

😮(不要误会,这是Arrays自己的toString方法,不是从父类Object继承的那个toString方法,他们只是名字重合了而已。千万不要把他当成是对父类Object的toString方法的重写,因为他们的参数列表都不一样)

public class test2 {
    public static void main(String[] args) {
        int[] ret = new int[]{1, 2, 3};
        System.out.println(Arrays.toString(ret));
    }
}

🏀为啥会这样呢?我们扒拉toString的源码就知道了---》按住ctrl,然后鼠标放在Arrays.toString的上面,点进去。

于是上面那个整形数组就按照Arrays类中toString方法成功打印出来了。

📝提醒一下,Arrays就是一个数组工具类呀!

🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟

🌰再来看看这段代码:

public class test2 {
    public static void main(String[] args) {
        String name = "小鱼儿";
        System.out.println(name);
    }
}

📝因为String本身就是一个类,String类重写了父类Object的toString方法🤔,所以在println调用Object的toString时,调用的其实是String类重写的toString方法。

而 String类重写的toString()方法返回它本身,自然就直接打印出来了

🏀既然可以直接打一个对象的引用,那么如果我们想打印一个数组,数组里每个元素都是一个对象的引用呢?

class Student1 {
    private String name;
    private int score;
    public Student1(String name, int score) {
        this.name = name;
        this.score = score;
    }
}
public class test2 {
    public String author = "what!!!";
    public static void main(String[] args) {
        Student1[] students = new Student1[]{
                new Student1("张三", 95),
                new Student1("李四", 96),
                new Student1("王五", 97),
                new Student1("赵六", 92),
        };
        // 如果我们要打印的这个数组的每一个元素都是对象的引用呢?
        // 因为是数组,所以要用的我们的数组工具类Aarrys对每一个数组元素进行操作
        System.out.println(Arrays.toString(students));
    }
}

为啥呢?再看看Arrays类的toString方法是怎样处理每个对象引用就知道了

😎让我们鼠标放在Arrays的toString方法上,按住ctrl然后鼠标点进去

🥰下面就是是String类的valueOf方法

📝看来Arrays类toStirng方法对数组的每个元素都调用了父类Object的toString方法了呀!但问题此时我们没有重写父类的Object的toString方法呀!

你可能会说,Arrays类不是重写了吗?兄弟!!!Arrays类的toString是人家自己的方法,和父类Object的toString方法没有一点关系,人家只碰巧名字相同罢了。并且Arrays的toString方法是有参的,而Object的是没参数的,怎么可能构成重写呢?

🤔既然这样那么就让我们在自己定义的学生类中重写一下toString方法后,再调用Arrays.toString吧!

class Student1 {
    private String name;
    private int score;
    public Student1(String name, int score) {
        this.name = name;
        this.score = score;
    }
    // 在我们自定义的子类里重写toString方法,然后再用Arrays类中的重写的toString方法
 
    @Override
    public String toString() {
        return "Student1{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}
public class test2 {
    public String author = "what!!!";
    public static void main(String[] args) {
        Student1[] students = new Student1[]{
                new Student1("张三", 95),
                new Student1("李四", 96),
                new Student1("王五", 97),
                new Student1("赵六", 92),
        };
        // 如果我们要打印的这个数组的每一个元素都是对象的引用呢?
        System.out.println(Arrays.toString(students));
    }
}

看来还是得自己再重写一下toString方法😂

📝总结一下就是:

一个对象数组在调用Arrays.toString打印时,相当于遍历数组,然后打印里边每个对象,这再打印对象就调用对象自己的toString了

到此这篇关于Java中的println输入和toString方法的重写的文章就介绍到这了,更多相关java println输入和toString方法重写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot如何使用AOP做访问请求日志

    springboot如何使用AOP做访问请求日志

    这篇文章主要介绍了springboot如何使用AOP做访问请求日志,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Springboot jpa @Column命名大小写问题及解决

    Springboot jpa @Column命名大小写问题及解决

    这篇文章主要介绍了Springboot jpa @Column命名大小写问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java使用正则表达为数字添加千位符的简单方法

    java使用正则表达为数字添加千位符的简单方法

    这篇文章主要介绍了java使用正则表达为数字添加千位符的简单方法,需要的朋友可以参考下
    2014-04-04
  • shiro编码和加密代码详解

    shiro编码和加密代码详解

    Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作。下面通过实例代码给大家详解shiro编码和加密知识,感兴趣的朋友一起看看吧
    2017-09-09
  • Java调用CXF WebService接口的两种方式实例

    Java调用CXF WebService接口的两种方式实例

    今天小编就为大家分享一篇关于Java调用CXF WebService接口的两种方式实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 如何解决报错:java.net.BindException:无法指定被请求的地址问题

    如何解决报错:java.net.BindException:无法指定被请求的地址问题

    在Linux虚拟机上安装并启动Tomcat时遇到启动失败的问题,通过检查端口及配置文件未发现异常,后发现/etc/hosts文件中缺少localhost的映射,添加后重启Tomcat成功,Tomcat启动时会检查localhost的IP映射,缺失或错误都可能导致启动失败
    2024-10-10
  • Spring Boot系列教程之死信队列详解

    Spring Boot系列教程之死信队列详解

    这篇文章主要给大家介绍了关于Spring Boot系列教程之死信队列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 使用nacos命名空间namespace用法,测试时做实例隔离

    使用nacos命名空间namespace用法,测试时做实例隔离

    Nacos命名空间用于管理多套不同环境的服务器,增加一个命名空间的概念,可以用一套Nacos注册中心管理多套不同的环境
    2024-12-12
  • Mybatis优化检索的方法详解

    Mybatis优化检索的方法详解

    MyBatis是一款优秀的基于Java的持久层框架,它可以将 SQL 语句和数据库中的记录映射成为 Java 对象,并且支持灵活的 SQL 查询语句,在Mybatis中,可以使用动态SQL来灵活构造SQL语句,从而满足各种不同的检索需求,本文介绍Mybatis如何优化检索,需要的朋友可以参考下
    2024-05-05
  • Java JDBC基本使用方法详解

    Java JDBC基本使用方法详解

    这篇文章主要介绍了Java JDBC基本使用方法,结合实例形式详细分析了java JDBC基本原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04

最新评论