println输入和toString方法的重写

简介: println输入和toString方法的重写

println()直接打印

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

916a11449a3e1757f28a248eb07ff780.jpg

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

让我们来测试一下

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

e24e219a23864524926cee46835bbb5d.png

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

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

79229ea124cb4c58a1d076cb407e44ce.png

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

33ed2e66810c4aeaad0fd629b9333816.png

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

7856d93f3af5448e93941d438cf37559.png

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

d238bc007de64974bacbf8ddb9212bd4.png

好像,我们用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);
    }
}


8fc843632b644911b3b1fd826f079e21.png

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


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


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

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


03cf35bcbd5a47a591ac5df410589514.png

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

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);
    }
}


a781e222953144c79272913877bcd571.png

其他的一些情况

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

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

12e8bab03beb49b6980f6aa9d376a89b.png

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

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

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


c0ae25418a0141aeba36606f7ce9dffd.png


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

7584ab322b9a459e977c8fffff34bffe.png

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


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


🌰再来看看这段代码:

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


e665b8ba89d84e7184245b2cab5b2c89.png


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


0942e924e959433cb2f39c78aa130264.png

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

74670397373c45cab9c7c745265cfe1f.gif

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

1.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));
    }
}


2266de000d134ff8b35b0323f5cc671a.png


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

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

25b70729e2d144ada20a7097f56b14b8.png

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

294356aa9a7e4f96b215fc14014c9010.png

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


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

bd8ed8eaf57c40da8d63df6d4e2f5169.gif

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

1.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));
    }
}


43117bccfaf446aa94d7aaea6f7850de.png

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

📝总结一下就是:

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

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

94214a4570374db487e3db5ac4f0e388.jpg

相关文章
|
存储 Java 程序员
equals方法深入解析
equals方法深入解析
235 0
|
Java
toString()方法
toString()方法
68 0
【static + 代码块+toString打印对象】
【static + 代码块+toString打印对象】
69 0
print与println的区别
print与println的区别
85 0
|
Java
Java面向对象中 Object类的详解和其中的equals()和toString()方法的详解
Java面向对象中 Object类的详解和其中的equals()和toString()方法的详解
73 0
|
Apache
toString 更优雅的实现方式
toString 更优雅的实现方式
107 0
|
存储
"=="和 equals 方法究竟有什么区别?
"=="和 equals 方法究竟有什么区别?
127 0
|
Java
Java中Math类、System类、toString方法、equals方法及冒泡排序实现
Math类、System类、toString方法、equals方法及冒泡排序实现的简单示例
217 0
Java中Math类、System类、toString方法、equals方法及冒泡排序实现