为什么需要重写toString() 方法?

我们都知道Object类是所有引用数据类型的【直接或间接的父类】;

    所有子类都可以直接使用Object类中的所有方法;
    但是,有些方法对我们子类来说没有任何意义;
    所以我们子类可以重写父类的方法;

       【
        1. 父类方法不完全满足子类需求   super.父类方法();
        2. 父类方法完全不满足子类需求   直接重写,不管父类
         3. 父类方法完全满足子类需求     直接使用父类方法
        】

String toString()

    返回对象的字符串形式的地址值。对我们来说没有任何意义;所以通常情况,我们都会重写该方法;
      如果某个类中有比较中的成员变量,那么就重写toString();

底层代码:

public String toString() {
             return getClass().getName() + "@" + Integer.toHexString(hashCode());
         }

右键generate 选择重写toString 

java要求子类重写 子类重写tostring方法_子类

 

其中用到一下方法:

        getClass():  获取对象字节码对象
        getName():   获取对象的全类名
        hashCode():  获取对象的地址值的十进制表示形式
        toHexString: 把十进制转成十六进制的值

重写  boolean equals(Object obj)

        判断两个对象的地址值是否相等;不同的两个对象,地址值没有可能相同,所以比较地址值,没有任何意义;
        所以我们通常也会重写equals(),用来比较两个对象中的成员变量(属性)是否相同;

public boolean equals(Object obj){
             return this == obj;
         }
         // alt + insert 快捷键直接生成
         public boolean equals(Object o) {  //Object o = new LitterB();
             if (this == o) return true;  // 提高代码效率,如果是同一个对象,没有必要再往下比较   
             // 提高代码的健壮性    避免了空指针异常以及类型转换异常
             if (o == null || getClass() != o.getClass()) return false;
             // 为了使用子类特有的成员
             Student student = (Student) o;
             return age == student.age &&
                 Objects.equals(name, );
         }

 

 StringBuilder   字符串缓冲类

只有一个用途,就是用来做大量字符串数据拼接工作;
    底层是一个[可变]的数组;
    因为扩容机制,导致数组长度看似在变化;

1.StringBuffer是线程安全的而StringBuilder不是,因而在多线程的环境下优先使用StringBuffer,而其它情况下推荐使用 
StringBuilder,由于它更快。
2.StringBuilder和StringBuffer都继承自AbstractStringBuilder类,AbStractStringBuilder主要实现了扩容、append、 
insert方法。StrngBuilder和StringBuffer的相关方法都直接调用的父类。
3.StringBuilder和StringBuffer的初始容量都是16,程序猿尽量手动设置初始值。以避免多次扩容所带来的性能问题;
4.StringBuilder和StringBuffer的扩容机制是这种:首先试着将当前数组容量扩充为原数组容量的2倍加上2,假设这个新容 
量仍然小于预定的最小值(minimumCapacity),那么就将新容量定为(minimumCapacity),最后推断是否溢出,若溢出, 
则将容量定为整型的最大值0x7fffffff。

    构造方法:
        new StringBuilder();    创建一个空的StringBuilder对象

    常用方法:
        append();        在对象后面继续追加字符串
        toString();      将StringBuilder对象转成字符串
        reverse();       将StringBuilder对象中的字符串进行反转

 

java要求子类重写 子类重写tostring方法_子类_02


    

将数组转换成字符串形式两种方式:

方式一:

public static String showArray(int[] arr) {    StringBuilder sb = new StringBuilder("[");
    for (int i = 0; i < arr.length; i++) {
        if (i == arr.length - 1) {

            sb.append(arr[i]);
        } else {

            sb.append(arr[i]).append(", ");
        }
    }
    sb.append("]");
    String s = sb.toString();
    return s;
}

方式二:字符串拼接


public static String showArray(int[] arr) {    String s = "[";
    for (int i = 0; i < arr.length; i++) {
        if (i == arr.length - 1) {
            s += arr[i];
        } else {
            s += arr[i] + ", ";
        }
    }
    s += "]";
    return s;
}


总结:  前者效率更高