Object所包含的方法如下:

① public Object();

构造函数: 大部分情况下,类对象的声明,都是通过构造函数完成的(Java中规定:在类定义过程中,对于未定义构造函数的类,默认会有一个无参数的构造函数), 并不是所有类构造方法都是public。

② private static native void registerNatives();

作用:RegisterNatives方法是JNI环境提供的,用于注册Java需要调用的Native方法 。

以下为RegisterNatives对应C语言的源码:

① JNINativeMethod包含三个元素: 方法名, 方法签名, native函数指针。

② sizeof:c语言中用来求字节运算符,用来求一个对象(类型,变量,……)所占的内存大小(以字节为单位)。

③ native:修饰的方法并非Java完成,通过C/C++去完成,并编译成.dll文件,由Java进行调用。native修饰,则表示操作系统需提供此方法的实现,并交给Java使用。

④ registerNatives:此方法主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。

③ protected native Object clone() throws CloneNotSupportedException;

① 主要作用:克隆,方法返回引用,指向clone出来的对象,此对象与原对象分别占用不同的堆空间。

② 子类必须实现Cloneable 接口,否则重写clone方法的子类同样会抛出CloneNotSupportedException异常,以指示无法复制某个实例。

③ 软件设计模式中原型模式原理就是克隆,具体类实现接口中的clone()方法,并由调用者调用具体类的clone()方法进行克隆,为原型模式。

原型模式具备三项:实现了Cloneable的接口、父类、或者具体类本身,具体类实现接口或父类中的clone()方法,调用类调用具体类的clone()方法进行克隆。

原型模式的应用场景:① 当对象之间相同或者相似。② 当对象中含有大量属性,并且其中大部分属性相似,只有某几个属性有区别时。

④ public final native Class> getClass();

① 同样为native方法,返回的是此Object对象的类对象/运行时类对象Class>,效果与Object.class相同。

② 原理:用到了java的反射机制。(后续博客详细讲解)

⑤ public boolean equals(Object obj);

==和equals的区别(主要指String类型对象,其他对象描述不准)

① == 表示的是变量值完全相同(对于基本类型,存储的是值,对于引用类型,存储的是指向堆的地址)。

② equals 表示的是对象的内容完全相同,此处的内容多指对象的特征/属性。

以下为Object类的equals实现方法

① Object类中的equals方法内部使用的标尺是==,但是对于不同的引用类型,可能判断的标尺并非是==,那么则需要重写equals方法来改变衡量相同的标尺,否则会继承父类的equals,如果父类也未重写此方法,逐级查找,直至Object基类。

⑥ public native int hashCode();

①hashCode()会返回一个int的整数值。

② 如果两个对象相等(依据:调用equals()方法),那么这两个对象调用hashCode()返回的哈希码也必须相等。

③ 由②可推理出:两个对象相等,则equals相等,则hashCode相等。反之,当hashcode不相等,则equals不相等,对象也不相等。

④ 由②和③可推理出:如果重写了equals()方法,则必须重写hashCode()方法,要保持逻辑的一致性。

⑤ hash取模:求哈希简单的做法是先求取出键值的hashcode,然后在将hashcode得到的int值对数组长度进行(%)取模,为了考虑性能,Java总采用按位与操作实现取模操作。

JNI学习笔记(可参考以下博客内容):

C语言和Java的互调原理(可参考以下博客内容):

native关键字(可参考以下博客内容):

Object总结篇(可参考以下博客内容):

HashCode的作用(可参考以下博客内容):

Hash散列图:

hashCode含义:是散列的意思(就是把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值)。

hashCode作用:hashCode主要作用是提高查找的效率(通过取模判定存取位置)

HashCode关键点:

①HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址。

② 如果两个对象equals相等,那么这两个对象的HashCode一定也相同。

③ 如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写

④ 如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

针对散列值的关键结论:

① 如果散列表中存在和散列原始输入K相等的记录,那么K必定在f(K)的存储位置上

② 不同关键字经过散列算法变换后可能得到同一个散列地址,这种现象称为碰撞

③ 如果两个Hash值不同(前提是同一Hash算法),那么这两个Hash值对应的原始输入必定不同

hash取模(实例):

① 取模含义(hashCode值%数组长度)

② 计算一个数与2的N次幂取模:X % 2^n = X & (2^n - 1) ,参考知识点,为二进制的移码和按位与操作。

示例:可参考Integer类中的formatUnsignedInt()方法,就是通过按位与(&)代替取余(%),digits[val & mask] = digits[val % radix]。

③ 位运算(&)效率要比代替取模运算(%)高很多,主要原因是位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

java类加载机制和反射机制(可参考以下博客内容):

① 加载机制:把java文件编译为Class文件

② 反射机制:通过class文件获取类方法和属性

类加载的过程:加载--> 链接 (检验 --> 准备 --> 解析) -->初始化

准备与初始化的区别:

例如 private static int a = 10;

准备阶段:给a分配内存,因为a是int类型,所以赋初始值为0。

初始化阶段:a会被赋值为10。

Class.forName和反射机制的区别:

Class.forName()方法底层同样是调用类加载,唯一的区别是调用loadClass(String name, boolean resolve(是否解析))方法时传递的第二个布尔参数的值。

Class.forName()第二个参数为true,类加载第二个参数为false,为true时会调用链接,执行静态代码块,false则不会。

所以Class.forName()方法是加载并解析,类加载器是只加载不解析,当调用newInstance()是才进行解析并执行静态代码块。

new与newInstance的区别:

newInstance只能调用无参构造函数。

