浅谈Object类中常用的方法

Object类

Object是所有类的根类,这里面的方法所有对象都可以用,下面介绍几种常用的方法

equals方法

  • boolean equals(Object obj) //比较两个对象是否相等
    用下面这个程序来举例,阐述equals 与==的区别
class Person{
  private int age;
 Person(int age){
this.age = age;
}
}
class Test{
  public static void main(String[] args){
  Person p1 = Person(10);
  Person p2 = Person(10);
 System.out.println(p1 == p2);
 System.out.println(p1.equals(p2));
}
}

我先给出结果:这两个都是false

p1==p2这个是比较两个引用,就是地址,显而易见,这两个引用指向不同的对象,所以为false

许多人认为这两个对象是比较这两个对象的内容,这个方法实际是:对于任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才返回true 说白了,这个方法也是比较地址,与==一样。

因为我们发现这个Object中给出的方法没啥用,我们一般需要的是比较两个对象中的内容是否相等(例如我们需要比较两个人的年龄是否相等)所以我们需要覆盖这个equals方法。
代码如下

class Person{
  private int age;
 Person(int age){
this.age = age;
}
public boolean equals(Object obj){            注意覆盖方法里面参数列表不能改,改了就不叫覆盖了。
if(obj instanceof Person){
  Person p  =(Person)obj;
  return this.age == P.age;                   由于多态的弊端需要向下转型,就得需要类型判断,防止抛出异常
    }
    else 
      throw new RuntimeException("类型错误");                         如果传入了不是人的东西,得需要进行类型断 
  }                                                                  返回false不太好,需要排除异常                              

大部分情况下,我们都需要覆盖这个方法(很重要),根据特有的内容来判断对象是否相同

hashcode方法

  • int hashcode() 返回对象的哈希码值
    这个方法在哈希表中应用的广泛
    需要注意的是当equals()方法被override时,hashCode()也要被override。按照一般hashCode()方法的实现来说,相等的对象,它们的哈希码值一定相等。

  • 相等(相同)的对象必须具有相等的哈希码(或者散列码)。

  • 如果两个对象的hashCode相同,它们并不一定相同。

getClass方法

  • Class getClass()返回此对象的运行时类
    运行时类:当前对象所属的字节码文件对象。

首先说一下类是怎么加载到内存的

在Java中万物皆对象,当编译完成后,每个类变成了字节码文件(例如Person.class字节码文件),这个字节码文件保存Class类的对象(Class类是Java中的一个类 class Class{ }),第一次需要这个类的时候,类加载器先检查这个类对象是否被加载过,如果还没加载,就找到这个.class文件,把这个Person.class被加载到内存中,在内存中通过这个Person.class类创建对象

代码展示

Class c1 = p1.getClass();
Class c2 = p2.getClass();
System.out.println(c1 == c2);       true

解释:首先p1,p2都是Person类型,通过这两个对象返回Person.class字节码文件对象(内存中只有一份),同过这一个对象生成很多Person对象,所以相同,c1 c2都是指向Person.class字节码文件对象。所以地址相同返回true.

toString方法

  • String toString()
    Java能把所有的类型编程String类型
class Test{
}
class Main{
public static  void main(String[] args){
Test t  = new Test();
Sop(t);
Sop(t.getClass(),getName+"@"+hashCode());
}
}

所有类建议重写toString()

你可能感兴趣的:(浅谈Object类中常用的方法)