object类

java中objec是所有类公共的父类,一个类只要没有明显的继承某一类,那么它就是继承object类。

例如 class Person {......};和class Person extends Object{......}是一样的。如果我们的Studdent继承了Person类,继承结构就应该是

1.9(java学习笔记)object类及toString()与equals()方法-LMLPHP

这时大家可能会想,为什么要默认继承object类,把objec类作为公共的父类有什么用?

object类作为公共的父类,那么所有的子类都可以调用Object类中的方法。

下列结束两个Object类中的方法

1.toString

我们看下列代码

 package TestObject;

 public class Person {
public static void main(String[] args){
Student stu1 = new Student();
System.out.println(stu1);
System.out.println(stu1.toString());
} } class Student extends Person{
void study(){
System.out.println("学习中...");
}
}
运行结果:
TestObject.Student@15db9742
TestObject.Student@15db9742

我们会发现运行的结果是一样的。我们在来看看object中toString()f方法的源码

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

前面是获取名称,后面是获取地址。

这个方法是Object类中的,是所有子类的公共父类,所以我们可以通过重写toString()方法来达到我们需要的功能。

 package TestObject;

 public class Person {
String name = "hcf";
public static void main(String[] args){
Student stu1 = new Student();
System.out.println(stu1);
System.out.println(stu1.toString());
} } class Student extends Person{
void study(){
System.out.println("学习中...");
}
public String toString(){
return name;
}
}
运行结果:
hcf
hcf

这样我们就重写了Object类中的toString()方法。

2.equals()

我们先看下object类中的equals()方法源码

 public boolean equals(Object obj) {
return (this == obj);

可以看出,这个比较是直接比较地址值是否相等。

我们实际使用时可能认为,两个对象的内容相同就是相同的对象,可这时使用equals比较会出问题。因为对象的内容相同,但它们的存放地址是不同的,即不同的地址存放着相同的内容。

这是我就需要重写object类中equals方法,改写成对象的内容相同就代表它们相同。

下面是重写之后的equals方法。

 package TestObject;

 public class Person {
String name = "hcf";
public static void main(String[] args){
Student stu1 = new Student();
Student stu2 = new Student();
System.out.println(stu1 == stu2);
System.out.println(stu1.equals(stu2));
}
} class Student extends Person{
void study(){
System.out.println("学习中...");
}
public String toString(){
return name;
} @Override //加上这个标记代表重写了该方法。
public boolean equals(Object obj) { //因为Object是所有对象的父类,所以可以使用Object来接受任意类型的对象,便于操作。
if(this == obj) //首先判断两个对象地址是否相同,地址相同则肯定是相同对象。
return true;
if(!(obj instanceof Student)) //然后在判断两个是不是同一类,如果类不想同,则不同。
return false;
Student stu = (Student)obj; //先将obj强制转型成Student,然后一个一个属性区比较
if(stu.name.equals(this.name)) //此时的equals是String类中的方法,作用是比较字符的内容是否相同。
return true; //stu.name是String形式,所以调用的是String中的equals方法,
else //String中也重写了equals方法,作用是比较字符串内容是否相等。
return false;
} }

object类中一些方法我们会根据自己需要来重写。

05-08 15:38