所有对象的父类(java.lang.Object)
一.介绍

Object类是类层次结构的根源,每一个类都存在一个父类为Object类。所有的对象,包括数组,都实现了 Object 类的方法。
二.对象初始化

这里使用了静态代码块进行Object类的初始化,可以看到初始化调用的是一个私有的(private) 本地的(native) 静态(static)方法。Object类的静态代码块只会在第一次加载Object类的时候进行调用,且只调用一次。由于Object类是所有类的父类,所以可能是由其他类的初始化引起的Object类的初始化。从方法名 registerNatives 中可以看出该方法的作用是用来进行本地方法(native method)的注册,本地方法(native method) 一般是封装在JDK里,用 C/C++ 编写的模块,文件格式为 *.dll。
三.常用方法
1). public final native Class<?> getClass();

该方法用于返回代表当前对象的运行时的类(runtime class)的对象(Class类对象)。getClass() 返回的对象在这个运行时的类(runtime class)的静态互斥块(static synchronized) 中会被锁住。对于 Class<? extends |X|>, 在调用 getClass() 时,|X| 是会被擦除的部分,也不需要进行类型转换。jdk中给出了一个代码例子,我们自己手动写一个关于 Number 类的demo:
public static void main(String[] args) {
Number n1 = 2;
Class<? extends Number> c1 = n1.getClass();
System.out.println(c1); //class java.lang.Integer
Number n2 = 2.1;
Class<? extends Number> c2 = n2.getClass();
System.out.println(c2); //class java.lang.Double
Number n3 = 2L;
Class<? extends Number> c3 = n3.getClass();
System.out.println(c3); //class java.lang.Long
}
2). public final native int hashCode();

该方法用于返回对象的哈希值,用于哈希表(例如 java.util.HashMap、java.util.Hashtable 等) 中哈希值的计算。如果一个类作为哈希表的存储类型,一般会重写 Object 类的 hashCode() 方法。hashCode() 有以下几个特点:
- 一个相同的对象,不管在任何时候被调用多少次,hashCode() 都会返回相同的整型值,hashCode() 的返回值无法用于在 equals() 中判断对象是否变更 (对象变更后 equals() 可能不一致,hashCode() 可能保持一致)。对于不同的应用,这个哈希值不需要一致。
- 如果两个对象的 equals() 的结果为 true, 那么两个对象的 hashCode() 方法应该返回相同的值。( 面试笔试常考 )
- 如果两个对象的 equals() 的结果为 false, 两个对象的 hashCode() 不一定要返回不同的值。然而,对于不同的对象,程序编写者应该尽可能使 hashCode() 返回不同的值,从而提高哈希表的性能。 哈希表的查找效率为 O(1),减少哈希冲突可以提高查找速度,从而提高哈希表的性能。( 面试笔试常考 )
- Object 类中 hashCode() 的返回值为对象的内部存储地址,所以在没有重写 hashCode() 的情况下, 不同的对象必然会返回不同的哈希值。
3). public boolean equals(Object obj);

该方法用于判断两个对象是否相等(if one is equal to another)。 equals() 方法具有以下特点:
- 自反性( reflexive):对于任何非空的引用值 x,x.equals(x) 应该返回 true.
- 对称性( symmetric):对于任何非空的引用值 x 和 y,x.equals(y) 和 y.equals(x) 应该返回相同的结果.
- 可递性( transitive ):对于任何非空的引用值 x 、y、z,如果 x.equals(y) 和 y.equals(z) 返回 true, 那么 x.equals(z) 应该返回 true.
- 一致性( consistent ) :对于任何非空的引用值 x 和 y,多次调用 x.equals(y) 应该返回相同的值,要么为 true, 要么为 false.
- 对于任何非空的引用值 x, x.equals(null) 应该返回 false.
- Object 类中的 equals() 判断两个引用是否指向同一个对象,若指向同一个对象,则返回 true, 反之则返回 false.
- 当重写 equals() 的时候,有必要重写 hashCode(). 注意保持: equals() 为 true,则 hashCode() 返回相同的值.
4). public String toString();

