深入浅出Java复用类【从字节码角度看toString调用机制、对象代理、组合与继承、转型、final、初始化】
这个世界上有10种人:一种是懂二进制的,一种是不懂二进制的
你觉得类是在什么时候被加载的?【访问static域时,为什么?看完9就明白了】
文章目录
- 1、深入理解Java中toString方法的调用机制
- 1.1.关于Java代码层面的toString的调用机制
- 1.2.从字节码角度剖析toString观察toString方法的调用
- 1.3.为什么如果没有重写toString()方法就会打印类似的地址呢?
- 2、深入字节码探究基类与导出类的构造初始化
- 2.1.如何理解继承中基类与导出类之间的关系
- 2.2.如何理解基类与导出类的构造器初始化
- 2.3.从字节码角度解读基类与导出类的构造初始化
- 3、为什么有时要对对象进行代理(Delegation)?
- 3.1、解析第一种原因
- 3.2、解析第二种原因
- 4、为什么我们要手动清理一些对象?
- 5、如何理解组合与继承
- 6、浅析向上转型
- 7、再临final关键字
- 7.1.使用final修饰数据什么含义、什么作用?
- 7.2.使用final修饰数据初始化的时机
- 7.3.final参数
- 7.4.使用final修饰方法的含义、扩展内容
- 7.5.使用final修饰类的隐含意义
- 8、在继承中静态、非静态、构造函数的初始化顺序
- 9、你觉得类是在什么时候被加载的?
1、深入理解Java中toString方法的调用机制
每一个非基本类型的对象都有一个toString()方法,当编译器需要一个String对象而你却只有一个对象时,便会调用toString()方法。
观看以下代码分析toString()方法的调用机制
class Emp {private String s = "hello";@Overridepublic String toString() {System.out.println("调用了toString方法");return s;}public static void main(String[] args) {Emp p = new Emp();System.out.println("Emp="+p);}
}
结果如下所示:
分析结果如下:
"Emp="+p
1.1.关于Java代码层面的toString的调用机制
对于这行代码,编译器会将得知你想要将一个String对象(“Emp”)同p对象相加。由于只能将一个String对象和另外一个String对象相加,因此编译器将会告诉你:"我将要调用toString()方法,将p对象转换为一个String!"之后便可以将两个String对象连接到一起并将其传入到System.out.println().
1.2.从字节码角度剖析toString观察toString方法的调用
相信看到这你还是会有疑问,我怎么知道底层自动调用了toString()方法了呢?让我从字节码角度进行剖析 ,对上述代码进行反解析
0 new #4 <com/zsh/javase/base/Emp>
3 dup
4 invokespecial #5 <com/zsh/javase/base/Emp. : ()V>
7 astore_1
8 getstatic #6 <java/lang/System.out : Ljava/io/PrintStream;>
11 aload_1
12 invokedynamic #7 <makeConcatWithConstants, BootstrapMethods #0>
17 invokevirtual #8 <java/io/PrintStream.println : (Ljava/lang/String;)V>
20 return
下面这一行表明调用了toString()方法(toString底层就是new了一个String对象)
一般来说系统了解过JVM才会看得懂这些字节码指令,如果你刚接触Java,你只需要记住.java编译成.class文件时,底层自动调用了toString()方法即可。
new //代表创建一个Emp对象,并将引用压入栈顶
dup //复制栈顶的引用,并将其压入栈顶(此时你可能会有疑问,new指令之后栈顶已经有了一个地址,为什么还需要复制一份;其实一份是虚拟机要自动调用< init>方法做初始化使用的,另一份是给程序员使用的(对对象中的变量做赋值等操作,弹栈就没了)
1.3.为什么如果没有重写toString()方法就会打印类似的地址呢?
当然会调用它的父类Object中的toString方法,看下面父类Object中toString方法的源码会发现,它的返回刚好是类的全限定名+@+对象的哈希码
2、深入字节码探究基类与导出类的构造初始化
基类:父类基类:父类基类:父类
导出类:子类导出类:子类导出类:子类
2.1.如何理解继承中基类与导出类之间的关系
我们都知道在Java中“一切皆对象”,从现实生活中举例:比如“车”和“跑车
深入浅出Java复用类【从字节码角度看toString调用机制、对象代理、组合与继承、转型、final、初始化】相关推荐
- Java字节码角度分析方法调用 ——提升硬实力7
在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...
- 从template到DOM(Vue.js源码角度看内部运行机制)
写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(github.com/answershuto-)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些产出也会对同样想要学习Vue.j ...
- java try resource_从 Java 字节码角度看 try with resource 语法糖
Java 7中的 try-with-resource,在没有这个语法糖的情况下的等价实现是什么? 以下面的demo为例,这个问题目测99%的人都写不完全正确,不信来战. public static v ...
- Java字节码角度分析多态原理 ——提升硬实力8
在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...
- Java字节码角度分析:Synchronized ——提升硬实力11
在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...
- java异常 字节码,Java字节码角度分析异常处理
目录 从字节码角度来分析:异常处理 1.1 异常-catch // 从字节码角度来分析:异常处理 public class T13_ByteAnalyseException { public stat ...
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName(全路径名) 、getClass()、class...
先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对 ...
- 【初级01】java JVM核心技术(1):字节码、类加载器、GC机制
1.编程语言概述 编程语言有不同的分类方法: 面向过程.面向对象.面向函数 静态类型.动态类型 编译执行.解释执行 有虚拟机.无虚拟机 有GC.无GC Java语言是一种面向对象.静态类型.编译执行, ...
- java 执行字节码_深入理解java:1.2. 字节码执行引擎
执行引擎是Java虚拟机的核心组成部分之一. 首先,想想C++和Java在编译和运行时到底有啥不一样? 下图左边,C++发布的就是机器指令, 而下图右边Java发布的是字节码,字节码在运行时通过JVM ...
最新文章
- 使用 Python 开发一个恐龙跑跑小游戏,玩起来
- 三、单链表增删改查原理和代码实现
- [转]程序集之GAC---Global Assembly Cache
- 编程中经常碰到且觉得难的事是什么?
- mysql 1366 utf8_mysql出现ERROR 1366 (HY000):的解决办法
- vs2010添加TSTCON( ActiveX Control Test Container )工具
- nginx 解析php漏洞
- 线性表:顺序队列算法实现
- Android艺术探索笔记 - 创建AIDL文件后自动生成的文件分析
- Unity3D实践2:控制物体移动与旋转
- 海康Ehome协议java开发
- win10释放C盘空间(清理C盘)
- android ppt 自动播放视频,ppt如何循环播放,ppt如何添加视频设置自动播放(ppt转换成视频)...
- ENVI遥感图像处理方法(第二版) 邓书斌 及实验数据
- 2015年动画电影观影指南
- 概率统计笔记之 “数学期望和方差”
- MATLAB导入LTspice RAW格式文件教程(绘制波特图)
- CloudCompare 可视化——Scale Filed
- 谨慎解决:找不到指定的模块(Exception from HRESULT:0X8007007E)
- C++中使用辅助函数寻找最大/最小值:min()、max()、minmax()
热门文章
- 《JavaScript设计模式与开发实践》读书笔记之中介者模式
- [Android] Android开发优化之——使用软引用和弱引用
- php基本操作-echo
- db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?
- homepod怎么设置为中文_设置 HomePod
- python对象group函数_如何对groupby对象应用多个函数
- cwntos新建目录挂载磁盘_centos6修改挂载磁盘目录的方法
- iframe嵌套页面 跨域_跨域解决方案
- python中的列表分片详解_python列表与元组详解实例
- php ajax成功失败,php – 让$.ajax失败