new则可以调用任意参数的构造函数。

ClassLoader的分析和使用(可参考以下博客内容):

深入理解Java类加载器(1):Java类加载原理解析:

ClassLoader详解:

Java自带三大类加载器:

①BootstrapClassLoader  加载Jar包路径:System.getProperty("sun.boot.class.path")

②ExtClassLoader  加载Jar包路径:System.getProperty("java.ext.dirs")

③AppClassLoader  加载Jar包路径:System.getProperty("java.class.path")

④ OS操作系统位数:System.getProperty("os.arch");

⑤ java系统库路径:System.getProperty("java.library.path")

⑥ AppClassLoader → ExtClassLoader → BootstrapClassLoader (继承关系,从左向右)

ClassLoader继承关系图:

ClassLoader加载机制:

① 全盘负责:除非显式用其他的ClassLoader加载,否则此ClassLoader负责此类及此类所依赖引用的类的载入。

② 双亲委派:Java推荐的加载机制,并不强制;继承java.lang.ClassLoader实现自定义ClassLoader类加载器,如需保持双亲委派原则,重写findClass(name)方法即可,不需保持,则重写loadClass(name)方法即可。

③ 缓存机制:缓存机制会保证所有加载过的Class都会被缓存起来,当程序需要使用某个Class时,类加载器先从缓存区中搜索,缓存区不存在该Class对象时,系统会读取该类的二进制数据,来生成Class对象并放入缓存区。

注意:修改Class后,必须重启JVM,程序做的修改才可以生效,原因就是缓存机制。

双亲委派原理:

① 判断源ClassLoader是否加载此Class,是则返回class,否则由子到父,逐级递归操作,直至BootstrapClassLoader;

② BootstrapClassLoader如未加载过此Class,则需寻找Class字节码文件并载入,成功返回class,失败由父到子,逐级递归操作,直至源ClassLoader,如ClassLoader加载失败,则抛出ClassNotFindException异常。

ClassLoader相关面试题(可参考以下博客内容):

① 自己声明的类的包路径,不可以用java开头,原因是在ClassLoader类的preDinfeClass方法内部做了限制,并且外层调用此方法的defineClass方法声明为final(不可被重写)。

java.lang.object源码_第三篇:java.lang.Object 类源码分析相关推荐

  1. <Android开发> Android vold - 第三篇 vold 的NetLinkManager类简介

    本系列主要介绍 Android vold,分为以下篇章 <Android开发> Android vold - 第一篇 vold前言简介 <Android开发> Android ...

  2. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...

    适使用范围:  安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境:  Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...

  3. java 修改字节码_使用JBE(Java Bytecode Editor)修改Java字节码

    JBE JBE(Java Bytecode Editor)是一个Java字节码编辑工具,而且是开源的,该项目是基于jclasslib ej-technologies(https://github.co ...

  4. 南邮java大作业实验报告_南京邮电大学java第三次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...

  5. spark-sql建表语句限制_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  6. hive编程指南_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  7. hive编程指南电子版_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  8. java 工作3年水平_有着4年java工作经验,应该达到什么样的水平?

    四年Java工作经验已经不短了,应该要有比较高的技术水准. 1.集合 几乎是面试必问的内容,问的基本是底层实现原理,实现类的优缺点. 2.设计模式 23种设计模式中重点研究常用的十来种就可以了,面试中 ...

  9. java项目不要用反射_面试官:Java 反射是什么?我回答不上来!

    一.概念 反射就是把Java的各种成分映射成相应的Java类. Class类的构造方法是private,由JVM创建. 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检 ...

最新文章

  1. R语言可视化学习笔记之ggridges包
  2. 决战春招!算法工程师面试问题及资料超详细合集(算法岗面经/代码实战/网课/竞赛等)...
  3. 为 protocol 中属性添加默认值
  4. 掌握 Ajax,第 8 部分: 在请求和响应中使用 XML
  5. 设计模式在vue中的应用(五)
  6. SQL和PL/SQL的性能优化之四---联结与子查询
  7. CentOS Squid
  8. 基于matlab的局放仿真,基于MATLAB/Simulink系统仿真权威指南
  9. matplotlib的基本使用1
  10. (转)JAVA正则表达式语法大全
  11. opencv学习(part1)--OpenCv框架介绍
  12. 控制SAP Spartacus shipping address页面spinner显示的逻辑
  13. c语言-指针的本质和使用
  14. xp系统的WINS服务器设置,WindowsXP系统设置
  15. 【语音播放】基于matlab GUI MP3设计【含Matlab源码 425期】
  16. 商城app源码_多商户商城源码系统有什么优势呢?
  17. SOLIDWORKS参数化设计方式几多种,你都用恰当了吗?
  18. 【巨杉数据库SequoiaDB】限额开放!巨杉数据库中级工程师认证计划正式开启!
  19. 社交电商难定义,蘑菇街、小红书、拼多多注定要兵分三路?
  20. 菜鸟入门_Python_机器学习(1)_线性可分的双月实验

热门文章

  1. sql 查询手动创建的表_学习SQL:使用SQL查询手动创建报告
  2. WeixinJSBridge目前还能够直接使用的功能(2019)
  3. 第一个自动化运维程序
  4. 实现Runnable接口和继承Thread类之间的区别
  5. 前端urldecode 特殊字符处理导致后端无法解析
  6. 网络带宽与实际上传下载速度之间关系
  7. background:url(./images.png) no-repeat 0 center的用法
  8. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)
  9. javascript forEach方法
  10. 一款可以安利的MarkDown编辑器