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()方法,定制自己的输出。

时间: 2024-09-16 12:17:20

Java中Object的输出问题的相关文章

对象-Java中关于String输出

问题描述 Java中关于String输出 我有点搞不懂什么时候输出了对象地址,什么时候才输出了对象的值 解决方案 关键看你输出对象的类中对toString方法有没有进行重载,重载成什么样,默认没有重载就是输出object的toString方法,就是hashcode.也就是自己对类的toString进行重写,输出你想要的格式. 解决方案二: 一楼正解.toString本质上是多态,调用实际对象的该方法.默认Object类中的toString是数出对象地址的. 解决方案三: 地址好像是没法输出的,不

java object用法-Java中object类的用法

问题描述 Java中object类的用法 class Student { String name; int age; public boolean equals (Object obj) { Student st = null; if(obj instanceof Student) st =(Student)obj; else return false; if(st.name==this.name&&st.age==this.age) return true; else return fa

java中如何将输出的结果写入到文件和显示在屏幕

问题描述 java中如何将输出的结果写入到文件和显示在屏幕 有一个1-50的数组,每次随即不重复抽取7个数,取7次,将这49个数写入到文件,剩下那个数显示在屏幕,程序应该怎么写,求大神赐教 解决方案 import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.uti

Java中Object类的equals()和hashCode()方法深入解析

1.equals() 在初学Java的时候,很多人会说在比较对象的时候,==是比较地址,equals()是比较对象的内容,谁说的? 看看equals()方法在Object类中的定义: public boolean equals(Object obj){ return (this == obj); } 这是比较内容么?明显是比较指针(地址)么... 但是为什么会有equals是比较内容的这种说法呢? 因为在String.Double等封装类中,已经重载(overriding)了Object类的eq

java中Object.equals()简单用法

/* equals()方法默认的比较两个对象的引用! */ class Child {     int num;     public Child(int x){         num = x;     }           //人文的抛出运行时异常的好处是:可以自定义错误信息!           /*public boolean equals(Object o) throws ClassCastException{          if(!(o instanceof Child)) t

java中JTextPane使输出字符到指定的宽度换行,并将垂直滚动条的位置移动到输出的最后位置

SimpleAttributeSet set = new SimpleAttributeSet(); Document doc = tp.getStyledDocument(); FontMetrics fm = tp.getFontMetrics(tp.getFont());//得到JTextPane 的当前字体尺寸 int paneWidth = tp.getWidth();//面板的宽度 String text = new String(bt, 0, len); try { for(int

关于Java中System.out输出信息到命令台窗口,反复更改同一段信息的问题

问题描述 最近用java做一个程序(只能用java做),程序打成jar文件,并通过.bat文件调用.其中我希望在程序中用System.out.print输出当前执行的进度,比如"59%",现在我每调用一次System.out的相关方法,那么之前的信息始终停留,最后结果是1%15%65%99%100%,这不是我想要的,我希望15%出现时候1%就被覆盖掉,请问怎么实现?我觉得应该存在实现的方式,因为我在使用Maven时候在下载组件时候在控制台输出过类似的提示信息. 解决方案 System.

为什么在Java中object.wait()/notify()方法必须在持有锁的情况下才能执行?

问题描述 为什么必须只有锁?我说的是为什么这么设计,不是说这样用的话就会抛异常.. 解决方案 只有两个线程抢一个资源的时候才存在两个线程同一时刻只能有一个线程得到资源,锁就是为了使两个线程抢同一个资源,如果没有锁,意思是两个线程不存在抢资源情况,那两个线程凭什么你等我 我等你,早就一起跑了.解决方案二:补充一下,wait逻辑通常是两步操作: (1)先判断特定的条件是否满足,如果不满足,(2)则进入wait.如果没有同步保护,就可能设置条件+唤醒的操作插入在这两步操作中间执行(1和2中间),造成w

Java中几种输出数组的for循环,以及循环中使用标签(非goto)

1.第一种,通过迭代的方式 File[] listFiles = file.listFiles(); for (Iterator iterator = files.iterator(); iterator .hasNext();) {       File file = (File) iterator.next(); }   2.增强for循环 File[] listFiles = file.listFiles(); for (File file2 : listFiles) {        }