无意识的递归

  1. Java中的每个类从根本上都继承自Object,标准容器类自然也不例外。因此容器都有toString()方法,并且覆盖了该方法,使得它生成的String结果能够表达容器自身,以及容器所包含的对象。例如ArrayList.toString(),它会遍历ArrayList中包含的所有对象,调用每个元素上的toString()方法;
  2. 如果你希望toString()方法打印出对象的内存地址,也许你会考虑使用this关键字:
     //: strings/InfiniteRecursion.java
     // Accidental recursion.
     // {RunByHand}
     package July_20;
    
     import java.util.ArrayList;
     import java.util.List;
    
     public class InfiniteRecursion {
         public String toString() {
             return " InfiniteRecursion address: " + this + "\n";
         }
    
         public static void main(String[] args) {
             List<InfiniteRecursion> v = new ArrayList<InfiniteRecursion>();
             for(int i = 0; i < 10; i++)
                 v.add(new InfiniteRecursion());
             System.out.println(v);
         }
     }
     ///~
  3. 当你创建了InfiniteRecursion对象,并将其打印出来的时候,你会得到一串非常长的异常。如果你将该InfiniteRecursion对象存入一个ArrayList中,然后打印该ArrayList,你也会得到同样的异常。其实,档如下代码运行时:
    " InfiniteRecursion address: " + this
  4. 这里发生了自动类型转换,由InfiniteRecursion类型转换成String类型。因为编译器看到了一个String对象后面跟着一个“+”,而在后面的对象不是String,于是编译器试着将this转换成一个String。它怎么转换呢,正式通过调用this上的toString()方法,于是就发生了递归调用。
  5. 如果你真的想要打印出对象的内存地址,应该调用Object.toString()方法,这才是负责此任务的方法。所以,你不该使用this,而是应该调用super.toString()方法。

原文地址:https://www.cnblogs.com/cgy-home/p/11216572.html

时间: 2024-08-30 10:08:26

无意识的递归的相关文章

java:无意识自动装箱的可怕之处

前言:<effective Java>一书确实经典,真是为没有早一点买到这本书而感到遗憾.再来学习一个小知识,在之前,我只是知道integer是int的装箱类,而int是基本类型而已,从来没有意识到自动装箱有这么大的区别,"要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱." 根据书中所写,我测试了以下的简单例子. package com.mwq.number; public class Test { public static void main(String

意识与无意识

1.有意识的精神,与无意识的精神,如同地上河与地下暗河交替出现,两者流向一致时,河水奔涌向前,两者流向相对时,漩涡而水不前. 2.无意识的精神有几种本能:盈亏本能:防骗本能:自守本能: 3.有意识有限,无意识无限,作用域无止无境,正如睡着时心脏仍在不停的跳动.有意识逆无意识而行,必败.有意识的提升有赖于无意识提供的材料,正如地下水位低,河水就会干涸一样.有意识要驱动无意识,动员出无意识的能量,行为计划不能过于周密,无意识本身有防骗本能,如果觉察则会迅速抽干意识力量,令其陷入干涸,崩溃的境地.有意

loj6295. 无意识之外的捉迷藏

题意 略. 题解 神仙纳什均衡. 首先,这张图是个有向无环图,大大简化了问题. 为了方便,我们将追捕者叫做A,被追捕者叫做B. 考虑在上面dp,设\(f_{x, y, t}\)为当前在\(t\)时刻末,且A在点\(x\),B在点\(y\)时的期望得分.(注意,A要最小化这个期望得分,B要最大化这个期望得分) 假设我们已经知道了\(t + 1\)时刻各种情况的答案,则考虑A和B如何做出最优决策. 做出最优决策,可以从A的角度单方面考虑,理解为A在以概率数组\(\{p_i\}\)对所有转移状态作决策

Thinking in Java Chapter 13

From Thinking in Java 4th Edition String对象是不可变的.String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容.而最初的String对象则丝毫未动: import static net.mindview.util.Print.*; public class Immutable { public static String upcase(String s) { return s.toUpp

&lt;Thinking in JAVA&gt;笔记 字符串

1.字符串String对象是不可变的,每一个看起来会修改String的方法,实际上都是创建了一个新的String对象 2.重载+和StringBuilder: 用重载+,实际上编译器自动引入了StringBuilder,并为每一次重载+做了一次append(),最后调用toString生成结果 区别:虽然底层都是StringBuilder,但使用重载+时,每+一次,就会生成一个新的StringBuilder,而用StringBuilder的append()方法时,只会生成一个StringBuil

Thinking in Java--第十三章-字符串

写在前面: 要做的事太多了,写的blog不是很细.会写自己觉得好玩的.重要的地方.希望大家来尽情的讨论,分享自己的见解.让"思维的火花的碰撞"得以实现. 几乎每一种操作都会涉及到字符串,所以字符串特别重要. 13.1 不可变String String类中看起来会修改String值得方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容,而最初的String对象丝毫未动. 13.2 + 与 StringBuilder StringBuilder要快很多,有兴趣的话可以

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

JDK源码分析之String篇

------------------------------String在内存中的存储情况(一下内容摘自参考资料1)----------------------------------- 前提:先了解下什么是声明,什么时候才算是产生了对象实例 其中x并未看到内存分配,变量在使用前必须先声明,再赋值,然后才可以使用.java基础数据类型会用对应的默认值进行初始化 一.首先看看Java虚拟机JVM的内存块及其变量.对象内存空间是怎么存储分配的 1.栈:存放基本数据类型及对象变量的引用,对象本身不存放

6.Java中的字符串

1.String的特性 特性一:不可变性 String s=new String("yangyun") s=s.toUpperCase(); 这里的s,s占用的空间是不一样的(地址不相同),前提是toUpperCase函数确实改变了原始s的内容. 为什么String是不可变对象?-----cankai 1.效率问题 如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高. 2.安全性 不可