精华内容
下载资源
问答
  • Java打印对象

    万次阅读 2018-04-12 20:14:08
    JavaObject的输出问题今天一个同学读取List<Object>中的一个对象,直接用于输出。输出结果是Student@c17164,现在来分析一下哈。1.Object类 类Object是类层次结构的根类。每个类都使用Object作为...

    Java中Object的输出问题

    今天一个同学读取List<Object>中的一个对象,直接用于输出。输出结果是Student@c17164,现在来分析一下哈。

    1.Object类

      类Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。 

    2.Object类的toString()方法

      public String toString()
      返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。建议所有子类都重写此方法。Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。

      换句话说,该方法返回一个字符串,它的值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())

    3.System.out.print

      (1)System.out得到的是一个Static PrintStream静态类。

      (2)PrintStream中的方法public void print(Object obj)

       打印对象。按照平台的默认字符串编码将 String.valueOf(Object) 方法生成的字符串转换为字节,并完全以 write(int) 方法的方式写入这些字节。

       其实还是调用toString方法,也就是执行System.out.println(obj);与System.out.println(obj.toString());方法的结果是一样的。

    4.代码示例

    复制代码
    public class ObjectTest{ 
        public static void main(String[] args) { 
            //处理常见数据类型
            String text="22";
            System.out.println(text);    //输出:22
                
            //处理Student对象,没有重写toString()方法
            Student stu=new Student("学生");
            System.out.println(stu);    //输出:Student@c17164
            System.out.println(stu.name);    //输出:学生
            
            //处理Teacher对象,重写toString()方法
            Teacher tea=new Teacher("老师");
            System.out.println(tea);    //输出:老师
            System.out.println(tea.name);    //输出:老师
        }
    }
    
    //Student类
    class Student{
        String name;
        public Student(String name) {
            this.name = name;
        }
    }
    
    //Teacher类
    class Teacher{
        String name;
        public Teacher(String name) {
            this.name = name;
        }
        public String toString()
        {
            return name;
        }
    }
    复制代码

    5.总结

      上例中,Student类没有重写toString()方法,输出对象结果为:Student@c17164

      上例中,Teacher类重写toString()方法,输出对象结果为:老师

      Double,String,Integer等java自带的类都重写了Object超类的toString()方法,可以直接输出其中内容。

       在程序中要直接输出类对象,可以在类中重写toString()方法,定制自己的输出。

    展开全文
  • Java Object对象的详解

    千次阅读 2016-07-21 21:33:20
    面向对象的核心思想:“找合适的对象,做适合的事情”。 合适的对象: 1. 自己描述类,自己创建对象。 2. sun已经描述了好多常用的类,可以使用这些类...toString() 返回对象的描述信息 java.lang.Object@de6ced

    面向对象的核心思想:“找合适的对象,做适合的事情”。

    合适的对象:

    1. 自己描述类,自己创建对象。

    2. sun已经描述了好多常用的类,可以使用这些类创建对象。

    sun定义的那么多的类的终极父类是ObjectObject描述的是所有类的通用属性与方法。

    1.toString方法


    toString() 返回对象的描述信息   java.lang.Object@de6ced   类名@哈希码值的十六进制形式。

    直接输入一个对象的时候,会调用对象的toString方法。

    练习:自定义一个Person类,打印该对象的描述信息,要求描述信息为:姓名 — 年龄


    问题:调用ptoString方法时,打印出来的信息是类名+内存地址值。不符合要求。根据我们之前学的继承,假如父类的指定的功能不能满足要求,那么子类可以复写父类的功能函数。那么该对象再调用toString()方法时,则会调用子类复写的toString方法。


    编程习惯:开发者要对自定义的类重写toString(),对对象做详细的说明

    2.equals方法

    equals()  返回的是比较的结果  如果相等返回true,否则false,比较的是对象的内存地址值。


    问题:比较两个人是否是同一个人,根据两个人的名字判断。


    问题:如果根据名字去作为判断两个人是否是同一个时,明显pp1是同一个人,但是程序输入却不是同一个人。不符合我们现实生活的要求。

     

    解决: 根据我们学的继承中的函数复写,如果父类的函数不能满足我们目前的要求,那么就可以在子类把该功能复写,达到复合我们的要求。


    编程习惯:开发者要对自定义的类重写equals(),使得比较两个对象的时候比较对象的属性是否相等,而不是内存地址。

    3.hashCode方法

    hashCode() 返回该对象的哈希码值: 采用操作系统底层实现的哈希算法。 同一个对象的哈希码值是唯一的。

    java规定如果两个对象equals返回true,那么这两个对象的hashCode码必须一致。


    展开全文
  • Java打印对象信息(一)

    万次阅读 多人点赞 2018-08-03 00:04:31
    在日常开发中,我们总需要打印日志,记录程序中一些关键对象的信息,大大提高bug的排查速度。但是如果类的设计不规范,这些类的对象信息是不能被Log框架或者System.out.println()语句规范地打印出来的。比如下面这个...

           在日常开发中,我们总需要打印日志,记录程序中一些关键对象的信息,大大提高bug的排查速度。但是如果类的设计不规范,这些类的对象信息是不能被Log框架或者System.out.println()语句规范地打印出来的。比如下面这个Person类,这种只有成员变量以及成员变量的get/set函数的类,常被用作VO、DTO、DO等,如果直接按照以下方式,其对象信息打印出来对日志分析基本没有用处。(本文代码运行环境采用JDK版本为JDK9)

    《一》采用System.out.println()方式打印对象信息:

    public class Person {
        private int age;
    
        private String name;
    
        public Person(){
        }
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public static void main(String []args){
            Person p = new Person(22,"Allen");
            Person p1 = new Person(18,"Peter");
            System.out.println(p);
            System.out.println(p1);
        }
    }
    

    我们看一下输出结果:

    Person@64c64813
    Person@3ecf72fd

    可见根本没有打印出我们想看到的对象p的成员变量信息,这个打印结果是怎么来的呢?我们先看一下System.out.println()的内部实现(java.io.PrintStream类):

    public void println(Object x) {
            String s = String.valueOf(x);
            synchronized (this) {
                print(s);
                newLine();
            }
        }

    可以看出先是打印String.valueOf(x)的信息,然后再打印一个换行,而String.valueOf(x)的内部实现如下:

        /**
         * Returns the string representation of the {@code Object} argument.
         *
         * @param   obj   an {@code Object}.
         * @return  if the argument is {@code null}, then a string equal to
         *          {@code "null"}; otherwise, the value of
         *          {@code obj.toString()} is returned.
         * @see     java.lang.Object#toString()
         */
        public static String valueOf(Object obj) {
            return (obj == null) ? "null" : obj.toString();
        }

    如果对象为null就返回字符串null,否则返回这个对象的toString()函数的结果,我们需要注意toString()这个函数是定义在Object类中的,其在Object类中的定义如下:

     /**
         * Returns a string representation of the object. In general, the
         * {@code toString} method returns a string that
         * "textually represents" this object. The result should
         * be a concise but informative representation that is easy for a
         * person to read.
         * It is recommended that all subclasses override this method.
         * <p>
         * The {@code toString} method for class {@code Object}
         * returns a string consisting of the name of the class of which the
         * object is an instance, the at-sign character `{@code @}', and
         * the unsigned hexadecimal representation of the hash code of the
         * object. In other words, this method returns a string equal to the
         * value of:
         * <blockquote>
         * <pre>
         * getClass().getName() + '@' + Integer.toHexString(hashCode())
         * </pre></blockquote>
         *
         * @return  a string representation of the object.
         */
        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }

    从中我们不难看到每个类如果没有重写toString()函数的话,默认是返回该类的名称 + “@” + 该对象hashCode值得十六进制数字;所以JDK官方是推荐我们所有的类都应该重写此类(It is recommended that all subclasses override this method.)。如果我们在上面的Person类中重写该方法,那么System.out.println语句就会按照我们的重写的toString()方法打印对象信息,如下:

    public class Person {
        private int age;
    
        private String name;
    
        public Person() {
        }
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Person(age:" + age + ",name:" + name + ")";
        }
    
        public static void main(String[] args) {
            Person p = new Person(22, "Allen");
            Person p1 = new Person(18, "Peter");
            System.out.println(p);
            System.out.println(p1);
        }
    }
    

    输出结果:

    Person(age:22,name:Allen)
    Person(age:18,name:Peter)

    这样就可以清晰地打印出每个Person对象的成员信息了。

           如果你使用了Lombok插件,那么直接使用它的@Data注解,无需实现toString()函数的复写了,如下:

    import lombok.Data;
    
    @Data
    public class Person {
        private int age;
    
        private String name;
    
        public Person() {
        }
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public static void main(String[] args) {
            Person p = new Person(22, "Allen");
            Person p1 = new Person(18, "Peter");
            System.out.println(p);
            System.out.println(p1);
        }
    }
    

    代码运行结果:

    Person(age=22, name=Allen)
    Person(age=18, name=Peter)

    这里使用的Lombok插件版本为1.16.10,可以看出插件帮我们完成了对一个对象的描述功能。如果我们既使用了Lombok插件,又自己重写了一下toString()函数,会有什么的情况呢?我们试一下:

    import lombok.Data;
    
    @Data
    public class Person {
        private int age;
    
        private String name;
    
        public Person() {
        }
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "年龄:" + age + ";名字:" + name;
        }
    
        public static void main(String[] args) {
            Person p = new Person(22, "Allen");
            Person p1 = new Person(18, "Peter");
            System.out.println(p);
            System.out.println(p1);
        }
    }
    

    输出结果为:

    年龄:22;名字:Allen
    年龄:18;名字:Peter

    可以看到打印信息使用的是我们重写的toString()方式,具体Lombok插件是如何实现的,大家感兴趣可以看一下Lombok的实现机制。

           本次主要讲了System.out.println()这种最基础的的方式打印对象信息需要注意的地方,主要就是toString()函数,下一节我们看一下一些日志框架(例如log4j等)是如何实现对象信息的打印效果的。

    展开全文
  • System.identityHashCode(Object)方法可以返回对象的内存地址,不管该对象的类是否重写了hashCode()方法。 下面来验证: public class TestMem { public static void main(String[] args) { String s1 = "hello"; ...

    Object的hashCode()默认是返回内存地址的,但是hashCode()可以重写,所以hashCode()不能代表内存地址的不同


    System.identityHashCode(Object)方法可以返回对象的内存地址,不管该对象的类是否重写了hashCode()方法。

    下面来验证:

    public class TestMem {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = "world";
            String s3 = "helloworld";
            String s4 = s1+s2;
            System.out.println(s3==s4);
            System.out.println(s3.hashCode());
            System.out.println(s4.hashCode());
            System.out.println(System.identityHashCode(s3));
            System.out.println(System.identityHashCode(s4));
     
        }
    }
    

    结果

    false
    -1524582912
    -1524582912
    1329552164
    363771819
    

    s3和s4的hashCode一样,但是内存地址不一样。

    由此可知,要想获取对象的内存地址应使用System.identityHashCode()方法

    参考
    https://blog.csdn.net/qq_21963133/article/details/80624091
    https://blog.csdn.net/ganghaod/article/details/87896447

    展开全文
  • 可以利用JSONObject和JSONArray. ... 比如你有一个复杂的对象:Person, 里边有姓名,电话,地址,地址又是一个复杂的类。 你有一个Person的对象person,你可以先将此...personJSON = JSONObject.fromObject(person);
  • 如何优雅地打印一个Java对象

    万次阅读 多人点赞 2020-02-07 10:48:25
    虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的...
  • java 循环 输出 Object键值

    千次阅读 2019-07-19 13:26:13
    Object object = demo ; Field [ ] fields = object . getClass ( ) . getDeclaredFields ( ) ; try { for ( Field field : fields ) { field . setAccessible ( true ) ; String name ...
  • Java 打印一个对象却输出地址?

    千次阅读 多人点赞 2019-03-20 15:32:15
    有时候使用System.out.println()方法输出一个类的对象,得到的结果却是该对象的地址:类名@12aa35151 这个结果是怎么来的呢? System.out的println()方法只能在控制台输出字符串,有时候比如自己写的person类实例...
  • Java打印对象信息(二)

    千次阅读 2018-08-05 19:15:12
    上一篇我们观察了System.out.println()方式打印简单类对象信息的一些注意事项,本篇我们仍以Person类为例看一下Log4j下对这种对象的处理。 《二》采用Log4j打印对象信息:   首先引入Log4j的jar包,本篇采用的...
  • Java中的Object

    万次阅读 多人点赞 2019-05-11 14:54:16
    Object作为所有类的父类,是面向对象学习中最重要的一个类。Object类是java默认的提供的一个类,Object类是所有类的父类,也就是说任何一个类的定义的时候如果没有明确的继承一个父类的话,那么它就是Object的子类
  • JAVA对象布局之对象头(Object Header)

    千次阅读 2020-10-29 09:16:38
    由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能 。在学习并发编程知识synchronized时,我们总是难以理解其实现原理,因为偏向锁、...
  • java打印对象和toString()重写

    千次阅读 2017-07-07 21:53:05
    Objectjava语言的基类,是所有类的直接父类或间接父类 常见的方法: 1.Boolean equals(Object obj) 当前对象和obj对象进行比较 在Object中,equals()方法比较的是对象的内存地址,相当于“ == ”;...
  • java中如何知道传进来的Object对象是哪个子类的实例? object子类那么多,用instanceof好像很麻烦啊。请教解答?
  • 深入分析Java打印对象内存地址

    千次阅读 2020-02-13 09:46:09
    我们知道system.out.println(new XXX())可以打印出内存地址 我们看个例子: public class Test { public static void main(String[] args) { Test t = new Test(); System.out.println(t); 看下输出的结果: Test...
  • NULL 博文链接:https://treemanfm.iteye.com/blog/2038954
  • java 打印对象,通过json 和第三方包

    千次阅读 2018-11-24 11:58:16
    dsdf 为复杂对象。 JSONObject dfdfJson = JSONObject.fromObject(dsdf); System.out.printf(dfdfJson.toString()); 打包到 spark 环境执行时报包没有找到的问题。 代码删除了。不用了。 参考这篇文章: 可以...
  • javaObject类的方法

    千次阅读 2017-12-09 16:51:20
    Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。当然,数组也继承了Object类。然而,接口是不继承Object类的。Object类中声明了以下函数protected Object clone() //创建并返回此对象的一个...
  • 创建对象javaBean public class Student { //姓名 private String name; //年龄 private String age; //住址 private String address; public String getName() { return name; } ...
  • 最近在学习java对象内存布局方面的一些知识,主要是想知道一个java对象...在网上搜索的过程中看到了java object layout这个小工具,能够打印出类的布局信息。Java对象的内存布局:对象头(Header)、实例数据(Instanc
  • 文章目录简介对象和其隐藏的秘密Object对象头数组对象头整个对象的结构 简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址。 今天,我们会更进一步,剖析一下在之前...
  • java,gson试用,打印java对象树json格式

    千次阅读 2016-11-25 17:37:35
    java,gson试用,打印java对象树json格式
  • JS查看Object对象内容

    万次阅读 2016-06-30 14:27:04
    以一个例子来说,下面是他的Object: JS: 如果想直接获取到total的值,那就先把获取到的Json先Eval(),然后json.total就能取到total的值了, 但是如果想取到rows里面的值呢,我们先得进去rows,那就
  • 浅谈一下JAVA对象对象引用以及对象赋值

    万次阅读 多人点赞 2013-09-19 00:50:29
    浅谈一下JAVA对象对象引用以及对象赋值   今天有班级同学问起JAVA对象的引用是什么。正好趁着这次机会,自己总结一下JAVA对象对象引用以及对象赋值。自己总结了所看到的网上相关方面的不少帖子,整理汇总形成...
  • java打印对象中的属性名和值

    千次阅读 2016-12-08 16:46:36
    方法一:只能打印第一层的属性,如果属性为对象,则不能递归,后期可以完善 public static String toString(Object obj, Class clazz) { if(obj == null){ return ""; } Field[] fields = clazz....
  • java打印对象和toString方法

    万次阅读 2014-11-17 23:01:50
    class Person {  private String name;  public Person(String name)  {  this.name=name;  } } public ...classPrintObject {  public static voidmain(String[] args)  {  
  • java 获取对象的数据类型

    千次阅读 2019-07-18 09:57:36
    /** * 获取数据类型 * @param object ... public static String getType(Object object){ String typeName=object.getClass().getName(); int length= typeName.lastIndexOf("."); String ...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...
  •  系统中一般都要打印日志的,因为所有实体的toString()方法 都用的是简单的"+",因为每"+" 一个就会 new 一个 String 对象,这样如果系统内存小的话会暴内存(前提系统实体比较多)。 使用 ToStringBuilder就可以...
  • JavaObject的用法

    千次阅读 2018-12-13 11:40:09
    Object:所有类的公共 的父类 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。...打印对象的变量,默认会调用Object的toString()方法 子类重写toString方法,把Object的方法变为自己的方法,其中的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 215,499
精华内容 86,199
关键字:

java打印object对象内容

java 订阅