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()