一、java.lang.object的实现方法有哪些
Java.lang.object类中有几个方法不是final的,我们会经常用重写它们,
protected Object clone()创建并返回此对象的一个副本。
boolean equals(Object obj)指示某个其他对象是否与此对象“相等”。
protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
int hashCode()返回该对象的哈希码值。
String toString()返回该对象的字符串表示。
1、clone()
我们为什么要用clone()?
当我们需要一个与某个对像时一模一样的对像时,但它们又是相互独立的,对它们各自的操作不会影响到另外的一个,这时候用clone()就可以
实现,当然,其他的方法也可以实现,但是重写clone()简单,高效
有一个不没重写clone()的例子,能帮助我们更好的去理解clone(),如下:
public class Test
{
public static void main(String[] args){
A a1=new A();
A a2=new A();
a1.name="a1";
a2=a1;
a2.name="a2";
System.out.println("a1.name="+a1.name);
System.out.println("a2.name="+a2.name);
}
}
class A
{
public String name;
}
输出结果为:a1.name=a2;
a2.name=a2;
下面这个是重写了clone()的例子
public class Test
{
public static void main(String[] args) throws CloneNotSupportedException{
A a1=new A();
A a2=new A();
a1.name="a1";
a2=(A) a1.clone();
a2.name="a2";
System.out.println("a1.name="+a1.name);
System.out.println("a2.name="+a2.name);
}
二、Java语言中Object类定义了哪11种方法
Java中所有类(包括用户自己定义的类)都自动继承Object类,即Object类是所有类的父类。
Object中常用方法:
public boolean equals(Object obj)
比较当前对象与obj是否为同一对象,返回值:ture/false
public String toString()
返回当前对象的字符串表达形式
public native int hashCode();
返回对象的Hash码。Hash码是标志对象的唯一值,Hash码相同的对象是同一对象
protected void finalize()throws Throwable
对象销毁时被调用
以下三个函数用于控制线程
public final native void notify();public final native void notifyAll();public final native void wait();
native型方法指由C++语言编写的方法,Java解释器对其进行转义后才执行。
“==”与equals()
"=="一般用于基本数据类型比较。若用作两个引用对象比较,仅当引用变量引用同一个对象时,才返回true,否则false。
void EqualCompare()
{
String s1= new String("Hello");
String s2= new String("Hello");
String s3="Hello";
String s4="Hello";
//未使用new,s4引用既存的对象(编译器创建对象之前先进行检测"Hello"是否已经存在,若存在,则返回原对象的引用)
System.out.println(s1.equals(s2));//truex1行
System.out.println(s1==s2);// false两变量引用不同对象
System.out.println(s3.equals(s4));//true两变量引用相同对象
System.out.println(s3==s4);// true两变量引用相同对象
}
比较对象时,一般用equal()方法。
Object类方法定义:public boolean equals(Object obj){ return(this== obj);}
不同的类可方便的对该对象进行覆盖。String类就覆盖了Object类的equals()方法,所以x1行输出true.
a==b如果a,b引用同一对象,则返回true;
a.equals(b)如果a对象内容和b对象内容相同,则返回true
如果未重载equals()方法的类对象使用该方法与另一个对象进行比较,则调用Object的equals()方法,仍然是对象的比较,返回值为false。
三、java.lang.object的补充
Java语言规范要求equals方法具有下面的特点:
自反性:对于任何非空引用值 x,x.equals(x)都应返回 true。
对称性:对于任何非空引用值 x和 y,当且仅当 y.equals(x)返回 true时,x.equals(y)才应返回 true。
传递性:对于任何非空引用值 x、y和 z,如果 x.equals(y)返回 true,并且 y.equals(z)返回 true,那么 x.equals(z)应返回 true。
一致性:对于任何非空引用值 x和 y,多次调用 x.equals(y)始终返回 true或始终返回 false,前提是对象上 equals比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null)都应返回 false。
从这里看出,上面的例子是Java规范的equals方法的标准实现,推荐用上面例子的写法实现类的equals方法。
四、java.lang.object的方法使用说明
1、equals()方法:用于测试某个对象是否同另一个对象相等。它在Object类中的实现是判断两个对象是否指向同一块内存区域。这种测试用处不大,因为即使内容相同的对象,内存区域也是不同的。如果想测试对象是否相等,就需要覆盖此方法,进行更有意义的比较。例如
class Employee{
...//此例子来自《java核心技术》卷一
public boolean equals(Object otherObj){
//快速测试是否是同一个对象
if(this== otherObj) return true;
//如果显式参数为null,必须返回false
if(otherObj== null) reutrn false;
//如果类不匹配,就不可能相等
if(getClass()!= otherObj.getClass()) return false;
//现在已经知道otherObj是个非空的Employee对象
Employee other=(Employee)otherObj;
//测试所有的字段是否相等
return name.equals(otherName)
&& salary== other.salary
&& hireDay.equals(other.hireDay);
}
}
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!