一、java基础--基础类(1)Object类

一、概念

Object是所有类的父类,任何类都默认继承Object

由于所有的类都继承在Object类,因此省略了extends Object关键字。

二、Object类中的方法

toString()

getClass()   final

equals()

clone()

finalize()

hashCode()

notify()        final

notifyAll()    final

wait()          final

1.toString()方法

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。该方法用得比较多,一般子类都有覆盖。

//object中的原方法
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

//测试
public class Test1 {  
    public static void main(String[] args){  
        Object o1 = new Object();  
        System.out.println(o1.toString());  
    }  
}

 结果:java.lang.Object@7852e922

2.getClass()方法

public final native Class<?> getClass();

返回次Object的运行时类类型。

不可重写,要调用的话,一般和getName()联合使用,如getClass().getName();

3.equals()方法

public boolean equals(Object obj) {
        return (this == obj);
    }

Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,

所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的hi同一块内存对象,则返回true,如果this和obj指向的不是同一块内存,则返回false。

注意:即便是内容完全相等的两块不同的内存对象,也返回false。

          如果是同一块内存,则object中的equals方法返回true,如果是不同的内存,则返回false

          如果希望不同内存但相同内容的两个对象equals时返回true,则我们需要重写父类的equals方法

          String类已经重写了object中的equals方法(这样就是比较内容是否相等了)

4.clone()方法

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

主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法(实现深复制)。

 创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。

4.1clone与copy的区别

copy

User user1 = new User('小明',20); 

user2 = user1;

user1和user2都指向内存中同一个object, user1或user2的每一个操作都可能影响到对方

clone

User user2 = user1.clone()

这时会生成一个新的User对象,并且和user1具有相同的属性值和方法。

4.2Shallow Clone与Deep Clone

Clone是如何完成的呢?Object在对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是Shallow Clone。这样,问题就来了咯。

以User为例,它里面有一个域Boss不是基本数据类型的变量,而是一个reference变量,经过Clone之后就会产生一个新的Boss型的reference,它和原始对象中对应的域指向同一个Boss对象,这样克隆类就和原始类共享了一部分信息,而这样显然是不利的

这个时候我们就需要进行deep Clone了,对那些非基本型别的域进行特殊的处理,例如本例中的Boss。我们可以重新定义Clone方法,对boss做特殊处理

4.3clone方法的保护机制

在Object中Clone()是被声明为protected的,这样做是有一定的道理的,以User类为例,通过声明为protected,就可以保证只有User类里面才能“克隆”User对象

5.finalize()方法

该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

Java允许在类中定义一个名为finalize()的方法。它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

关于垃圾回收,有三点需要记住:

  1、对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。

  2、垃圾回收并不等于“析构”。

  3、垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。

finalize()的用途:

  无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。

  不过这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。

6.hashCode()方法

散列码(hashCode)是按照一定的算法由对象得到的一个数值,散列码没有规律。如果 x 和 y 是不同的对象,x.hashCode() 与 y.hashCode() 基本上不会相同。
hashCode() 方法主要用来在集合中实现快速查找等操作,也可以用于对象的比较。

简单的说,如果两个对象相同,那么它们的hashCode值一定相同;如果两个对象的hashCode值相同,它们并不一定相同。在Java规范里面规定,一般是重写equals()方法应该连带着重写hashCode()方法。

7.notify()方法

该方法唤醒在该对象上等待的某个线程。

8.notifyAll方法

该方法唤醒在该对象上等待的所有线程。

9.wait()方法

wait()

wait(long timeout)

wait(long timeout,int naos)

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

 

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

(1)其他线程调用了该对象的notify方法。

(2)其他线程调用了该对象的notifyAll方法。

(3)其他线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

 

参考文章:

https://www.cnblogs.com/zhangyinhua/p/7715486.html#_label1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值