Java 打印对象的内存地址

先来看java编程思想的上一个例子:

import java.util.*;

public class InfiniteRecurision {
    public String toString() {
        return " InfiniteRecurision address: " + this + "\n";
    }

    public static void main(String[] args) {
        List<InfiniteRecurision> v = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            v.add(new InfiniteRecurision());
        }
        System.out.println(v);
    }
}

这个程序是运行时会得到一长串异常, 这是因为return " InfiniteRecurision address: " + this + "\n";这一句陷入了无意识的递归, 这里发生了自动转型, 如果String对象后面加上了一个"+"号的话, 而后面的对象不是String类, 编译器就会尝试自动转型为String类, 这里用到了this, 所以变成了this.toString(), 于是乎, 进入了递归死循环.
那我们应该如何修改呢?
要想打印出对象的内存, 应该调用的是Object.toString(), 所以这里就不应该使用this, 而是应该调用super.toString()方法, 这样才是正确的做法:

import java.util.*;

public class InfiniteRecurision {
    public String toString() {
        return " InfiniteRecurision address: " + super.toString() + "\n";
    }

    public static void main(String[] args) {
        List<InfiniteRecurision> v = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            v.add(new InfiniteRecurision());
        }
        System.out.println(v);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,526评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,169评论 19 139
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,863评论 0 4
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 5,110评论 0 2
  • 人们在感慨时总说“我想变成……无忧无虑,自由自在……” 却未曾想过,你想变成的角色,它也有自己的无奈。 你想变成鸟...
    雅晨阅读 3,738评论 2 0

友情链接更多精彩内容