20200831-齐元朝

问题

今天早晨上课时,我们用到了Arrays类中的一个类方法

public Static String toString ( object[] o ){}

这个方法是将传入的数组转换成字符串形式

通常我们用这个方法来以字符串形式输出数组,即System.out.println( Arrays.toString() );

今早课上有这么一个用法:

public class Tiger {
    
    private String name ;
    private char gender ;
    private int age ;
    
    public Tiger(String name, char gender, int age) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "(" + name + "|" + gender + "|" + age + ")";
    }
}
public class TigerTest {

    public static void main(String[] args) {
        
        Tiger[] tigers = new Tiger[ 4 ];
        System.out.println( Arrays.toString( tigers ) );
        
        tigers[ 0 ] = new Tiger( "虎大" , '男' , 10 );
        tigers[ 1 ] = new Tiger( "虎二" , '男' , 8 );
        tigers[ 2 ] = new Tiger( "虎爸" , '男' , 30 );
        tigers[ 3 ] = new Tiger( "虎妈" , '女' , 22 );
        
        System.out.println( Arrays.toString( tigers ) );
    }
}

程序运行输出结果如下:

Arrays.toString(array);这个方法是将数组中存储的元素转换成字符串,但在上述例子中,数组的存储情况应该如下:

那么,数组里存储的值是“地址”,那么此时Arrays.toString(array)输出的字符串应该是元素值对应的字符串(一串地址),但是运行结果却是每个元素值指向的对象的变量信息。这是为什么呢?

解决

下午课堂上学习了Arrays类,其中有一个方法sort方法,它在方法内调用了数组元素对应类中实现的compareTo方法

所以我有如下猜测:

在Arrays类的toString方法中,应该有调用元素对应类中重写的toString方法,所以输出数组元素时,自动通过数组元素指向的对象调用了该对象类中的toString方法

于是我将Tiger类中重写的toString方法注释掉,再次运行,结果如下:

可以看到,此时输出数组就输出了一坨类似于地址的东西

而且点开Arrays.toString方法,能找见在方法内部,调用了一个toString,类似于在Arrays.sort中调用了compareTo方法

这个方法里的操作大概就是用String.valueOf把数组里每一个元素指向的对象变成字符串,String类中有重写toString方法,所以输出了数组中每一个元素指向对象的内容

标签


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1