一、概述(了解)

  1. 字节码文件的跨平台性(了解)

①. Java语言:跨平台的语言

  • 当Java源代码成功编译为字节码后,如果想在不同的平台上运行,则无须再次编译
  • 这个优势不再那么吸引人了。Python PHP perl ruby lisp等有强大的解释器
  • 跨平台似乎已经快成为一门语言必须的特征

②.Java虚拟机:跨语言的平台:
(Java虚拟机不和包括java在内的任何语言绑定,它只与class文件这种二进制文件格式所关联。无论使用何种语言进行软件开发,只要将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行,可以说,统一而强大的Class文件结构,就是Java虚拟机的基石、桥梁)

③. 想要让一个Java程序正确地运行在JVM中,Java源码就必须要编译为符合JVM规范的字节码

  • 前端编译器的主要任务就是负责将符合Java语言规范的Java代码转换为符合JVM规范的字节码文件
  • javac是一种能够将Java源码编译为字节码的前端编译器
  • javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤:分别是词法解析、语法解析、语义解析以及生成字节码

二、Java的前端编译器(了解)

①. 前端编译器 vs 后端编译器

②. 图解:

三、透过字节码指令看代码细节

①. Integer:透过字节码可以看出,当Integer的范围在-128 - +127 之间会在数组中直接拿取数值,超过这个范围会重新new对象

public class IntegerTest {public static void main(String[] args) {/** 透过字节码可以看出,当Integer的范围在-128 - +127 之间会在数组中直接拿取数值* 超过这个范围会重新new对象* */Integer x = 5;int y = 5;System.out.println(x == y);Integer i1 = 10;Integer i2 = 10;System.out.println(i1 == i2);//trueInteger i3 = 128;Integer i4 = 128;System.out.println(i3 == i4);//false}

②. 在父类中调用方法,如果子类有重写,那么调用的是子类的方法,如代码中的this.print( )

/*
成员变量(非静态的)的赋值过程:① 默认初始化 -② 显式初始化 /代码块中初始化 -③ 构造器中初始化 -④ 有了对象之后,可以“对象.属性”或"对象.方法"的方式对成员变量进行赋值。*/
class Father {int x = 10;public Father() {this.print();x = 20;}public void print() {System.out.println("Father.x = " + x);}
}
class Son extends Father {int x = 30;
//    float x = 30.1F;public Son() {this.print();x = 40;}public void print() {System.out.println("Son.x = " + x);}
}public class SonTest {public static void main(String[] args) {Father f = new Son();System.out.println(f.x);}
}

③. 静态变量随着类的加载就加载了,在链接(准备阶段)会为静态变量赋予默认的初始化值,在初始化阶段会显示的赋值

/*
输出结果:父类的静态成员属性父类静态代码块子类的静态成员属性子类静态代码块父类构造方法子类构造方法
*/
public class People {private final static String parentStaitc = "父类的静态成员属性";public static void main(String[] args) {People people = new Child();}public People() {System.out.println("父类构造方法");}static{System.out.println(parentStaitc);System.out.println("父类静态代码块");}
}class Child extends People {private final static String childStaitc = "子类的静态成员属性";public Child() {System.out.println("子类构造方法");}static{System.out.println(childStaitc);System.out.println("子类静态代码块");}
}

四、class文件结构组织示意图

JVM_07 Class文件结构相关推荐

  1. android 定义集合长度,Android Dex文件结构解析

    Java源文件通过Java编译器生成CLASS文件,再通过dx工具转换为classes.dex文件. DEX文件从整体上来看是一个索引的结构,类名.方法名.字段名等信息都存储在常量池中,这样能够充分减 ...

  2. 1 字节的 utf-8 序列的字节 1 无效_字节码文件结构详解

    点击上方" Java资料站 ",选择"标星公众号" 优质文章,第一时间送达 陈建源  |  作者 urlify.cn/INFrUr  |  来源 "一 ...

