Java中所有类的祖先——Object类

Object类

  • 所有类的直接或间接超类,处于类层次的最高点
  • 包含了所有Java类的公共属性

Object类的主要方法

  • public final Class getClass()
    • 获取当前对象所属的类信息,返回Class对象
  • public String toString()
    • 返回表示当前对象本身有关信息的字符串对象
  • public boolean equals(Object obj)
    • 比较两个对象引用是否指向同一对象,是则返回true,否则返回false
  • protect Object clone()
    • 复制当前对象,并返回这个副本
  • public int hashCode()
    • 返回该对象的哈希代码值
  • protected void finalize() throws Throwable
    • 在对象被回收时执行,通常完成的资源释放工作

相等和同一

  • 两个对象具有相同的类型,及相同的属性值,则称两者相等(equal)
  • 如果两个引用变量指向的是同一个对象,则称这两个引用变量同一(identicial)
  • 两个对象同一,则肯定相等
  • 两个对象相等,不一定同一
  • 比较运算符"=="判断的是这两个对象是否同一
public class Tester1{
	public static void main(String args[]) {
		BankAccount a = new BankAccount("Bob", 123456, 100.00f);
		BankAccount b = new BankAccount("Bob", 123456, 100.00f);
		if (a == b) {
		System.out.println("YES");
		} else {
		System.out.println("NO");
			}
	}
}
  • 此程序运行的结果为“NO”,原因是使用“==”判断的是两个引用是否同一。
public class Tester2 {
	public static void main(String args[]) {
		BankAccount a = new BankAccount("Bob", 123456, 100.00f, Grade.General);
		BankAccount b = a;
		if (a == b) {
		System.out.println("YES");
		} else {
		System.out.println("NO");
		}
	}
}
  • a与b指向的是同一个对象,a与b同一。输出结果为“YES”

equals 方法

由于Object是类层次结构中的树根节点,因此所有其他类都继承了
equals()方法

equals()方法是像方法名表达的意思那样,判断两个对象相等吗?

  • Object类中的equals()方法的定义如下:
public boolean equals(Object x){
    return this==x;
}
  • 也是判断两个引用对象是否同一
public class EqualsTest{
public static void main(String args[]){
BankAccount a = new BankAccount("Bob", 123456, 100.00f); 
BankAccount b = new BankAccount("Bob", 123456, 100.00f); 
if (a.equals(b))
System.out.println("YES"); 
else 
System.out.println("NO");
}
}
  • 由于两个引用不是指向同一对象,运行结果仍然是“NO”

覆盖equlas方法

  • 要判断两个对象各个属性域的值是否相同,则不能使用从Object类继承来的equals方法,而需要在类声明中对equals方法进行覆盖。

  • 例如:String类中已经覆盖了Object类的equals方法,可以判别两个字符串是否内容相等。

  • 方法原型必须与Object类中的equals方法完全相同。

  • 在BankAccount类中覆盖equals方法

public boolean equals(Object x) { 
	if (this.getClass() != x.getClass()) 
	return false;      
	BankAccount b = (BankAccount) x;     
	return ((this.getOwnerName().equals(b.getOwnerName())) &&(this.getAccountNumber() == b.getAccountNumber())&&(this.getBalance() == b.getBalance())); 
}
public class Apple { 
	private String color; 
	private boolean ripe;  
	public Apple(String aColor, boolean isRipe) { 
		color = aColor; 
		ripe = isRipe; 
	}      
	public void setColor(String aColor) { color = aColor;  }      
	public void setRipe(boolean isRipe) { ripe = isRipe; }     
	public String getColor() { return color; }     
	public boolean getRipe() { return ripe; }
	public String toString() { 
	if (ripe)  return("A ripe " + color + " apple"); 
	else  return("A not so ripe " + color + " apple"); 
	} 
    public boolean equals(Object obj) { 
	if (obj instanceof Apple) { 
		Apple a = (Apple) obj; 
		return (color.equals(a.getColor()) && (ripe == a.getRipe())); 
	} 
	return false; 
	}
}

hashCode方法

  • hashCode是一个返回对象散列码的方法,该方法实现的一般规定是:
  • 在一个Java程序的一次执行过程中,如果对象“相等比较”所使用的信息没有被修改的话,同一对象执行hashCode方法每次都应返回同一个整数。在不同的执行中,对象的
    hashCode方法返回值不必一致。
  • 如果依照equals方法两个对象是相等的,则在这两个对象上调用hashCode方法应该返回同样的整数结果。
  • 如果依据equals方法两个对象不相等,并不要求在这两个对象上调用hashCode方法返回值不同。
  • 只要实现得合理,Object类定义的hashCode方法为不同对象返回不同的整数。一个典型的实现是,将对象的内部地址转换为整数返回,但是Java语言并不要求必须这样实现。

clone方法

  • 用于根据已存在的对象构造一个新的对象,也就是复制对象。

  • 使用clone方法复制对象

  • 覆盖clone方法:在Object 类中被定义为protected,所以需要覆盖为public。

  • 实现Cloneable 接口,赋予一个对象被克隆的能力(cloneability)

    class MyObject implements Cloneable 
    {  //…
    }
    

fianlize方法

  • 在对象被垃圾回收器回收之前,系统自动调用对象的finalize方法。
  • 如果要覆盖finalize方法,覆盖方法的最后必须调用super.finalize

getClass方法

  • 通过getClass方法可以获得一个对象所属类的信息

  • final 方法,返回一个Class对象,用来代表对象所属的类。

  • 通过Class 对象,可以查询类的各种信息:比如名字、超类、实现接口的名字等。

    void PrintClassName(Object obj) {
    System.out.println("The Object's class is " + obj.getClass().getName());
    }
    

notify、notifyAll、wait方法

  • final方法,不能覆盖
  • 这三个方法主要用在多线程程序中
发布了9 篇原创文章 · 获赞 4 · 访问量 266

猜你喜欢

转载自blog.csdn.net/weixin_43414889/article/details/105660579