该方法用于返回能代表该对象的字符串, Object 类的 toString() 方法返回该对象的类名 + 对象哈希值的十六进制表示.
所有对象的父类(java.lang.Object)的更多相关文章
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- JDK1.8源码(一)——java.lang.Object类
本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...
- JAVA源码之JDK(一)——java.lang.Object
想要深入学习JAVA,还需追本溯源,从源码学起.这是我目前的想法.如今JAVA各种开源框架涌出,很多JAVA程序员都只停留在如何熟练使用的层次.身为其中一员的我深感惭愧,所以要加快学习的脚步,开始研究 ...
- java.lang -> Object
java.lang -> Object 是什么 Object 类是类层次结构的根,是 Java 中唯一一个没有父类的类,Java 中所有对象包括数组都继承了 Object 类中的方法. 重要方法 ...
- jvm源码解读--01 jvm加载java/lang/object过程
现在做一下记录,这个看了两天,看的过程发现了很多c++的高级特性,没接触过,还得慢慢撸,禁止很慢 那么现在开始 吧 先打两个断点 java.c:351 JavaMain(void * _args) { ...
- java.lang.Object类与equals()及toString()的使用
1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...
- java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
- 关于clone(java.lang.Object)重写
1. 需要实现接口java.lang.Cloneable 2. 重写java.lang.Object的clone 3. clone访问权限扩大为public 4. 不实现(java.lang.Clon ...
- centos 解压jdk安装包方式安装jdk 出现 java/lang/NoClassDefFoundError: java/lang/Object 错误
安装完JDK ,设定环境变量后出现这个错误: [root@localhost lib]# javacError occurred during initialization of VMjava/lan ...
随机推荐
- Android:使用SparseArray取代HashMap优化性能
之前看到一篇关于adapter的文章用到了SparseArray,所以在这里写写关于SparseArray的使用方法. SparseArray是官方针对安卓所写的容器,与HashMap类似,只是性能比 ...
- java中不能使用小数点(.)来作为分隔符
split()括号里是一个String的参数,所以一定要符合这种:split(".")形式,即点'.'要用双引号""括起来"."在java中 ...
- vijos - P1302连续自然数和 (公式推导 + python)
P1302连续自然数和 Accepted 标签:[显示标签] 描写叙述 对一个给定的自然数M,求出所有的连续的自然数段(连续个数大于1).这些连续的自然数段中的所有数之和为M. 样例:1998+199 ...
- [Unity 设计模式]IOC依赖倒置
1.前言 最近在看<游戏开发与设计模式>一书,看到控制反转设计模式,作者说:上层模块不应该依赖于下层模块,上层模块和下层模块都应该依赖于接口,这样能减少耦合.然后附带举了个例子,我觉得特别 ...
- java使用poi读取word(简单,简约,直观)
java使用poi读取word(简单,简约,直观) 说明 其实poi的官网上面都是有接口和样例的,只是都是英文 例如网址:http://poi.apache.org/spreadsheet/quick ...
- XAML实例教程系列 - 类型转换器(Type Converter)七
XAML实例教程系列 - 类型转换器(Type Converter) 分类: Windows 8 Silverlight2012-06-25 13:40 961人阅读 评论(0) 收藏 举报 butt ...
- bzoj 5127 数据校验
题目大意: 一个数列a 对于 a 的一个区间 [l, r],若对于该区间 [l, r] 内的任意一个非空连续子区间,该子区间内出现过的数值在整数上值域连续,则称 [l, r]为合法区间 m次询问 每 ...
- 一、Linux文件权限与目录配置
行文结构如下: 用户和用户组 Linux文件权限概念 Linux目录配置 重点回顾 1.用户与用户组 Linux是个多用户.多任务的系统,可能有多人同时使用这台机器进行工作,为了考虑每个人的隐私和工作 ...
- P3299 [SDOI2013]保护出题人
传送门 全世界都会二分可海星-- 首先记\(sum[i]\)为\(a[i]\)的前缀和,那么第\(i\)个的答案就是\(max\{\frac{sum[i]-sum[j-1]}{x+(i-j)d}\}\ ...
- 多个@bean无法通过@resource注入对应的bean(org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found )
一.异常 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ' ...