文章目录
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方法,不能覆盖
- 这三个方法主要用在多线程程序中