JAVA 中toSting() 方法重写

本文详细介绍了Java中Object类的toString方法,解释了其默认行为和如何重写以提供更友好的对象描述信息。

一、Object类介绍

Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能有一个,JAVA为了组织这个类组织得比较方便,它提供了一个最根上的类,相当于所有的类都是从这个类继承,这个类就叫Object。所以Object类是所有JAVA类的根基类,是所有JAVA类的老祖宗。所有的类,不管是谁,都是从它继承下来的。


二、toString方法介绍


一个字符串和另外一种类型连接的时候,另外一种类型会自动转换成String类型,然后再和字符串连接。基础的数据类型int,float,double转换成字符串比较简单,按照它们的数字转换过来就成了,可以引用类型呢,Person p = new Person();一个字符串加上这个p,你就不知道要怎么把这个p转换成字符串了,因为这个p是一个引用类型。 p = new Person();


例1

public class TestToString {
 
    public static void main(String[] args) {
         Dog d = new Dog();
        /**
          * 如果没有重写toString方法,那么输出来的默认的字符串内容是“类名+哈希编码”,
         * 如:dog=cn.galc.test.Dog@150bd4d
          * 这里的d就是一个引用类型,打印的时候,这个引用类型d会自动调用toString()方法将自己转换成字符串然后再与字符串”d:=”相连,
         * 然后一起被打印出来。d为什么可以自动调用toString()方法呢,Dog类里面也没有声明这个toString()方法。
          * 这是因为toString()方法是Object类里面的方法,而所有的类都是从Object类继承下来的,
          * Dog类当然也不例外,所以Dog类继承了Object类里面的toString()方法,
          * 所以Dog类的对象当然可以直接调用toString()方法了。
          * 但是Dog类对继承下来的toString()方法很不满意,
          * 因为使用这个继续下来toString()方法将引用对象转换成字符串输出时输出的是一连串令人看不懂的哈希编码。
          * 为了使打印出来的信息使得正常人都能看得懂,因此要在Dog类里面把这个继承下来的toString()方法重写,
          * 使得调用这个toString()方法将引用对象转换成字符串时打印出来的是一些正常的,能看得懂的信息。
          * 在子类重写从父类继承下来的方法时,从父类把要重写的方法的声明直接copy到子类里面来,
          * 这样在子类里面重写的时候就不会出错了。
          */
         System.out.println("dog="+d);//打印结果:dog=I’m a cool Dog
     }
 }
 
 class Dog{
     /**
      * 在这里重写了Object类里面的toString()方法后,
      * 引用对象自动调用时调用的就是重写后的toString()方法了,
      * 此时打印出来的显示信息就是我们重写toString()方法时要返回的字符串信息了,
      * 不再是那些看不懂的哈希编码了。
      */
     public String toString() {
         return "I’m a Dog";
     }
 }



任何一个类都是从Object类继承下来的,因此在任何一个类里面都可以重写这个toString()方法。toString()方法的作用是当一个引用对象和字符串作连接的时候,或者是直接打印这个引用对象的时侯,这个引用对象都会自动调用toString()方法,通过这个方法返回一个表示引用对象自己正常信息的字符串,而这个字符串的内容由我们自己去定义,默认的字符串内容是“类名+哈希编码”。因此我们可以通过在类里面重写toString()方法,把默认的字符串内容改成我们自己想要表达的正常信息的字符串内容。





例2


一:首先看Demo1

[java] view plain copy
  1. <strong><span style="font-size:18px;">public class Dog1{  
  2.     Dog1(){  
  3.           
  4.     }  
  5.     public static void main(String[] args) {  
  6.         Dog1 d = new Dog1();  
  7.         System.out.println(d);  
  8.     }  
  9. }</span></strong>  

输出结果:


Dog1@77aaf64d

我们经常会看到对象的输出结果是这个样子?但是你想过为什么会输出这个结果吗?


明白这个输出,需要了解一下Object这个类,Object类是java所有类的基类。

也就是上面的类定义,其实等价于

