println输入和toString方法的重写

println输入和toString方法的重写对于 Java 中最常用的输出方法 System out println 你真的了解他的内部原理吗 对于各种数组类型的打印你真的了解吗 这篇文章就让我们看看在 println 打印上有那些不为人知的秘密

println输入和toString方法的重写

大家好,我是小鱼儿 

目录

println()直接打印

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输入和toString方法的重写

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

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

println输入和toString方法的重写

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

println输入和toString方法的重写

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

println输入和toString方法的重写

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

println输入和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); } }

println输入和toString方法的重写

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

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

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

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

println输入和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); } }

 println输入和toString方法的重写

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


 其他的一些情况

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

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

println输入和toString方法的重写

?如果是一个数组,我们想重写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)); } }

println输入和toString方法的重写

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

println输入和toString方法的重写

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

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

??????????????? 

?再来看看这段代码:

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

println输入和toString方法的重写

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

println输入和toString方法的重写

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

println输入和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)); } }

println输入和toString方法的重写

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

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

println输入和toString方法的重写

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

 println输入和toString方法的重写

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

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

println输入和toString方法的重写

?既然这样 那么就让我们在自己定义的学生类中重写一下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)); } }

 println输入和toString方法的重写

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

?总结一下就是:

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

好了,今天的博客就到这里了,咱们下篇博客见? 

println输入和toString方法的重写

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203858.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:26
下一篇 2026年3月19日 下午9:26


相关推荐

  • idea激活码2021.7【2021.7最新】

    (idea激活码2021.7)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSWQi…

    2022年3月21日
    47
  • C/C++获取当前系统时间的方法

    C/C++获取当前系统时间的方法1、使用系统函数,并且可以修改系统时间#include<stdlib.h>usingnamespacestd;voidmain(){system("time");}备注:获取的为 小时:分钟:秒 信息2、获取系统时间(秒级),可以换算为年月日星期时分秒#include<iostream>#include<time.h>us…

    2022年10月19日
    7
  • css如何修改滚动条样式

    css如何修改滚动条样式默认滚动条样式如下 那如何修改呢 如下代码 lt divclass inner gt nbsp nbsp nbsp nbsp nbsp nbsp lt divclass innerbox gt nbsp nbsp nbsp nbsp lt pstyle height 200px gt 这是内容 111 lt p gt nbsp nbsp nbsp nbsp lt pstyle height 400px amp am

    2026年3月26日
    2
  • 郁闷中…………

    郁闷中…………

    2021年8月5日
    50
  • cvpr目标检测_目标检测指标

    cvpr目标检测_目标检测指标论文年份:2016,论文被引:12032(2022/05/03)

    2025年6月20日
    5
  • 小爱同学app官方网站(小爱同学唤醒app)

    小爱同学app是一款以连接小爱同学享受人工智能乐趣生活为核心卖点的软件,超多种类的手机都能够使用,无论是苹果亦或是华为小米等,都能够完美的配适,并且还能使用手机唤醒小爱同学,帮它联网,教他各种不同的知识,之后还能和你愉快的聊天!小爱同学app特色听听音乐,看看各种笑话,休闲无比放松逗小爱,即时你是孤身一人也不再会孤单!远程操控你的各种智能设备,远距离控制不再是问题,解决所有的难题!自带语音识别的功…

    2022年4月10日
    269

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号