动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

Object 类的方法及解析

07-21 17:54 190浏览
举报 T字号
  • 大字
  • 中字
  • 小字

细心的你也许会发现在 Java API 文档中写着「类 Object 是类层次结构的根类。每个类都使用 Object 作为超类,所有对象(包括数组)都实现这个类的方法。这句话说明,Object 类是 Java 的根类,所以类都直接或间接继承于根类;允许把任何类型的对象赋值给 Object 型变量;当一个类没有显式继承父类时,系统会默认继承于 Object 类;因为 Java 所有类都是 Object 类的子类,所以任何 Java 对象都可以调用 Object 类的方法

Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。可以使用类型为Object的变量指向任意类型的对象。Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入;那么 Object 类的方法有哪些呢?让我们拭目以待:

1.clone方法

保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。

2.getClass方法

final方法,获得运行时类型。getClass()方法是用来获取运行时的对象; 当声明对象和.class文件中真正的对象不一致时, 该方法会返回.class中的对象。该方法主要用于JAVA的反射机制。

public final native Class getClass();

final: 说明getClass()是不能被子类重写;

不能被重写是为了保证一个子类有多重继承关系时, 其调用getClass()方法与其父类调用getClass()方法的表现是一致的, 这也是实现JAVA反射的保证;

举个例子, A extends B; 如果B重写了getClass()方法, 返回的Class是B; 当A调用时, A没有重写getClass(), 返回也会是B, 而不是真正的实例A; 这明显与getClass()方法的预期不符, 也会造成使用JAVA反射获取实例时, 获取到的是B实例而不是A实例;

为了防止这种很差的实现, 所以getClass()声明成了final;

3.toString方法

该方法用得比较多,一般子类都有覆盖toString方法是我们比较常用的方法, 在Object中的默认实现返回一个 类名+'@'+hasCode的16进制拼接的字符串;我们调用System.out.println(obj), 默认调用的就是obj的toString方法

4.finalize方法

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

java的内存管理依赖于JVM实现的GC(Garbage Collection)机制来实现内存的回收, GC相关的内容后面再展开; JVM在进行GC时, 如果这个对象需要被回收, 会先判断该方法是否有被重写, 若未重写, 则直接回收该对象内存空间;

反之则判断该对象的finalize是否被执行过, 如果没有执行过, 会先放入一个队列中, 由低优先级的线程去执行该对象的finalize方法, 执行完毕后再判断该对象是否需要回收;

 

如果该对象已经执行过一遍finalize方法了, 直接回收对象的内存空间;

5.equals方法

该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。equals()的作用是比较两个对象是否相等; 默认是实现是比较引用是否相同, 即是否为同一个内存对象;

6.hashCode方法

该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。

7.wait方法

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

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

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

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

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

4)时间间隔到了。

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

8.notify方法

该方法唤醒在该对象上等待的某个线程。线程A在同步代码块中调用该方法时, 会随机地唤醒一个等待在该对象锁上的线程B, 注意这时候唤醒的线程B还没有持有锁, 必须要等到线程A释放锁后才能持有该把锁;当线程在A对象的同步代码块中执行B对象的notify时, 会抛出IllegalMonitorStateException

9.notifyAll方法

该方法唤醒在该对象上等待的所有线程。线程A在同步代码块中调用该方法时, 会唤醒所有等待在该锁上的线程, 同样的, 这些唤醒的线程只有在线程A释放锁以后, 才能再次竞争该把锁, 竞争到锁的线程继续执行, 其他的线程继续等待;如果调用的线程不是该把锁的持有者, 那么也会抛出IllegalMonitorStateException

java中每新增一个类, 他的父类都是Object类。因此,想要学好java中的类,Object类是不可或缺的关键。如果自学有困难的同学,可以跟着我们的专业老师讲解的专业课程进行学习,不仅可以大幅度提高学习效率,避免孤军奋战,还可以携手名师,共同进步!

0人推荐
共同学习,写下你的评论
0条评论
代码小兵1280
程序员代码小兵1280

11篇文章贡献54542字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消