Java基础1----Object类解析

jackion5 2018-08-09 原文

Java基础1—-Object类解析

1.Object简介

众所周知,Object类是Java所有类的万类之源,所有Java类都是继承之Object类,而默认就直接忽略了extends Object这段代码。

2.Object类的源码

话不多说,源码先贴为敬,源码如下:

 1 package java.lang;
 2 
 3 public class Object {
 4     //本地方法,通过JNI调用
 5     private static native void registerNatives();
 6     static {//对象初始化时调用
 7         registerNatives();
 8     }
 9     //返回object在运行时的类对象
10     public final native Class<?> getClass();
11     //获取object对象的hashcode
12     public native int hashCode();
13     //比较对象的内存地址
14     public boolean equals(Object obj) {
15         return (this == obj);
16     }
17     //本地的clone方法,用于对象的copy
18     protected native Object clone() throws CloneNotSupportedException;
19     //返回对象的字符串
20     public String toString() {
21         return getClass().getName() + "@" + Integer.toHexString(hashCode());
22     }
23 
24     //唤醒等待此对象锁的单个线程
25     public final native void notify();
26     //唤醒等待此对象锁的所有线程
27     public final native void notifyAll();
28     //放弃对象锁,等待指定时间
29     public final native void wait(long timeout) throws InterruptedException;
30 
31     public final void wait(long timeout, int nanos) throws InterruptedException {
32         if (timeout < 0) {
33             throw new IllegalArgumentException("timeout value is negative");
34         }
35 
36         if (nanos < 0 || nanos > 999999) {
37             throw new IllegalArgumentException(
38                                 "nanosecond timeout value out of range");
39         }
40 
41         if (nanos > 0) {
42             timeout++;
43         }
44 
45         wait(timeout);
46     }
47 
48 
49     public final void wait() throws InterruptedException {
50         wait(0);
51     }
52     //用于垃圾回收
53     protected void finalize() throws Throwable { }
54 }

3.Object类的方法

Object类方法如下

getClass()方法:

1 public final native Class<?> getClass();

final类型的本地方法,通过JNI调用,返回对象在运行时的Class对象,如:

User user = new User();

Class c = user.getClass();

返回的是User的Class类对象

hashCode()方法

public native int hashCode();

返回该对象的哈希值,可以重写hashCode方法,但是重写了hashCode一般也需要重写equals方法,必须满足

obj1.equals(obj2)==true,则obj1.hashCode()==obj2.hashCode();但是反过来两个对象的hashCode一直不一定两个对象equals

equals(Object obj)方法

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

Object类的equals默认和“==”比较结果一样,比较的是两个对象的内存地址是否一致,所以默认obj1.equals(obj2)=true则obj==obj2也为true;

由于比较的是内存地址,所以即使两个对象的值完全一样,返回的也是false;而我们最常用的String类由于重写了equlas方法,所以只要String的值一样就返回true,String的方法如下:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

可见String的equals方法是将字符串的每个字符挨个比较,只要每个字符都一样则返回true;

和String情况类似,Integer和Long等也重写了equals方法,如Integer的equals方法源码如下:

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

//TODO

具体需不需要重写equals,视情况而定,建议是不重写;

toString()方法

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

 

返回一个字符串,默认有对象的类名+@+对象哈希值的无符号十六进制表示,建议重写;

clone()方法

1 protected native Object clone() throws CloneNotSupportedException;

 

projected修饰的本地方法,实现了对象的浅复制,只有实现了Cloneable接口的对象才可调用此方法;

notify()方法

public final native void notify();

 

final类型的本地方法,用于唤醒在等待该对象锁的某个线程

notifyAll()方法

public final native void notifyAll();

 

final类型的本地方法,用于唤醒在等待该对象锁的全部线程

wait()方法

1 public final void wait() throws InterruptedException {
2         wait(0);
3     }

wait(long timeout)方法

1 public final native void wait(long timeout) throws InterruptedException;

 

wait(long timeout,int nanos)方法

 1  public final void wait(long timeout, int nanos) throws InterruptedException {
 2         if (timeout < 0) {
 3             throw new IllegalArgumentException("timeout value is negative");
 4         }
 5 
 6         if (nanos < 0 || nanos > 999999) {
 7             throw new IllegalArgumentException(
 8                                 "nanosecond timeout value out of range");
 9         }
10 
11         if (nanos > 0) {
12             timeout++;
13         }
14 
15         wait(timeout);
16     }

 

