关于java String变量和toString(),以及常量池的疑问,有代码,请看一下
代码如下我就是想输出看看s的地址是什么?另外就是System.out.println(a)为何输出的就是a所指向的常量池中的对应的字符串对象的值呢?虽然会默认调用toSt...
代码如下
我就是想输出看看s的地址是什么?
另外就是System.out.println(a)为何输出的就是a所指向的常量池中的对应的字符串对象的值呢?
虽然会默认调用toString方法,但是不应该是将a这字符串引用型变量里面存储对象地址转换成String类型输出吗?
为什么是可以输出a里面存储的地址指向的字符串对象的值呢?
感觉问题出现在了两个方面
1,toString()上面
这是是继承父类的toString(),因此最终只能是找到Object类的toString方法
感觉不是object类的问题,又去看了String方法的toString()
然后下面的是String方法的toString方法
===
String类的toString()方法返回的是是对象本身。说到对象本身,我就有点晕了,什么叫对象本身,
s.toString()----->到底返回的是s的对象地址还是s指向的对象本身?
2,System.out.println(s);上面,下面的是println()的实现代码,那么这里面的Object x 是指的是“aaa”对象的地址s还是aaa对象本身呢?
--我尝试着输出了 System.out.println(String.valueOf(s));结果是 aaa。我现在有点的晕的是String s;中的s到底是啥?是一个String 类型的用来存储一串地址的变量?还是下面说的object参数的。。。。。我表示object参数是什么意思?
还有就是java中所有的变量都是Object 类型的吗???
----------------------------------------------
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
我实在是有点晕了,希望各位见谅说一些自己的体会,或者能把我指点一下,绕出这个怪圈最好了
要是您能从内存图,方法区,堆栈的角度给出一定的解读那就更好了 展开
我就是想输出看看s的地址是什么?
另外就是System.out.println(a)为何输出的就是a所指向的常量池中的对应的字符串对象的值呢?
虽然会默认调用toString方法,但是不应该是将a这字符串引用型变量里面存储对象地址转换成String类型输出吗?
为什么是可以输出a里面存储的地址指向的字符串对象的值呢?
感觉问题出现在了两个方面
1,toString()上面
这是是继承父类的toString(),因此最终只能是找到Object类的toString方法
感觉不是object类的问题,又去看了String方法的toString()
然后下面的是String方法的toString方法
===
String类的toString()方法返回的是是对象本身。说到对象本身,我就有点晕了,什么叫对象本身,
s.toString()----->到底返回的是s的对象地址还是s指向的对象本身?
2,System.out.println(s);上面,下面的是println()的实现代码,那么这里面的Object x 是指的是“aaa”对象的地址s还是aaa对象本身呢?
--我尝试着输出了 System.out.println(String.valueOf(s));结果是 aaa。我现在有点的晕的是String s;中的s到底是啥?是一个String 类型的用来存储一串地址的变量?还是下面说的object参数的。。。。。我表示object参数是什么意思?
还有就是java中所有的变量都是Object 类型的吗???
----------------------------------------------
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
我实在是有点晕了,希望各位见谅说一些自己的体会,或者能把我指点一下,绕出这个怪圈最好了
要是您能从内存图,方法区,堆栈的角度给出一定的解读那就更好了 展开
展开全部
你可以看一下源代码啊
关于toString()方法:
//这个是Object类的toString方法,输出的是类名和对象的hashCode
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//这个是String的toString方法,输出的是这个字符串本省
public String toString() {
return this;
}
也就是说,如果是个普通的类(比如我们自定义的类)如果没有重写toString方法,则调用父类(如果没有继承其它类的话,这个父类即Object类)的toString方法,输出的就是类名和hashCode。
而String类重写了toString方法,所以调用toString方法时就是返回字符串本身。
如果我们自定义的类也重写了toString方法,我们也可以自定义输出格式。
关于System.out.println(s),还是看源代码:
public void print(Object obj) {
write(String.valueOf(obj));
}
再看String.valueOf(Object obj)这个方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
看得出来,如果obj为null,则String.valueOf(Object obj)返回字符串“null”,而其它类则调用这个类的toString方法。至于其它int、long、char之类的基本类型,不同的类型有不同的定义。
System.out.println(s)就是把得到的字符串返回值输出到控制台中。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |