[转载] java重写toString()方法

参考链接: 在Java中重写toString()

前言: 在你兴高采烈的写完一个类,创建测试类时,创建对象,传入参数,调用对象,以为会得到参数值,但突然发现输出的是“ 类名@什么东东?(其实是散列码,也是16进制的哈希值哈)”,反复检查代码,但不知怎么修改。我不知道你们有没有这种情况发生,但是我经常就有,原因当然是因为不习惯重写toString方法和基础知识还不足导致的啦。还是要加油呀!所以记录一下学习的toString()方法。 

1.1 在Object类中有一个重要的方法:toString()方法。 

作用:用于返回表示对象值的字符串 

1.2 为啥要重写toString方法呢? 

Object类中的toString方法返回的是什么呢?我们打开toString源码发现: 

    public String toString() {

        return getClass().getName() + "@" + Integer.toHexString(hashCode());

    }

 

返回的字符串是:类名@散列码。 那为什么其它类的对象返回的也是这样的形式呢?因为所有的类的超类都是Object类。(可在类中按住ctrl+t查看继承关系) 

例如: 创建一个People类: 

public class People {

    private String name;

    private int age;

    public People(String name,int age) {

        this.name = name;

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

}

 

 

测试类: 

/**

 * toString方法的调用

 * @懒惰的小黑

 *

 */

public class toStringTest {

    public static void main(String[] args) {

        People p = new People("懒惰的小黑",20);

        System.out.println(p);              //p会自动调用toString方法

        System.out.println(p.toString());    //手动调用

    }

}

 

 

执行结果: com.xiaohei.text.People@279f2327 com.xiaohei.text.People@279f2327 

但是你想输出的并非是这样的结果,而是想输出对象的具体描述(name和age),所以需要在类中重写toString方法。 重写toString方法: 

    public String toString() {

        return "[name = " + getName() + ",age = "+ getAge() + "]";

    }

 

测试: 

        People p = new People("懒惰的小黑",20);

        System.out.println(p);              //p会自动调用toString方法

 

执行结果: [name = 懒惰的小黑,age = 20] 

实际上,还可以设计的更好一些。最好通过getClass().getName() + 类的描述:获取类名的字符串(地址)+类的描述。 例: 

    public String toString() {

        return getClass().getName() + "[name = " + getName() + ",age = "+ getAge() + "]";

    }

 

测试: 同上例 执行结果: com.xiaohei.text.People[name = 懒惰的小黑,age = 20] 

注意: 此处的getClass().getName()中的getName并非People类中的getName方法! 

1.3 toString方法也可供子类使用,子类只需调用super.toString()。 

例如: 创建子类: 

class Teachers extends People{

    private int salary;

    public Teachers(String name, int age,int salary) {

        super(name, age);

        this.salary = salary;

    }

    public int getSalary() {

        return salary;

    }

    public void setSalary(int salary) {

        this.salary = salary;

    }

    public String toString() {

        return super.toString() + ",salary = " + getSalary();

    }

}

 

测试: 

public class toStringTest {

    public static void main(String[] args) {

        Teachers t = new Teachers("懒惰的小黑",20,5000);

        System.out.println(t);

 

    }

}

 

 

执行结果: [name = 懒惰的小黑,age = 20],salary = 5000 

1.4 数组类型调用toString()方法 

数组继承了Object类中的toString方法,数组类型会按旧格式打印。 

例如: 

public class ArraytoStringTest {

