写点什么

Java 多态实现原理,分布式系统中 ACID 和 CAP 有什么区别

发布于: 3 小时前

如有类定义?Person, Girl, Boy


class Person {    public String toString() {        return "I'm a person.";    }    public void eat() {    }    public void speak() {    }}
class Boy extends Person { public String toString() { return "I'm a boy"; } public void speak() { } public void fight() { }}
class Girl extends Person { public String toString() { return "I'm a girl"; } public void speak() { } public void sing() { }}
复制代码


当这三个类被载入到?Java?虚拟机之后,方法区中就包含了各自的类的信息。Girl?和?Boy?在方法区中的方法表可表示如下:



可以看到,Girl?和?Boy?的方法表包含继承自 Object 的方法,继承自直接父类 Person 的方法及各自新定义的方法。注意方法表条目指向的具体的方法地址,如?Girl?继承自?Object?的方法中,只有?toString()?指向自己的实现(Girl?的方法代码),其余皆指向?Object?的方法代码;其继承自于?Person?的方法?eat()?和?speak()?分别指向?Person?的方法实现和本身的实现。


如果子类改写了父类的方法,那么子类和父类的那些同名的方法共享一个方法表项。


因此,方法表的偏移量总是固定的。所有继承父类的子类的方法表中,其父类所定义的方法的偏移量也总是一个定值。Person?或?Object 中的任意一个方法,在它们的方法表和其子类?Girl?和?Boy?的方法表中的位置 (index) 是一样的。这样?JVM?在调用实例方法其实只需要指定调用方法表中的第几个方法即可。


如调用如下:


class Party {    void happyHour() {        Person girl = new Girl();        girl.speak();    }}
复制代码


当编译?Party?类的时候,生成?girl.speak()的方法调用假设为:????Invokevirtual #12


设该调用代码对应着?girl.speak(); #12?是?Party?类的常量池的索引。JVM?执行该调用指令的过程如下所示:



(这里有个错误,上图为 ClassReference 常量池而非 Party 的常量池)【再次拓展】


常量池在逻辑上可以分成多个表,每个表包含一类的常量信息,本文只探讨对于 Java 调用相关的常量池表。


CONSTATNT_Method_info**:**类方法引用表;包含引用的任何类型方法的描述信息,主要包括类信息索引和名字类型索引。


CONSTATNT_Class_info**:**类信息表;包含任何被引用的类或接口的 ‘符号引用’ ,每一个条目主要包含一个索引,指向<u style="box-sizing: inherit;">CONSTA_Utf8_info</u>表,表示该类或接口的全限定名。


CONSTATNT_NameAndType_info:名字类型表;包含引用的任意方法或字段的名称和描述符信息在字符串常量中的索引。


CONSTATNT_Utf8_info:字符串常量表; 该表包含该类所使用的所有字符串常量,比如代码中的字符串引用、引用的类名、方法的名字、其他引用的类与方法的字符串描述等等。其余常量池表中所涉及到的任何常量字符串都被索引至该表。


可以看到,给定任意一个方法的索引,在常量池中找到对应的条目后,可以得到该方法的类索引(classindex)和名字类型索引 (nameandtypeindex), 进而得到该方法所属的类型信息和名称及描述符信息(参数,返回值等)——从而通过对方法的类型信息和名称及描述符信息(参数,返回值等)来确定具体是调用哪一个方法。


JVM 执行??<u style="box-sizing: inherit;">Invokevirtual #12</u>?指令的过程:


(1)在常量池中找到方法调用的符号引用。?JVM 首先查看 Party(应为 ClassReference 常量池) 的常量池索引为 12 的条目 (此条目即指 -?查看常量池中的 CONSTATNT_Method_info 表,即类方法引用表),再 进一步查看常量池中的(CONSTANTClassinfo,CONSTANTNameAndTypeinfo ,CONSTANTUtf8info)?三个表。

最后

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的 Redis 使用者都是一份非常完美的教程了。



快速入手通道:(戳这里,免费下载)诚意满满!!!


整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~


你的支持,我的动力;祝各位前程似锦,offer 不断!!!

用户头像

VX:vip204888 领取资料 2021.07.29 加入

还未添加个人简介

评论

发布
暂无评论
Java多态实现原理,分布式系统中ACID和CAP有什么区别