Java学习笔记(疯狂Java讲义第三版)——打印对象和toString()

打印对象和toString()

什么是打印对象?就是利用System.out.println()直接对对象进行输出。
看下面例子
class A//随意定义一个类,类名为A
{
int a;//定义一个普通成员变量,变量名为a
public A(int a)//定义一个构造器,在创建A类对象的时候初始化正在创建的对象,即对普通成员变量a进行赋值操作。
{
this.a = a;
}
}
public class Test
{
A a = new A(1);//创建一个A类对象,为对象中的普通成员变量a赋初始值,数值为1,并将该对象赋给声明的A类变量,变量名为a的变量来进行引用。
System.out.println(a);//直接打印对象本身。
}
//输出结果为:A@15db9742,普通的机器运行结果可能不同。

通过上述例子,可以看出对象是可以直接打印输出的。

System.out.println();函数只能在控制台上打印字符串,而对象本质是内存中的一块存储区域,它是怎样做到转化成字符串进行输出的呢?

其实输出的不是对象本身,而是对象的toString();方法。即上述语句System.out.prinltn(a);与System.out.println(a.toString());是等价的。当我们直接通过System.out.prinltn()打印输出对象的时候,实际上是系统帮我们调用了该对象中的toString()方法。

在A类中,并没有定义普通成员方法toString(),它又是哪来的呢?
toString方法是Object类中定义的非private修饰的普通成员方法,实际调用的是从Object类继承得来的toString()方法。

toString()方法是Object类定义的普通成员方法,因为所有的类都直接或者间接继承了Object类,所以都可以调用Object类中定义的非private修饰的成员变量和成员方法,而toString()是public修饰的,所以当然可以调用从Object类继承来的toString()方法了。

toString()的作用:
1、是一个“自我描述”方法,当程序员直接打印该对象的时候,系统会自动调用该对象继承得来得toString()方法,进而输出该对象的“自我描述"信息。简单得理解,就是直接打印对象得时候,对象通过调用toString()进行一个简单得自我介绍。

上文中通过toString()方法返回的信息A@15db9742是什么意思呢?
先看toString()方法返回内容的语法公式:“类名” + @ + “hashCode”,对比该公式,则对于A@15db9742,A表示该对象的所属的类,类名为A,@就是一个单纯的分隔符,没有实际含义,用以分隔类名和@符号后面的那串数值,使得看起来更加清晰方便。@符号后面的那串数字是一种数值,称为hashCode。对于作用来说,可以先简单的立即为用以标识属于该类对象的唯一信息。

什么是hashCode?
hashCode是通过哈希算法得到的一个数值,至于哈希算法可以简单的理解成一种对数据的计算公式。对相应得数据以哈希算法的形式计算得到的结果就是hashCode,也成为哈希码。
简单来说哈希算法就是一种计算公式,名称叫哈希算法。通过该公式可对数据进行计算就可以得到相应的数值,就是hashCode。

那对于一个对象来说,哪些内容参与了哈希计算来得到的hashCode,为什么要进行要计算hashCode而不直接使用对象所在内存空间的地址呢?
个人理解:对象的成员变量和一些其他的内容参与到了hashCode的计算当中。

感悟:
最开始学到这块的时候,一直对hashCode无法理解。主要由以下几点:
1、什么是hashCode?
2、哪些内容参加了hashCode计算从而得到了对象的hashCode值。
3、为什么要使用hashCode而不直接返回地址?

对于什么是hashCode个人经验就是将他理解成一串数字即可,这串数字刚好可以表达该对象的唯一性。

而对于哪些内容参加了hashCode计算从而得到了对象的hashCode值。我的个人理解是类中定义的成员变量和地址应该都参与到了相应的计算。其他的就不知道了。通过以后的学习进行补充即可。

为什么要使用hashCode而不直接返回地址呢?
个人理解:
1、可能是对对象的一种保护,防止知道了对象的地址信息进而对其进行破坏。
2、返回hashCode可能相对来说更加方便。且也能表达属于该类对象的唯一性。

重写toString()方法:
因为toString()方法的目的就是能够实现对象的自我描述,但是通过直接从Object类继承得来的toString()方法并不能很好的实现预期得效果,单单从@符号后面的hashCode来看,就不知道该数值表达的是什么意思,仅仅知道该对象属于哪个类,即可以通过@符号前面的类名判断的出。但是对于一个对象来说,不仅仅要描述该类所属的哪个类信息,还要关描述有关它内部成员的相关信息。所以,子类中一般都会重写toString()方法。

重写toString方法的规范什么呢?——类名[成员1=值1、成员2=值2…](特别提示此处中括号不是可省略的意思,是要写的)看下面例子
class A
{
int a;
int b;
public A(int a, int b)
{
this.a = a;
this.b = b;
}
public String toString()
{
return “A[a =” + a + "b = " + b + “]”;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值