JAVA Object类的九大方法

java中Object类的九大方法

1.getClass

public final<?> getClass()

表示此对象的运行时类的 类对象。

public class obj {
    public static void main(String[] args) {
        Person p = new Person("test");
        System.out.println(p.getClass());
    }
}

运行结果:class Person
通过getClass方法可以获得一个类的class,进而通过返回的Class对象获取Person的相关信息,比如:获取Person的构造方法,方法,属性有哪些等等信息。

2.clone

protected Object clone()
                throws CloneNotSupportedException

保护方法,实现对象的浅复制(对应有深复制),只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

public class CloneSample implements Cloneable{

    private int i;

    public static void main(String[] args){
        CloneSample sample = new CloneSample(10);
        System.out.println("i: " + sample.i);
        CloneSample sampleCopy = (CloneSample) sample.clone();
        sampleCopy.i++;
        System.out.println("copy i: " + sampleCopy.i);
        System.out.println("i: " + sample.i);
    }


    public CloneSample(int i) {
        this.i = i;
    }

    //重写clone
    @Override
    public Object clone(){
        Object o = null;
        try {
            o = super.clone();   //调用父类的clone
        } catch (CloneNotSupportedException e) {    //异常捕获
            e.printStackTrace();
        }
        return o;
    }

}

运行结果:

i: 10
copy i: 11
i: 10

3.toString

public String toString()

返回该对象的字符串表示

public class obj {
    public static void main(String[] args) {
        Person p = new Person("test");
        System.out.println(p.toString());
    }
}

结果:Person@73a28541

当toString没有被重写时,返回的字符串格式是:类名@哈希值,哈希值是十六进制的。
例如一个Student类,此时没有重写toString方法,返回的字符串就是Student@1c7b0f4d。
因此在自定义的类中,如果需要打印对象的所有成员变量信息,则需要在类里重写toString()方法。在集合中,默认实现了toString方法打印集合元素。

4.finalize

protected void finalize()
                 throws Throwable

当垃圾收集确定没有对对象的引用时,由对象上的垃圾收集器调用。子类重写 finalize方法配置系统资源或执行其他清理。

public class obj {
    public static void main(String[] args) {
        Person p = new Person();
		for(int i = 0 ; i< 1000; i++){
		   p = null;	
		}		
		System.gc();
    }
}
public class Person {
    private String name;

    public Person(){

    }

    public Person(String name){
        this.name = name;
    }

    @Override
    protected void finalize() throws Throwable{
		
		System.out.println("我快死了!!!");
    }
}

结果:我快死了!!!

5.equals

public boolean equals(Object obj)

该方法是非常重要的一个方法,一般用来比较两个对象是否相等。

public class Test {
    public static void main(String args[]) {
        String Str1 = new String("runoob");
        String Str2 = Str1;
        String Str3 = new String("runoob");
        boolean retVal;

        retVal = Str1.equals( Str2 );
        System.out.println("返回值 = " + retVal );

        retVal = Str1.equals( Str3 );
        System.out.println("返回值 = " + retVal );
    }
}

结果:
返回值 = true
返回值 = true

equals方法实现了对非空对象引用的一个等价关系:

  • 它是空的自反:对于任何非空的参考价值x,x.equals(x)应该返回true。
  • 它是空的对称的:对于任何非空的参考值x和y,x.equals(y)应该返回true当且仅当y.equals(x)返回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。
这类Object equals方法实现对象上差别可能性最大的等价关系;就是说,对于任何非空的参考值x和y,此方法返回true当且仅当x和y引用同一个对象(x == y有价值true)。

请注意,它一般是必要覆盖hashCode方法重写此方法,以保持对hashCode方法的一般合同,即平等的对象必须具有相等的散列码。

6.hashCode

public int hashCode()

返回一个对象的哈希代码值。

public class Test {
        public static void main(String args[]) {
                String Str = new String("www.runoob.com");
                System.out.println("字符串的哈希码为 :" + Str.hashCode() );
        }
}

结果:字符串的哈希码为 :3556498

hashCode()的一般规则如下:
在同一个Java程序中,对一个相同的对象,无论调用多少次hashCode(),hashCode()返回的整数必须相同,因此必须保证equals()方法比较的内容不会更改。但不必在另一个相同的Java程序中也保证返回值相同。
如果两个对象用equals()方法比较的结果是相同的,那么这两个对象调用hashCode()应该返回相同的整数值。
当两个对象使用equals()方法比较的结果是不同的,hashCode()返回的整数值可以不同。然而,hashCode()的返回值不同可以提高哈希表的性能。

7.wait

wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,当前线程被唤醒(进入“就绪状态”)。

wait(long timeout)让当前线程处于“等待(阻塞)状态”,直到其他线程调用此对象的notify()方法或 notifyAll() 方法,或者超过指定的时间量,当前线程被唤醒(进入“就绪状态”)。
调用该方法后当前线程进入睡眠状态,直到以下事件发生:
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

8.notify

public final void notify()

唤醒一个在这个对象的监视器上等待的单个线程。如果任何线程都在等待这个对象,其中一个被选择被唤醒。选择是任意的,发生在执行的自由裁量权。一个线程等待一个对象的监控通过调用其中的 wait方法。

9.notifyAll

public final void notifyAll()

唤醒正在等待此对象监视器上的所有线程。一个线程等待一个对象的监控通过调用其中的 wait方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值