1.9(java学习笔记)object类及toString()与equals()方法
object类
java中objec是所有类公共的父类,一个类只要没有明显的继承某一类,那么它就是继承object类。
例如 class Person {......};和class Person extends Object{......}是一样的。如果我们的Studdent继承了Person类,继承结构就应该是
这时大家可能会想,为什么要默认继承object类,把objec类作为公共的父类有什么用?
object类作为公共的父类,那么所有的子类都可以调用Object类中的方法。
下列结束两个Object类中的方法
1.toString
我们看下列代码
1 package TestObject; 2 3 public class Person { 4 public static void main(String[] args){ 5 Student stu1 = new Student(); 6 System.out.println(stu1); 7 System.out.println(stu1.toString()); 8 } 9 10 } 11 12 class Student extends Person{ 13 void study(){ 14 System.out.println("学习中..."); 15 } 16 }
运行结果:
TestObject.Student@15db9742
TestObject.Student@15db9742
我们会发现运行的结果是一样的。我们在来看看object中toString()f方法的源码
1 public String toString() { 2 return getClass().getName() + "@" + Integer.toHexString(hashCode()); 3 }
前面是获取名称,后面是获取地址。
这个方法是Object类中的,是所有子类的公共父类,所以我们可以通过重写toString()方法来达到我们需要的功能。
1 package TestObject; 2 3 public class Person { 4 String name = "hcf"; 5 public static void main(String[] args){ 6 Student stu1 = new Student(); 7 System.out.println(stu1); 8 System.out.println(stu1.toString()); 9 } 10 11 } 12 13 class Student extends Person{ 14 void study(){ 15 System.out.println("学习中..."); 16 } 17 public String toString(){ 18 return name; 19 } 20 }
运行结果:
hcf
hcf
这样我们就重写了Object类中的toString()方法。
2.equals()
我们先看下object类中的equals()方法源码
1 public boolean equals(Object obj) { 2 return (this == obj);
可以看出,这个比较是直接比较地址值是否相等。
我们实际使用时可能认为,两个对象的内容相同就是相同的对象,可这时使用equals比较会出问题。因为对象的内容相同,但它们的存放地址是不同的,即不同的地址存放着相同的内容。
这是我就需要重写object类中equals方法,改写成对象的内容相同就代表它们相同。
下面是重写之后的equals方法。
1 package TestObject; 2 3 public class Person { 4 String name = "hcf"; 5 public static void main(String[] args){ 6 Student stu1 = new Student(); 7 Student stu2 = new Student(); 8 System.out.println(stu1 == stu2); 9 System.out.println(stu1.equals(stu2)); 10 } 11 } 12 13 14 class Student extends Person{ 15 void study(){ 16 System.out.println("学习中..."); 17 } 18 public String toString(){ 19 return name; 20 } 21 22 @Override //加上这个标记代表重写了该方法。 23 public boolean equals(Object obj) { //因为Object是所有对象的父类,所以可以使用Object来接受任意类型的对象,便于操作。 24 if(this == obj) //首先判断两个对象地址是否相同,地址相同则肯定是相同对象。 25 return true; 26 if(!(obj instanceof Student)) //然后在判断两个是不是同一类,如果类不想同,则不同。 27 return false; 28 Student stu = (Student)obj; //先将obj强制转型成Student,然后一个一个属性区比较 29 if(stu.name.equals(this.name)) //此时的equals是String类中的方法,作用是比较字符的内容是否相同。 30 return true; //stu.name是String形式,所以调用的是String中的equals方法, 31 else //String中也重写了equals方法,作用是比较字符串内容是否相等。 32 return false; 33 } 34 35 }
object类中一些方法我们会根据自己需要来重写。