程序员面试必考题(十二):Java标准类--Object类
Object类定义了几个有用的方法,包括toString()。正因为有这个方法,Java中所有的对象内容都可转换为字符串。不过,对有些对象而言,转换成字符串没有什么意义,因此很少使用toString()方法。
在Object中的所有方法都可被任意类继承。Object不是抽象类,所有这些方法都已经实现了。如果这些缺省实现不能满足某个子类的要求,则子类中可以重写这些方法。
Object类中的主要方法列在表1中。
表 1 Object 类的主要方法
方法 |
功能 |
public final Class getClass() |
获取当前对象所属的类信息,返回Class对象。 |
public String toString() |
返回描述当前对象有关信息的一个字符串。 |
public boolean equals(Object obj) |
比较两个对象是否是同一对象,是则返回true。 |
protected Object clone() |
生成当前对象的一个拷贝,并返回这个复制对象。 |
public int hashCode() |
返回该对象的哈希代码值。 |
protected void finalize() throws Throwable |
定义回收当前对象时所需完成的资源释放工作。 |
1.1 toString方法
Object类中的toString方法以字符串形式返回相应的对象。
System.out.println方法输出的内容大多是字符串或字符串再加上变量的值。例如,语句:
System.out.println ("A quote by AbrahamLincoln: ");
输出一行字符。若整型变量 counter 的值是 3 ,则下行语句:
System.out.println ("counter = " +counter);
将输出 counter = 3 。
System.out.println方法的参数还可以是一个对象,表示要输出对象的信息。当参数为对象时,隐含调用了继承于Object类的toString方法。缺省的功能是输出对象所属类的名字,加上字符@,再加上一个数,这个数表示该对象所在的内存地址。例如,
SavingsAccount s = new SavingsAccount(500);
System.out.println(s);
得到的信息类似于:SavingsAccount@fea485c4。
如果想得到更详细的输出,需要在自己的类中重写toString方法。即使用户程序中不需要输出任何对象,也应该为每个类定义toString方法,这是个好习惯,有助于程序的调试。
例1 重写toString方法。
public class OrderedPair
{
privatedouble x;
privatedouble y;
OrderedPair(doublexx, double yy)
{
this.x=xx;
this.y=yy;
}
OrderedPair()
{
x=0;
y=0;
}
//other methods ...
/*Returns this OrderedPair in String form. */
publicString toString()
{ return "(" + x + " , "+ y + ")";
}
}
则语句
OrderedPair p = new OrderedPair(7, 10);
System.out.println(p);
将调用重写的toString方法,并输出有序对:(7.0 , 10.0)。
例2 重写toString方法
为BankAccount类重写toString方法,如下所示。
/* Returns this BankAccount in String form.*/
public String toString()
{ return"Bank Account: balance = $" + myBalance;
}
语句
BankAccount b = new BankAccount(600);
System.out.println(b);
得到的输出如下:
Bank Account: balance = $600.0
符号+除了可表示加法运算外,还可作为字符串连接运算符,实现的是两个字符串的拼接,后一个字符串拼接在前一个字符串的后面。
数组对象是个例外,它们不能有toString方法。要打印数组元素,必须遍历数组,显式打印每个元素。
【例题】 Refer to these declarations:(来自美国AP考试)
Integer k = new Integer(8);
Integer m = new Integer(4);
Which test will not generate an error?
I.if(k.intValue()== m.intValue())...
II.if((k.intValue()).equals(m.intValue()))...
III.if((k.toString()).equals(m.toString()))...
A.I only B.IIonly C.IIIonly D.Iand III only E.I,II, and III
解:D。测试I是正确的,因为使用==比较内置类型(本例中是int值)是可行的。测试III也可行,因为k.toString()和m.toString()都是String类型,应当使用equals来比较。测试II是错误的,因为不能在int上调用一个方法(此处是equals)。
1.2 equals方法
Object类中的equals方法对两个对象进行比较。所有的类均从Object类继承该方法。如果调用对象和参数对象obj是同一个对象,equals方法返回真,否则返回假。同一个对象意味着指向相同的内存空间。例如:
Date d1 = new Date("January", 14,2001);
Date d2 = d1;
Date d3 = new Date("January", 14,2001);
测试(d1.equals(d2))返回真,但是测试(d1.equals(d3))返回假。虽然d1和d3指向的内容是一样的,但保存这些内容的地址是不同的,即d1和d3没有指向同一个对象。
如果想让两个内容相同的对象称为相等,必须重写类中的equals方法。本章后面介绍的一些标准类按这种方式重写了equals方法。在AP考试中,考生不需要重写equals方法。
equals的缺省实现等价于对象的==关系。在上面的Date例子中,测试(d1==d2)返回真;测试(d1==d3)返回假。
在Java中不能重载运算符<、>等。要比较对象,必须使用equals方法,如果类实现了Comparable接口,也可用compareTo方法。
其他方法本文不再繁述,读者可以参阅相关Java教材。