详解Java中的println输入和toString方法的重写问题
目录
- println()直接打印
- toString的使用
- 其他的一些情况
println()直接打印
我们都知道println()如果打印的是基本数据类型的话直接打印出来的就是值,你如果是引用数据类型呢?
除掉这四类八种基本类型,其它的都是对象,也就是引用类型,包括数组。
让我们来测试一下
public class test1 { public static void main(String[] args) { int[] ret = {1, 2, 3, 4}; System.out.println(ret); // 括号里是一个引用数据类型 } }
这是个什么东东,是地址吗?
让我们扒开println的源码看看,在IDEA中只需鼠标放到println的位置,然后ctrl + 鼠标左键点过去就行了,就能看到prihttp://www.cppcns.comntln的源码了
然后我们来到了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(Strinwww.cppcns.comg[] 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方法重写内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
推荐阅读
-
每个Java程序员必备的8个开发工具
本文由码农网 –王国峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!现在有很多库、实用工具和程序任J...
-
Java实战之医院管理系统的实现
目录项目介绍环境需要技术栈使用说明效果图展示核心代码用户管理控制层医生管理控制层病房管理控制层项目介绍医院管理系统,分为管理员、医...
-
elasticsearch索引index之Translog数据功能分析
目录translog的结构及写入方式translogFile的继承关系TranslogFile快照的方法总结translog的结构...
-
java实现简单发送邮件功能
-
Java实现图片比率缩放
-
Java中的JetCache 实战
-
elasticsearch索引index之engine读写控制结构实现
目录engine的实现结构Engine类的方法:如index方法的实现:总结engine的实现结构elasticsearch对于...
-
elasticsearch索引index之Mapping实现关系结构示例
目录Mapping的实现关系结构Mapper的三类parse方法部分Field总结Mapping的实现关系结构Lucene索引的...
-
LeetCode 动态规划之矩阵区域和详情
目录题目题解解题分析解题代码题目矩阵区域和给你一个mxn的矩阵mat和一个整数k,请你返回一个矩阵answer,其中每个a...
-
elasticsearch索引的创建过程index create逻辑分析
目录索引的创建过程materOperation方法实现clusterservice处理建立索引修改配置总结索引的创建过程从本篇...