可以看出这三个wait方法最终都是调用了wait(long timeout)方法,这也是个final类型的本地方法;

该方法的作用是让当前线程放弃该对象的对象锁进入等待状态,前提是当前线程已经获取到了该对象的锁。一直等待直到timeout时间到或其他线程调用了该对象的notify()或notifyAll()方法;

finalize()方法

 protected void finalize() throws Throwable { }

 

用于垃圾回收时调用,详情可参看垃圾回收机制;

4.注意事项

1.Integer类和Long类都重写了equals方法,所以比较Integer类型和Long类型的值是否相同是需要使用equals方法,而不建议使用==;

而int和long由于是基本数据类型,没有equals方法,所以比较值相等必须使用==,Integer和Long则不可以,如下例子:

1     public static void main(String[] args){
2         Integer i = 200;
3         Integer j = 200;
4         System.out.println(i==j);//输出结果为:false
5     }
发表于 2018-08-09 22:14 Lucky帅小武 阅读() 评论() 编辑 收藏

 

版权声明:本文为jackion5原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jackion5/p/9451817.html

Java基础1----Object类解析的更多相关文章

  1. hashMap的四种遍历方式

    hashMap的四种遍历方式 目录 hashMap的四种遍历方式 使用entrySet返回包含entry的Se […]...

  2. java中的Arrays这个工具类你真的会用吗

    Java源码系列三-工具类Arrays ​ 今天分享java的源码的第三弹,Arrays这个工具类的源码。因为 […]...

  3. 关于Java中基类构造器的调用问题

    在《Java编程思想》第7章复用类中有这样一段话,值得深思。当子类继承了父类时,就涉及到了基类和导出类(子类) […]...

  4. 论文阅读笔记五十七:FCOS: Fully Convolutional One-Stage Object Detection(CVPR2019)

      论文原址:https://arxiv.org/abs/1904.01355 github: tinyurl […]...

  5. 记一次lombok踩坑记

    记一次lombok踩坑记 引言 今天中午正在带着耳机遨游在代码的世界里,被运营在群里@了,气冲冲的反问我最近有 […]...

  6. 万恶的NPE差点让我半个月工资没了

    万恶的NPE差点让我半个月工资没了 引言 最近看到《阿里巴巴Java开发手册》第11条规范写到: 防止 NPE […]...

  7. Java-IO流学习

    IO流学习 流的分类 根据操作单位不同分为字节流和字符流 根据流向不同分为输入流和输出流 根据角色不同分为节点 […]...

  8. 简单谈谈栈

    一、前言 计算机程序离不开算法和数据结构,数据结构这门学科就是为了让计算机能够以更加高效,简单,便捷的方式来存 […]...

随机推荐

  1. 目前国内常用的无纸化会议系统——迅控无纸化

    无纸化会议系统以帮助会议组织者极大地降低工作压力,轻松进行会议现场管控,提高与会者的开会效率为目标,同时还能节 […]...

  2. ubuntu安装QQ

    由于Wine QQ一直没更新版本导致目前版本报版本过低无法使用,暂时先上UK官网的国际版Wine QQ,虽然功 […]...

  3. python编程规范系列–建议08~18

      本系列来自《编写高质量代码 改善python程序的91个建议》的读书笔记整理。    本章主要内容 建议8 […]...

  4. scikit_learn lasso详解

    Lasso 回归 l1 正则化 The Lasso 是估计稀疏系数的线性模型。 它在一些情况下是有用的,因为它 […]...

  5. 爬虫之ssh证书警告错误

    错误信息: 错误信息如下: requests.exceptions.SSLError: ("bad hands […]...

  6. java数据库学习路线和必学知识点!

    java数据库学习路线和必学知识点! java数据库必学知识点!  分享一下数据库的学习路线和必学的知识点! […]...

  7. 选用与使用稳压二极管的介绍

    参考: http://www.hqew.com/tech/doc/482753.html   http://w […]...

  8. Java类/接口的API

    本章节收集的类/接口API有: Object类,枚举,包装类,接口Comparable,类Arrays,异常, […]...

展开目录

目录导航