Object类是所有Java类的根基类,也就是说它是Java所有类的老祖宗
如果在类的声明中未使用extends关键字指明其父类为object类
例如:
Public
class Person{ }等价于Public class Person extends object{ }
Object类中定义有public string tostring()方法,其返回值是string类型,描述当前对象的有关信息。查找API是这样写的tostring()是object类的一个方法:Returns a string representation of the
object返回代表这个对象的一个字符串
在进行string与其它类型数据的连接操作时,(如:system.out.ptintln(“info”+person)),将自动调用该对象类的tostring()方法。
也可以根据需要在用户自定义类型中重写tostring()方法。
public
class TestToString {
public static void main(String[] args) {
Dog d=ner Dog();
System.out.println(“d:=”+d);//其实相当于是(“d:=”+d.tostring())这样的话两个字符串连接在了一起。但是按照这样返回的东西是此方法默认的东西,看不懂。所以在class Dog中重写tostring()
}
}
Class
Dog{
Public string tostring() {//重写了tostring()方法
Return “I am a dog”;
}
}
0336
Equals方法
(1)Object类中定义public boolean equals(Object
obj)方法。且注意此方法的。默认定义为x.equals(y)当x,y是同一对象时返回true,否则false
(2)String和Date等重写了equals方法。x.equals(y),当x和y所引用的对象,是同一类对象且属性内容相等时(并不一定是相同对象)返回true,否则false。查看API可知:String重写后的equals方法,要求二者字符串一样也返回true否则false。如下小练习返回值为true,true.这点和例1不一样的!!!
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
(3)常根据需要重写equals方法
例1:public class TestEquals {
public static void main(String[] args) {
Cat c1 = new Cat( 1,2,3);
Cat c2 = new Cat(1,2,3 );
System.out.println(c1 = = c2);输出的结果是false,两者并不相等。因为它比较的是两者在stack中的引用(里面存的是在heap中的实际对象的地址)。换句话说:它比较的是地址!!!所以,当然不相等,永远不会相等。相等就覆盖了。所以,我们只可以找到一种方法比较它们的实质是否一样,即在heap中的实际对象是否一样,这就引出了equals方法。如下句。
System.out.println(c1.equals(c2));//查看API可知:object中的equals方法的默认实现是比较当前对象的引用与你要比较的引用是否指向同一对象。所以这句和上句的实质是一样的,也是false。我们在实际中要根据需要重写equals方法!!如下例
}
}
例2:class Cat {
i nt
color;
int
height, weight;
public Cat(int color, int height, int
weight) {
this.color = color;
this.height = height;
this.weight = weight;
}
}
public
class TestEquals {
public static void main(String[] args) {
Cat c1 = new Cat(1, 2, 3);
Cat c2 = new Cat(1, 2, 3);
System.out.println(c1 = = c2);
System.out.println(c1.equals(c2));
}
}
class Cat
{
int color;
int height, weight;
public Cat(int color, int height, int weight) {
this.color = color;
this.height = height;
this.weight = weight;
}
public boolean equals(Object obj) {
if(obj = = null) return false;//和空值比较返回false,参见API
else {
if(obj instanceof Cat) {//因为public boolean equals(Object
obj)要求的参数是Object类,所以传一只狗也是对的,故我们要判断所传的东西是否是猫。词句代码的意思是:如果obj是Cat类对象的引用
Cat c = (Cat)obj;//obj本是Object类型,这里强制转换为Cat类型
if(c.color == this.color &&
c.height == this.height && c.weight
== this.weight) {
return true;
}
}
}
return false;
}
}//最终结果返回false针对第一个输出语句
True针对第二个输出语句,因为它重写了equals方法。
注意理解(c.color = =
this.color && c.height = =
this.height && c.weight = =
this.weight)这里已经没有什么c1和c2了因为c1作为实参传给了形参obj了,this也代替了c2