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方法,不能覆盖
  • 这三个方法主要用在多线程程序中
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java ,所有的父都是 java.lang.Object 。 在 Java Object 是所有的根,它是所有祖先,并且是所有的父。所有其他都是从 Object 派生的。 举个例子,如果你定义了一个,例如 MyClass,那么 MyClass 的父就是 Object,并且 MyClass 就是 Object 的子。这意味着 MyClass 继承了 Object 的所有属性和方法。 例如,Object 有一个 toString() 方法,它返回对象的字符串表示形式。如果你定义了一个 MyClass,并且希望使用 toString() 方法来输出 MyClass 的实例,你就可以在 MyClass 重写 toString() 方法,从而使用自定义的表示形式输出 MyClass 的实例。 总之,所有 Java 的父都是 java.lang.Object 。 ### 回答2: 在Java,所有的父ObjectObjectJava所有的根,即所有的终极父。无论是Java的内置还是我们自定义的,它们都直接或间接地继承自ObjectObjectJava的基础库的一部分,它提供了一些通用的方法来处理对象,这些方法包括: 1. equals()方法:用于判断两个对象是否相等。 2. hashCode()方法:用于获取对象的哈希码。 3. toString()方法:用于返回对象的字符串表示。 4. getClass()方法:用于获取对象的运行时。 5. wait()、notify()和notifyAll()方法:用于实现线程之间的等待和通知机制等。 由于所有都继承自Object,因此所有都可以使用这些方法。此外,Object还提供了一些其他的方法,如clone()方法、finalize()方法等。 使用Object作为所有的父,可以使得我们在编写代码时更加方便灵活。例如,当我们需要传递一个对象型的参数时,可以统一使用Object型,以适应各种型的对象。同时,Object还提供了一些通用的方法,能够满足一些基本的需求。当然,如果我们需要更多的功能和特性,可以通过自定义来扩展Object,以满足具体的需求。总而言之,ObjectJava扮演着至关重要的角色,是所有的根基。 ### 回答3: 在Java,所有的父是`Object`。`Object`Java语言的顶级,即所有的终极父。由于所有都直接或间接地继承自`Object`,因此在所有的Java程序,我们都可以调用`Object`定义的共有方法。 `Object`包含了一些常用的方法,包括`equals()`用于比较对象是否相等,`hashCode()`用于获取对象的哈希值,`toString()`用于返回对象的字符串表示等,这些方法在所有都可以直接使用。 由于所有都继承自`Object`,因此我们可以在任何一个的定义使用`super`关键字来引用`Object`的成员或调用`Object`的方法。此外,如果我们在自定义的没有显式地声明一个父,那么默认情况下这个都会隐式地继承自`Object`。 总之,在 Java,所有的父都是`Object`,它提供了每个都可以使用的常用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值