美文网首页
从一个应该是很简单的问题说起

从一个应该是很简单的问题说起

作者: herenoone | 来源:发表于2016-03-20 13:44 被阅读0次

首先看个简单的例子。

package myexample;

public class Dog {

    public static void main(String[] args) {
        Dog d = new Dog();
        System.out.println(d);
    }
}

输出的结果是:一个包名+类名@一串莫名的数字和字母

myexample.Dog@6fd7bd04

为什么打印一个对象会出现这个结果,一开始也没去深究。
这个一直被我忽略的问题让我意识到了阅读源码的重要性,很多以前不是那么清楚的,阅读完源码之后渐渐有了一些清晰的认识。

package myexample;

public class Dog {
    
    private String s;
    
    public Dog(String s){
        this.s = s;
    }
    //重写了toString()方法
    public String toString(){
        return getClass().getName() + "------名字叫" + s;
    }

    public static void main(String[] args) {
        Dog d = new Dog("小黄");
        System.out.println(d);
    }
}

输出的结果变成了:

myexample.Dog------名字叫小黄

我才明白System.out.println(d);这个语句中使用了d.toString();的方法,让对象变成了一个字符串。
当我们重写了toString()的方法之后,打印的结果自然就不同了。

为了弄明白其中的缘由,我就试着去找找它们的源代码

首先找一下System的源码:

package java.lang;

* @see     java.io.PrintStream#println(java.lang.Object)
//返回的是PrintStream
    public final static PrintStream out = null;

之后看一下println(java.lang.Object)

    public void println(Object x) {
//原来是使用了该方法
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

再找一下String.valueOf(x):

    public static String valueOf(Object obj) {
//确实是使用了obj.toString()的这个方法
        return (obj == null) ? "null" : obj.toString();
    }

那么obj.toString()到底是怎么一回事

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

myexample.Dog@6fd7bd04

跟我们原先的结果一致
如果我们重写了toString()方法,那么System.out.println(d),自然会去使用我们重写了的方法

public String toString(){ return getClass().getName() + "------名字叫" + s; }

继续往下深究,在Integer.java中

package java.lang;
    public static String toHexString(int i) {
        return toUnsignedString(i, 4);//注意传入的参数
    }


    /**
     * Convert the integer to an unsigned number.
     */
    private static String toUnsignedString(int i, int shift) {
        char[] buf = new char[32];//创建字符数组
        int charPos = 32;
        int radix = 1 << shift;//对toHexString(int i)而言,左移4位
        int mask = radix - 1;
        do {
            buf[--charPos] = digits[i & mask];
            i >>>= shift;//无符号右移运算,忽略了符号位扩展,0补最高位
        } while (i != 0);
//把字符数组变成字符串
        return new String(buf, charPos, (32 - charPos));
    }

    /**
     * All possible chars for representing a number as a String
     */
    final static char[] digits = {
        '0' , '1' , '2' , '3' , '4' , '5' ,
        '6' , '7' , '8' , '9' , 'a' , 'b' ,
        'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
        'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
        'o' , 'p' , 'q' , 'r' , 's' , 't' ,
        'u' , 'v' , 'w' , 'x' , 'y' , 'z'
    };


针对hashCode(),在Object.java中

package java.lang;
    public native int hashCode();

之后再对hashCode进行学习。。。

相关文章

  • 从一个应该是很简单的问题说起

    首先看个简单的例子。 输出的结果是:一个包名+类名@一串莫名的数字和字母 myexample.Dog@6fd7bd...

  • 从一个梦说起

    在想今天要写什么话题的时候,突然想到今天早上(30号早上)做的梦,仍旧历历在目,美丽地超越真实。不妨写一写梦境与一...

  • 从一个广告说起

    图片是一家餐厅门前放的一副广告,主打“霸王餐”,吃多少,然后充值3倍的价格,这顿就能免单,听起来非常不错,吃得越多...

  • 从一个梦说起

    昨天晚上做了一夜的梦,梦见和一个认识的男孩谈恋爱。不是梦幻般甜美的爱情,而是特别真实的那种。我能感受到他的不迁就和...

  • 从一个姑娘说起

    落日缓缓的坠下去 昏黄的一线光芒 顺着玻璃打过来 落在你乌黑秀长的头发上 归鸟掠窗而过 扑棱棱的影子一瞬间落在你身...

  • 从一个姑娘说起

    落日缓缓的坠下去 昏黄的一线光芒 顺着玻璃打过来 落在你乌黑秀长的头发上 归鸟掠窗而过 扑棱棱的影子一瞬间落在你身...

  • 从一个椰子说起

    我记得小的时候,椰子饮料只有椰树这一个牌子叫得出来。但是从前年同学的一次喜宴开始到今年春节,我发现越来越多的椰子饮...

  • 从一个杯子说起

    2016-03-12阿朝 这个星期,丢了一个浅蓝色的水杯, 我明明把它时常带在身边的啊, 我去健身离不开啊,它就这...

  • 从一个梦说起

    昨天晚上做了一个好梦!因为做了这个梦之后,我感觉到,我的释然,我的轻松,这个梦最好的一面,就是警醒我:善待我的夫妻...

  • 从一个故事说起

    讲一个故事。 一个妈妈,在儿子初三那年开始选择做全职妈妈,为了孩子能考上市重,为了孩子将来能考上好的大学,主动辞职...

网友评论

      本文标题:从一个应该是很简单的问题说起

      本文链接:https://www.haomeiwen.com/subject/metklttx.html