zoukankan      html  css  js  c++  java
  • Java源代码阅读-Object.toString()

    关于Object中的toString()


    先来看一个简单的基类 Parent,它有一个toString()方法

    public class Parent{
    	
    	public String toString(){
    		return "Parent";
    	}
    }
    

    然后you一个派生类Child继承Parent,它重载了基类ParenttoString().

    public class Child{
    
    	public String toString(){
    		reuturn "Child";
    	}
    	
    	public void get(){
    		System.out.println(this);
    		System.out.println(new Child());
    	}
    
    	public static void main(String[] args){
    		new Child().get();
    	}
    }
    

    然后执行Child的main方法得到结果如下:

    Child
    Child

    Child通过 new 调用 get()方法分别打印 thisnew Child().它们都是调用了ChildtoString()方法,所以输出结果相同.

    如果注释掉Child派生类的toString()方法,再执行main方法之后,输入结果如下:

    Parent
    Parent

    此时Child通过 new 调用 get()方法分别打印 thisnew Child().它们都是调用了ParenttoString()方法.

    再做进一步的测试,注释掉Parent基类的toString()方法.查看输出结果如下:

    com.B@15db9742
    com.B@6d06d69c

    这些又是从哪里来的呢?我们知道Java所有类都有一个总基类就是Object,查看源代码之后我们在Object中找到如下toString()方法.

    //注释省略
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    

    从源代码中我们可以得到打印结果的组成方式.由类型的完整相对路径加@符号再加上一段通过Integer.toHexString()处理哈希玛hashCode()得到的一组字符串组成.实际打印语句可以看成是:
    System.out.println(new B().getClass().getName() + "@" + Integer.toHexString(new B().hashCode()));.

    从以上简单的测试中可以看到,如果想直接打印一个类型的实例时,实际上这个实例调用的ObjecttoString()方法.

    此时,我又在想为什么打印一个类型的实例时,会调用toString()方法呢?

  • 相关阅读:
    有序数组(类模板)
    BUUCTF-Web Comment
    BUUCTF-web NiZhuanSiWei
    2020数字中国创新大赛虎符网络安全赛道-pwn count
    BUUCTF-Web Easy Calc
    xctf-web fakebook
    xctf-web supersqli
    xctf-pwn pwn200
    xctf-pwn level3
    利用updatexml()报错注入mysql
  • 原文地址:https://www.cnblogs.com/baininghan/p/3876290.html
Copyright © 2011-2022 走看看