详解Java中的println输入和toString方法的重写问题
作者:是小鱼儿哈 发布时间:2022-12-24 05:26:33
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 + 鼠标左键点过去就行了,就能看到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了
来源:https://blog.csdn.net/weixin_61061381/article/details/124250415
猜你喜欢
- 最近准备整理一套关于UI效果的文章,算是对这段时间的一个总结,主要讲Android开发中的UI效果设计模块。初步分为一下几个篇幅:Andro
- Activity是Android系统的4个应用程序组件之一。通过传统方法显示的Activity都是充满整个屏幕,也就是全屏的Activity
- 在C/C++跨平台开发中,我们知道在Windows上可以通过VS,进行单步断点调试,这非常方便。但是我们如果编译好的动态库so,想要跟踪下其
- 最近上线的项目中数据库数据已经临近饱和,最大的一张表数据已经接近3000W,百万数据的表也有几张,项目要求读数据(select)时间不能超过
- 现在Web开发越来越倾向于前后端分离,前端使用AngularJS,React,Vue等,部署在NodeJS上,后面采用SpringBoot发
- 1.创建一个线程Java操作线程最核心的类就是Thread类创建线程有很多方法,下面我们写一个Mythread类继承 Thread 类重写r
- 简单介绍 多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等
- 1、jdbc1) 含义:JDBC是java语言连接数据库,Java Date Base Connectivity2) jdbc的本质:在编程
- 我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String,
- 最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如 1.采用色度变换 2.
- 这三种锁是指锁的状态,并且是专门针对Synchronized关键字。JDK 1.6 为了减少"重量级锁"的性能消耗,引入
- 简介使用配置类和注解代替web.xml和SpringMVC配置文件的功能在Servlet3.0环境中,容器会在类路径中查找实现javax.s
- Java 中java.io.IOException: Broken pipe认识broken pipepipe是管道的意思,管道里面是数据流
- springboot集成mybatis plus和dynamic-datasource注意事项环境spring-boot-starter-p
- @Conditional的使用@Conditional可以根据条件来判断是否注入某些Bean。package com.morris.spri
- 前言本篇文章主要介绍的是SpringBoot项目进行全局异常的处理。SpringBoot全局异常准备说明:如果想直接获取工程那么可以直接跳到
- 本文将向大家展示如何拍照截图。先看看效果图:拍照截图有点儿特殊,要知道,现在的Android智能手机的摄像头都是几百万的像素,拍出来的图片都
- 添加注解效果事务演示注解我们经常会用到,或者在jdk源码中也会看到,例如: @Deprecated以及我们在spring或者spr
- 有项目需求需要绘制多个圆圈,并且使用连续的数字对其排列起来,也就是好多排的圆圈。首先看一下效果图:一排设置为8个,一共有53个的:一排设值为
- 目录前言基础组件工作流程初步使用详细流程获取 MapperProxy 对象缓存执行方法构造参数获取需要执行的 SQL 对象执行 SQL 语句