在覆盖toString()方法中使用this所发现的有趣的现象
2016-08-18 17:09
411 查看
本人以前是用C++写程序的,现在在学习Java,所以,有时候,总想喜欢在类的方法中打印出来方法的名称和类的地址来看看程序的运行流程。我们知道,C++中输出this关键字的信息,就是本次程序中对应的类在内存中的地址,但是在Java中,this的使用就有一些限制。
具体来说就是:
如果一个类,没有覆盖toString()方法,那么在用System.out.println()输出this信息的时候,它会显示对象的getClass().getName()和Integer.toHexString(hashCode())的结果的组合;
如果一个类,覆盖了toString()方法,那么在用System.out.println()输出this信息的时候,它会调用自己的toString()的方法。
在覆盖toString()方法时,里面就不能再用System.out.println()来输出this的信息了,否则程序会无休止地递归调用自己的toString(),从而会抛出java.lang.StackOverflowError这样的异常。
现在举例说明:
一个类没有覆盖toString()方法的情况:
程序的结果为:
com.baby.study.javaStudy.tij4.OverrideToString com.baby.study.javaStudy.tij4.OverrideToString@139a55
com.baby.study.javaStudy.tij4.OverrideToString com.baby.study.javaStudy.tij4.OverrideToString@1db9742
一个类覆盖了toString()方法的情况:
程序的结果为:
public String toString()
com.baby.study.javaStudy.tij4.OverrideToString OverrideToString []
public String toString()
com.baby.study.javaStudy.tij4.OverrideToString OverrideToString []
这说明:构造函数在输出信息之前,先调用了自己的toString()方法。原本输出的类的信息,改成输出了toString()方法的返回值了。
在toString()中输出this的情况:
结果:
错误信息太多,这里只截取一点:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.lang.StringBuilder.<init>(Unknown Source)
at com.baby.study.javaStudy.tij4.OverrideToString.toString(OverrideToString.java:12)
分析:代码在编译的时候是没有问题的,就是在运行的时候才会提示这种错误。
具体来说就是:
如果一个类,没有覆盖toString()方法,那么在用System.out.println()输出this信息的时候,它会显示对象的getClass().getName()和Integer.toHexString(hashCode())的结果的组合;
如果一个类,覆盖了toString()方法,那么在用System.out.println()输出this信息的时候,它会调用自己的toString()的方法。
在覆盖toString()方法时,里面就不能再用System.out.println()来输出this的信息了,否则程序会无休止地递归调用自己的toString(),从而会抛出java.lang.StackOverflowError这样的异常。
现在举例说明:
一个类没有覆盖toString()方法的情况:
package com.baby.study.javaStudy.tij4; public class OverrideToString { public OverrideToString() { super(); System.out.println(getClass().getName() + "\t" + this); } public static void main(String[] args) { OverrideToString overrideToString1 = new OverrideToString(); OverrideToString overrideToString2 = new OverrideToString(); } }
程序的结果为:
com.baby.study.javaStudy.tij4.OverrideToString com.baby.study.javaStudy.tij4.OverrideToString@139a55
com.baby.study.javaStudy.tij4.OverrideToString com.baby.study.javaStudy.tij4.OverrideToString@1db9742
一个类覆盖了toString()方法的情况:
package com.baby.study.javaStudy.tij4; public class OverrideToString { public OverrideToString() { super(); System.out.println(getClass().getName() + "\t" + this); } @Override public String toString() { System.out.println("public String toString()"); return "OverrideToString []"; } public static void main(String[] args) { OverrideToString overrideToString1 = new OverrideToString(); OverrideToString overrideToString2 = new OverrideToString(); } }
程序的结果为:
public String toString()
com.baby.study.javaStudy.tij4.OverrideToString OverrideToString []
public String toString()
com.baby.study.javaStudy.tij4.OverrideToString OverrideToString []
这说明:构造函数在输出信息之前,先调用了自己的toString()方法。原本输出的类的信息,改成输出了toString()方法的返回值了。
在toString()中输出this的情况:
package com.baby.study.javaStudy.tij4; public class OverrideToString { public OverrideToString() { super(); System.out.println(getClass().getName() + "\t" + this); } @Override public String toString() { System.out.println("public String toString()" + this); return "OverrideToString []"; } public static void main(String[] args) { OverrideToString overrideToString1 = new OverrideToString(); OverrideToString overrideToString2 = new OverrideToString(); } }
结果:
错误信息太多,这里只截取一点:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.lang.StringBuilder.<init>(Unknown Source)
at com.baby.study.javaStudy.tij4.OverrideToString.toString(OverrideToString.java:12)
分析:代码在编译的时候是没有问题的,就是在运行的时候才会提示这种错误。
相关文章推荐
- Java(方法重写与变量覆盖)(super,this的使用)
- 在使用Struct时发现了一个有趣的现象;)[提醒Struct使用]
- super和this使用举例,以及方法覆盖和重载举例
- 使用Java反射机制覆盖toString()方法
- 使用fckeditor 出现文字多不能提交的现象的解决方法。
- 装的oracle数据库中文版,在使用时发现了中英文混合的解决方法
- 发现四种在网页中使用CSS样式表的方法
- 发现四种在网页中使用CSS样式表的方法
- 是否在任何方法中都能使用super和this?
- 使用匿名方法产生的一个难发现问题
- 如何防止覆盖(override)toString方法时产生递归调用
- 窗体内公用的数据表,在使用视图和行过滤时的有趣现象
- 始终都要覆盖toString()方法
- 发现魔方阵的一个有趣现象
- 始终都要覆盖toString()方法
- jaxp使用初级入门(只需要两个步骤,覆盖五个方法)
- py2exe打包后发现 no model named sip问题(使用pyqt时)的解决方法
- 使用IE控件的一些有趣方法
- 使用输出重载时发现的一个奇怪现象!!!
- 如何防止覆盖(override)toString方法时产生递归调用