  3. Nginx入门笔记之————配置文件结构

    在nginx.conf的注释符号位# nginx文件的结构,这个对刚入门的同学,可以多看两眼. 默认的config: #user nobody; worker_processes 1;#error_l ...

  4. Class类文件结构、类加载机制以及字节码执行

    一.Class类文件结构 Class类文件严格按照顺序紧凑的排列,由无符号数和表构成,表是由多个无符号数或其他数据项构成的符合数据结构. Class类文件格式按如下顺序排列: 类型 名称 数量 u4 ...

  5. 深入理解java虚拟机之类文件结构以及加载

    我们都知道,java是一种平台无关的语言.java代码通过java编译器(如javac等),将.java文件编译成字节码,也就是.class文件.字节码是运行在jvm虚拟机之上的.而不同的平台则 有不 ...

  6. 修改class文件_VM实战(六) - 通过案例深入学习class文件结构原理

    0 更多干货关注 JavaEdge 公众号 1 什么是JVM的"无关性"? Java具有平台无关性,也就是任何操作系统都能运行Java代码.之所以能实现这一点,是因为Java运行在 ...

  7. nginx模型概念和配置文件结构

    一. nginx模型概念: Nginx会按需同时运行多个进程: 一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程( ...

  8. Xamarin XAML语言教程XAML文件结构与解析XAML

    Xamarin XAML语言教程XAML文件结构与解析XAML XAML文件结构 在上文中,我们创建XAML文件后,会看到类似图1.16所示的结构 图1.16  结构 其中,.xaml文件和.xaml ...

  9. C++/C的文件结构

    C++/C的文件结构 对于C++/C的程序开发员来说,文件结构这一内容是很重要的一块,我们知道,每个C++/C程序通常分为两个文件.一个为头文件,用于保存程序的声明(declaration).另一个为 ...

最新文章

  1. ASP.NET MVC学习系列(一)-WebAPI初探
  2. 深度学习数学基础(一)~卷积
  3. 下面不是python合法标识符_哪个不是python合法标识符
  4. Angular应用里使用HTTP服务的一个具体例子
  5. Linux系统故障处理案例(一)【转】
  6. 【渝粤教育】广东开放大学 建筑专业 形成性考核 (57)
  7. Android腾讯云直播开发,笔记:腾讯云直播SDK测试demo
  8. 高端计算机教室,惟义楼高端智慧教室!360°高清全景抢先看
  9. echarts常用属性
  10. FPGA,verilog驱动VGA显示
  11. PHP实战项目(仿糯米网)
  12. c语言字符串子串问题,C语言计算字符串子串出现的次数
  13. 关于游戏中仓库类的设计
  14. 【罗塞塔石碑】—My Lover(Two.iso)
  15. 作业5 | AR模型参数的估计
  16. python微博爬虫分析_python爬取和分析新浪微博(一):scrapy构建新浪微博榜单、博主及微博信息爬虫...
  17. 1、Lctech Pi(F1C200S)windows驱动安装说明(CherryPi,Mangopi,F1C100S)
  18. 中国一些著名网站的主题颜色
  19. 微信支付——扫码支付模式二
  20. 解构微信(三):揭秘微信的敏捷开发与流程管理

热门文章

  1. PMBOK(第六版) PMP笔记——《十一》第十一章(项目风险管理)
  2. tomcat配置一个线程来调试ThreadLocal的代码问题
  3. IDA Pro的patch插件 KeyPatch
  4. 条款五:对应的new和delete要采用相同的形式
  5. linux服务器运行matlab文件报错
  6. 二十万字C/C++、嵌入式软开面试题全集宝典七
  7. linux系统-软链接与硬链接区别
  8. 详解浏览器解析一个URL的全过程
  9. sublime 2 中常用快捷键
  10. [云炬创业管理笔记]第五章打磨最有效的商业模式测试1