这个世界上有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、初始化】相关推荐

  1. Java字节码角度分析方法调用 ——提升硬实力7

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  2. 从template到DOM(Vue.js源码角度看内部运行机制)

    写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(github.com/answershuto-)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些产出也会对同样想要学习Vue.j ...

  3. java try resource_从 Java 字节码角度看 try with resource 语法糖

    Java 7中的 try-with-resource,在没有这个语法糖的情况下的等价实现是什么? 以下面的demo为例,这个问题目测99%的人都写不完全正确,不信来战. public static v ...

  4. Java字节码角度分析多态原理 ——提升硬实力8

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  5. Java字节码角度分析:Synchronized ——提升硬实力11

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  6. java异常 字节码,Java字节码角度分析异常处理

    目录 从字节码角度来分析:异常处理 1.1 异常-catch // 从字节码角度来分析:异常处理 public class T13_ByteAnalyseException { public stat ...

  7. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName(全路径名) 、getClass()、class...

    先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对 ...

  8. 【初级01】java JVM核心技术(1):字节码、类加载器、GC机制

    1.编程语言概述 编程语言有不同的分类方法: 面向过程.面向对象.面向函数 静态类型.动态类型 编译执行.解释执行 有虚拟机.无虚拟机 有GC.无GC Java语言是一种面向对象.静态类型.编译执行, ...

  9. java 执行字节码_深入理解java:1.2. 字节码执行引擎

    执行引擎是Java虚拟机的核心组成部分之一. 首先,想想C++和Java在编译和运行时到底有啥不一样? 下图左边,C++发布的就是机器指令, 而下图右边Java发布的是字节码,字节码在运行时通过JVM ...

最新文章

  1. 使用 Python 开发一个恐龙跑跑小游戏,玩起来
  2. 三、单链表增删改查原理和代码实现
  3. [转]程序集之GAC---Global Assembly Cache
  4. 编程中经常碰到且觉得难的事是什么?
  5. mysql 1366 utf8_mysql出现ERROR 1366 (HY000):的解决办法
  6. vs2010添加TSTCON( ActiveX Control Test Container )工具
  7. nginx 解析php漏洞
  8. 线性表:顺序队列算法实现
  9. Android艺术探索笔记 - 创建AIDL文件后自动生成的文件分析
  10. Unity3D实践2:控制物体移动与旋转
  11. 海康Ehome协议java开发
  12. win10释放C盘空间(清理C盘)
  13. android ppt 自动播放视频,ppt如何循环播放,ppt如何添加视频设置自动播放(ppt转换成视频)...
  14. ENVI遥感图像处理方法(第二版) 邓书斌 及实验数据
  15. 2015年动画电影观影指南
  16. 概率统计笔记之 “数学期望和方差”
  17. MATLAB导入LTspice RAW格式文件教程(绘制波特图)
  18. CloudCompare 可视化——Scale Filed
  19. 谨慎解决:找不到指定的模块(Exception from HRESULT:0X8007007E)
  20. C++中使用辅助函数寻找最大/最小值:min()、max()、minmax()

热门文章

  1. 《JavaScript设计模式与开发实践》读书笔记之中介者模式
  2. [Android] Android开发优化之——使用软引用和弱引用
  3. php基本操作-echo
  4. db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?
  5. homepod怎么设置为中文_设置 HomePod
  6. python对象group函数_如何对groupby对象应用多个函数
  7. cwntos新建目录挂载磁盘_centos6修改挂载磁盘目录的方法
  8. iframe嵌套页面 跨域_跨域解决方案
  9. python中的列表分片详解_python列表与元组详解实例
  10. php ajax成功失败,php – 让$.ajax失败