[java] view plain copy
  1. <strong><span style="font-size:18px;">public class Dog1<span style="color:#ff0000;"extends Object{</span></span></strong>  
[java] view plain copy
  1. <strong><span style="font-size:18px;">Object类中有一个toString()方法</span></strong>  
[java] view plain copy
  1. <strong><span style="font-size:18px;">它的实现代码为:</span></strong>  
[java] view plain copy
  1. <strong><span style="font-size:18px;">  
  2.  <span style="color:#ff0000;">public String toString() {  
  3. <spanstyle="whitespace:pre"> </span>  return getClass().getName() + "@" + Integer.toHexString(hashCode());  
  4.   }</span>  
  5. </span></strong>  

System.out.println(d);
//等价于System.out.println(""+d);
//等价于System.out.println(""+d.toString());
//任何对象与字符串拼接,都会将对象转化为字符串类型,相当于调用对象的toString方法。这里就会调用父类的toString()方法


二:再来看Demo2

[java] view plain copy
  1. public class Dog2{  
  2.     Dog2(){  
  3.     
  4.     }  
  5.      public String toString() {  
  6.             return "i am a dog";  
  7.         }  
  8.     public static void main(String[] args) {  
  9.         Dog2 d = new Dog2();  
  10.         System.out.println(d);  
  11.           
  12.     }  

来看输出结果:

i am a dog


为什么呢?

因为Dog2重写Override了父类Object的toString()方法。就会调用自己的toString方法。

建议类最好都重写一下Object的toString()方法。


例3

1、在Object类中定义toString()方法的时候返回对象的哈希code码(对象地址字符串)

直接输出对象:
这里写图片描述

2、可以通过重写toString()方法表示出对象的属性之值。
重写toString方法,返回值是字符串(string):

public class MeiZu extends Phone{
        int cpu=1;
        public String toString() {
            return "MeiZu [cpu=" + cpu + "]";
        }           

}
    public static void main(String[] args) {

        MeiZu meizu=new MeiZu();
        System.out.println(meizu);

    }

结果:

MeiZu [cpu=1]




例4


1、程序示例

[java] view plain copy
  1. class Person  
  2. {  
  3.     private String name;  
  4.     public Person(String name)  
  5.     {  
  6.         this.name = name;  
  7.     }  
  8. }  
  9. public class PrintObject  
  10. {  
  11.     public static void main(String[] args)  
  12.     {  
  13.         // 创建一个Person对象,将之赋给p变量  
  14.         Person p = new Person("林冲");  
  15.         // 打印p所引用的Person对象  
  16.         System.out.println(p);  
  17.     }  
  18. }  

 

2、运行结果

Person@1db9742

3、结果分析

当使用该方法输出Person对象时,实际输出的是Person对象的toString方法。

 

三 重写toString方法示例

1、程序示例

[java] view plain copy
  1. class Apple  
  2. {  
  3.     private String color;  
  4.     private double weight;  
  5.     public Apple(){ }  
  6.     //提供有参数的构造器  
  7.     public Apple(String color , double weight)  
  8.     {  
  9.         this.color = color;  
  10.         this.weight = weight;  
  11.     }  
  12.   
  13.     // color的setter和getter方法  
  14.     public void setColor(String color)  
  15.     {  
  16.         this.color = color;  
  17.     }  
  18.     public String getColor()  
  19.     {  
  20.         return this.color;  
  21.     }  
  22.   
  23.     // weight的setter和getter方法  
  24.     public void setWeight(double weight)  
  25.     {  
  26.         this.weight = weight;  
  27.     }  
  28.     public double getWeight()  
  29.     {  
  30.         return this.weight;  
  31.     }  
  32.   
  33.     // 重写toString方法,用于实现Apple对象的"自我描述"  
  34.     public String toString()  
  35.     {  
  36.         return "一个苹果,颜色是:" + color  
  37.             + ",重量是:" + weight;  
  38.     }  
  39.   
  40. //  public String toString()  
  41. //  {  
  42. //      return "Apple[color=" + color + ",weight=" + weight + "]";  
  43. //  }  
  44.   
  45. }  
  46. public class ToStringTest  
  47. {  
  48.     public static void main(String[] args)  
  49.     {  
  50.         Apple a = new Apple("红色" , 2.38);  
  51.         // 打印Apple对象  
  52.         System.out.println(a);  
  53.     }  
  54. }  

 

2、运行结果

一个苹果,颜色是:红色,重量是:2.38

3、结果分析

从上面的运行结果来看,通过重写Apple类的toString方法,就可以让系统在打印Apple对象时打印出该对象的“自我描述”信息。




例5



当需要将一个对象输出到显示器时,通常要调用他的toString()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toString()方法

默认情况下 System.out.println(对象名)或者System.out.println(对象名.toString())输出的是此对象的类名和此对象对应内存的首地址 如果想自定义输出信息必须重写toString()方法

注意事项

1.必须被声明为public

2.返回类型为String

3.方法的名称必须为toString,且无参数

4.方法体中不要使用输出方法System.out.println()

[java] view plain copy
  1. import java.util.*;  
  2. public class TreeSetTest {  
  3.   
  4.     /** 
  5.      * @param args 
  6.      */  
  7.     public static void main(String[] args) {  
  8.         // TODO Auto-generated method stub  
  9.         SortedSet<Item> parts=new TreeSet<Item>();  
  10.         parts.add(new Item("Toaster"1234));  
  11.         parts.add(new Item("Widget"4562));  
  12.         parts.add(new Item("Modem"9912));  
  13.         System.out.println(parts);  
  14.         SortedSet<Item> sortByDescription=new TreeSet<Item>(new   
  15.                 Comparator<Item>()  
  16.                 {  
  17.                     public int compare(Item a, Item b)  
  18.                     {  
  19.                         String descrA=a.getDescription();  
  20.                         String descrB=b.getDescription();  
  21.                         return descrA.compareTo(descrB);  
  22.                     }  
  23.               
  24.                 });  
  25.         sortByDescription.addAll(parts);  
  26.         System.out.println(sortByDescription);  
  27.   
  28.     }  
  29.   
  30. }  
  31. class Item implements Comparable<Item>  
  32. {  
  33.     public Item(String aDescription, int aPartNumber)  
  34.     {  
  35.         description=aDescription;  
  36.         partNumber=aPartNumber;  
  37.     }  
  38.     public String getDescription()  
  39.     {  
  40.         return description;  
  41.     }  
  42.     public boolean equals(Object otherObject)  
  43.     {  
  44.         if(this==otherObject)  
  45.             return true;  
  46.         if(otherObject==null)  
  47.         {  
  48.             return false;  
  49.         }  
  50.         if (getClass()!=otherObject.getClass())  
  51.         {  
  52.             return false;  
  53.         }  
  54.         Item other=(Item)otherObject;  
  55.         return description.equals(other.description)&&  
  56.                 partNumber==other.partNumber;  
  57.     }  
  58.     public int hashCode()  
  59.     {  
  60.         return 13*description.hashCode()+17*partNumber;  
  61.     }  
  62.     public int compareTo(Item other)  
  63.     {  
  64.         return partNumber-other.partNumber;  
  65.     }  
  66.     private String description;  
  67.     private int partNumber;  
  68. }  
输出为:

[Item@8c9e3a56, Item@d780c206, Item@39c021ba]

[Item@39c021ba, Item@8c9e3a56, Item@d780c206]



Item重载toString()方法后:

[java] view plain copy
  1. import java.util.*;  
  2. public class TreeSetTest {  
  3.   
  4.     /** 
  5.      * @param args 
  6.      */  
  7.     public static void main(String[] args) {  
  8.         // TODO Auto-generated method stub  
  9.         SortedSet<Item> parts=new TreeSet<Item>();  
  10.         parts.add(new Item("Toaster"1234));  
  11.         parts.add(new Item("Widget"4562));  
  12.         parts.add(new Item("Modem"9912));  
  13.         System.out.println(parts);  
  14.         SortedSet<Item> sortByDescription=new TreeSet<Item>(new   
  15.                 Comparator<Item>()  
  16.                 {  
  17.                     public int compare(Item a, Item b)  
  18.                     {  
  19.                         String descrA=a.getDescription();  
  20.                         String descrB=b.getDescription();  
  21.                         return descrA.compareTo(descrB);  
  22.                     }  
  23.                 });  
  24.         sortByDescription.addAll(parts);  
  25.         System.out.println(sortByDescription);  
  26.   
  27.     }  
  28.   
  29. }  
  30. class Item implements Comparable<Item>  
  31. {  
  32.     public Item(String aDescription, int aPartNumber)  
  33.     {  
  34.         description=aDescription;  
  35.         partNumber=aPartNumber;  
  36.     }  
  37.     public String getDescription()  
  38.     {  
  39.         return description;  
  40.     }  
  41.     public String toString()  
  42.     {  
  43.         return "[description="+description  
  44.                 +",partNumber="+partNumber+"]";  
  45.     }  
  46.     public boolean equals(Object otherObject)  
  47.     {  
  48.         if(this==otherObject)  
  49.             return true;  
  50.         if(otherObject==null)  
  51.         {  
  52.             return false;  
  53.         }  
  54.         if (getClass()!=otherObject.getClass())  
  55.         {  
  56.             return false;  
  57.         }  
  58.         Item other=(Item)otherObject;  
  59.         return description.equals(other.description)&&  
  60.                 partNumber==other.partNumber;  
  61.     }  
  62.     public int hashCode()  
  63.     {  
  64.         return 13*description.hashCode()+17*partNumber;  
  65.     }  
  66.     public int compareTo(Item other)  
  67.     {  
  68.         return partNumber-other.partNumber;  
  69.     }  
  70.     private String description;  
  71.     private int partNumber;  
  72. }  


输出为:[[description=Toaster,partNumber=1234], [description=Widget,partNumber=4562], [description=Modem,partNumber=9912]]

[[description=Modem,partNumber=9912], [description=Toaster,partNumber=1234], [description=Widget,partNumber=4562]]





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值