    public static void main(String[] args) {

        int[] a = {5,6,2,1,3};

        System.out.println(a);            //自动调用toString方法

 

执行结果:[I@1f32e575 注:[I 表明是一个整形数组。 

所以我们需要调用Array.toString 方法 例如: 

import java.util.Arrays;

 

public class ArraytoStringTest {

    public static void main(String[] args) {

        int[] a = {5,6,2,1,3};

        String a1 = Arrays.toString(a);

        System.out.println(a1);

    }

}

 

 

执行结果:[5, 6, 2, 1, 3] 

说明:为什么会出现这种形式呢?按住ctrl点击toString方法,查看源码: 

    public static String toString(int[] a) {

        if (a == null)

            return "null";

        int iMax = a.length - 1;

        if (iMax == -1)

            return "[]";

 

        StringBuilder b = new StringBuilder();

        b.append('[');

        for (int i = 0; ; i++) {

            b.append(a[i]);

            if (i == iMax)

                return b.append(']').toString();

            b.append(", ");

        }

    }

 

注意:打印多维数组则需调用Arrays.deepToString()方法 

总结提醒:建议类中都要重写toString方法,方便后面程序员的调用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

haproxy+keepalived实现负载均衡及高可用

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高性能性、负载均衡,以及基于TCP和HTTP的应用程序代理。相较与 Nginx,HAProxy 更专注与反向代理,因此它可以支持更多的选项,更精细的控制,更多的健…

[转载] Java中变量与常量

参考链接: Java中的实例变量隐藏 1、变量的定义:定义变量就是要告诉编译器这个变量的数据类型,这样编译器才知道需要分配多少空间给它,以及它能存放什么样的数据。在程序运行过程中空间的值是变化的,这个内存空间就成…

Linux-实用快捷键操作

博文说明【前言】: 本文将通过个人口吻介绍Linux下一些常用的实用快捷键,在目前时间点【2017年6月14号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作…

iOS技术博客:App备案指南

📝 摘要 本文介绍了移动应用程序(App)备案的重要性和流程。备案是规范App开发和运营的必要手段,有助于保护用户权益、维护网络安全和社会秩序。为了帮助开发者更好地了解备案流程,本文提供了一份最新、最全、最详的备…

[转载] Java中静态成员变量,静态代码块,静态内部类何时被初始化?

参考链接: Java中的初始化程序块Initializer Block 关于这个问题,本文不扯理论,直接上代码,通过结果来验证结论,废话少说,测试代码如下: public class StaticTest { public static StaticMem…

mikrotik dhcp server

操作路径: /ip dhcp-server 关联操作: /ip pool属性 述 dhcp server interface (名称) – 选择 DHCP 服务的网络接口 dhcp address space (IP 地址/掩码; 默认: 192.168.0.0/24) – DHCP 服务器将出租给客户端的网络地 址段 gateway (IP 地址; 默认: 0.0.0.0) – 分配给客户端的…

[转载] Java static关键字与static{}语句块

参考链接: Java中的静态块static block 目录直通车 一、 类的加载特性与时机 1、 类加载的特性 2、 类加载的时机 二、 static的三个常用 1、 修饰成员变量 2、 修饰成员方法 3、 静态块(static{}) 一、 类的加载特性与时机 …

Perl文件读写操作

本文转自 tiger506 51CTO博客,原文链接:http://blog.51cto.com/tiger506/830771,如需转载请自行联系原作者

[转载] Java 语言中的实例初始化块 ( IIB) 详解

参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB )。不过我觉得介绍的有点简单了,于是,再写一篇文章详细介绍下吧。 Java 语言中,存在三种操作&#x…

不用正则表达式,用javascript从零写一个模板引擎(一)

前言 模板引擎的作用就是将模板渲染成html,html render(template,data),常见的js模板引擎有Pug,Nunjucks,Mustache等。网上一些制作模板引擎的文章大部分是用正则表达式做一些hack工作,看完能收获的东西很少。本文将使用编译原理那套理论来打…

[转载] Java静态绑定与动态绑定

参考链接: Java中的静态绑定与动态绑定 程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方…

关于批量插入数据之我见(100万级别的数据,mysql)

2019独角兽企业重金招聘Python工程师标准>>> 因前段时间去面试,问到如何高效向数据库插入10万条记录,之前没处理过类似问题,也没看过相关资料,结果没答上来,今天就查了些资料,总结出三种方法&am…

各个OS关于查看磁盘和wwn号的方法

1,HP-UX几个命令1)查看型号,和uname -a差不多model2)查看光纤卡信息ioscan -funC fc3) 查看扫描出的磁盘信息ioscan -fucC disk4)查看磁盘及其对应的路径ioscan -m dsf5) 查看划分过来的lunioscan -m lun6) 查看磁盘大小diskinfo …

[转载] Java是不是面向对象的程序

参考链接: 为什么Java不是纯粹的面向对象语言 转载自:https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。 在我刚开始学习 Java 的前面几…

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色:目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色(Target):定义需要实现的目标接口 目标对象角色(Adapter):调用另外一个源对象,并且转换…

[转载] Java之继承

参考链接: Java多重继承 Java之继承 继承是面向对象程序的一个基本特征,通过继承可以实现父子关系,以及代码的复用。通过继承实现的类称为子类,被继承的类称为父类,所有直接或间接被继承的类都称为父类。 Java类体…

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块; Spark的内存可以大体归为两类:execution和storage,前者包括shuffles、joins、sorts和agg…

[转载] 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

参考链接: Java继承类的对象创建 本文发表于2016年6月,写于作者学生时期。文中使用到的技术和框架可能不是当下最佳实践,甚至很不“优雅”。但对于刚接触JavaEE和Spring的同学来说,还是能有很多收获的,大牛轻拍 我们…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

[转载] Java重载、覆盖与构造函数

参考链接: Java中的继承和构造函数 /** * 拷贝构造函数---Copyf t2 new Copyf(t1);就不会在调用默认构造函数了。 * 复制clone和引用 * 重载是在同一个类(范围)中,覆盖是子类对父类而言。 重载不关心返回值类型。 静态方法不能被…