Java基础:类文件结构及类加载】的更多相关文章

Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码文件是一种平台无关的中间编译结果,字节码文件由java虚拟机读取,解析和执行,java虚拟机屏蔽了不同操作系统和硬件平台的差异性. 如今的java虚拟机已经称为一种通用平台,不但能够运行java语言,Groovy,JRuby,Jython等一大批动态语言也可以直接在Java虚拟机上运行,其原理也是这…
Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码文件是一种平台无关的中间编译结果,字节码文件由java虚拟机读取,解析和执行,java虚拟机屏蔽了不同操作系统和硬件平台的差异性. 如今的java虚拟机已经称为一种通用平台,不但能够运行java语言,Groovy,JRuby,Jython等一大批动态语言也可以直接在Java虚拟机上运行,其原理也是这…
前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载和构造方法的重载 方法的重载 在一个类中可以有多个方法具有相同的名字,但是这些方法的参数个数不同,或参数类型不同,即为方法的重载. class Demo{ // one void dashu(String name){ System.out.println(name); } // two void…
Class文件结构 魔数 4bits 确定该文件是否是可接受的Class文件(0xCAFEBABE) 版本号 4bits 包括次版本号和主版本号 常量池 包括字面量(文本字符串,声明为final的常量值)和符号引用(类和接口的全限定名,字段的名称和描述符,方法的名称和描述符) 访问标志 2bits 标志识别类或者接口层次的访问信息,如类是否为public,是否为abstract,是否为final,是Class还是Interface. 类索引 父索引与接口索引集合 用于确定这个类的继承关系 字段表…
第6章 类文件结构 1. 无关性 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(即扩展名为 .class 的文件) 是构成平台无关性的基石. 字节码(即扩展名为 .class 的文件)不面向任何特定的处理器,只面向虚拟机. 实现语言无关性的基础仍是虚拟机和字节码存储格式.Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联.Class文件包含了java虚拟机指令集和符号表以及若干其他辅助信息.任一门功能性语言都可以表示为能被…
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap. Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载. …
一.Class类文件结构 Class类文件严格按照顺序紧凑的排列,由无符号数和表构成,表是由多个无符号数或其他数据项构成的符合数据结构. Class类文件格式按如下顺序排列:   类型 名称 数量 u4 magic(魔术) 1 u2 minor_version(次版本号) 1 u2 major_version(主版本号) 1 u2 constant_pool_count(常量个数) 1  cp_info constant_pool(常量池表) constant_pool_count-1 u2 a…
目录 类文件结构 Class类文件的结构 魔数与Class文件的版本 常量池 访问标志 类索引.父类索引和接口索引集合 字段表集合 方法表集合 属性表集合 完整结构描述 实例 源码 Class文件 分析 魔数.Class版本 常量池长度 常量池内容 访问标志 类索引.父类索引.接口索引 字段表集合 方法表集合 总结 类文件结构 Class类文件的结构 任何一个Class文件都对应着唯一一个类或者接口的定义信息,但是类或者接口并不一定都要定义在文件里(例如类也可以通过类加载器直接生成).Class…
JVM中除了根加载器之外其他加载器都是ClassLoader的子类实例, 可以通过扩展ClassLoader的子类,通过重写方法来实现自定义的类加载器. ClassLoader中有两个关键的方法如下, loadClass(...), 系统调用这个方法来加载指定类的Class对象 在这个方法中,一般需要做四件事,先后顺序如下, findLoadedClass(..)看是否已经加载类--加载器的缓存机制 在父加载器上调用loadClass(..), 父加载器为null,则使用根加载器加载--加载器的…
java虚拟机具有语言无关系,它只和“class文件“这种特定的二进制文件格式绑定. 不同语言的编译器将对应的程序编译成字节码文件(*.class),送给jvm执行. class文件本质上就是一张表,由各类数据项构成. 2.1.魔数(是否可以被虚拟机执行)和class文件版本 2.2.常量池(两大类常量:字面量与符号引用) 2.3.访问标志(识别访问信息) 2.4.类索引.父类索引和接口索引集合 2.5.字段表集合 2.6.方法表集合 ——————————————————————————————…
本章学习要点:       1.  Java封装特性;       2.  掌握类的定义:       3.  掌握类的调用方法; 一.封装特性        Java 纯面向对象语言,面向对象语言遵循有三种基本特性,封装,继承,多态:所有的特性都围绕着类展开发,类是对现实世界中事物的抽象描述.本章先学习封装特性        1.  类  - 将现实事物(人)或虚拟事件(银行账户)进行抽象,在Java通过类来描述,事物的属性和行为:  如:             a. 人 - 现实中的具体事…
static修饰符 修饰属性:静态的属性不属于任何对象,全类及其对象共用,可以用类名直接调用 修饰方法:静态的方法可以直接用类名调用,和对象无关.静态方法只能访问静态成员和静态方法,非静态方法可以调用静态方法 静态方法只能被子类的的静态方法覆盖,而且没有多态(因为对引用调用静态方法,等价于对引用的类型调用静态方法),静态修饰符和抽象修饰符不能在一起使用 静态初始代码块在类加载的时候执行一次 类加载 类加载:当JVM第一次使用一个类的时候,需要提取这个类的字节码文件,获取类的信息并保存起来 类加载…
类 Object 类(java.lang.Object)是所有 Java 类的直接或间接父类. 成员方法及变长参数 方法定义: [public | protected | private] [static] [final] [abstract] [native] [synchronized] 返回类型 方法名([参数列表]) [throws exceptionList] { // 方法体 } static:表示这是一个类方法(静态方法),不需实例化即可调用 final:表示这是一个终结方法,不可…
本章学习要点:       1.  了解Java继承特性;       2.  掌握继承实现方法;       3.  掌握override规则: 一.类继承特性       1.  继承定义:使用己存在的类作为新类定义的基础,新类定义中可以增加新的数据或新的方法. 基础类我们称之为父类或基类,新派生的类为子类或派生类:       2.  继承目的:增强类之间的复用性,不用重复操轮子.从而使子类具有父类的功能, 无须再次实现,通常父类作为对多个子类共性的抽象,因而将共性内容(属性和行为)作为父…
java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示例: (2)成员变量和局部变量的区别 1.作用域不同 局部变量的作用域仅限于定义它的方法:成员变量的作用域在整个类内部都是可见的. 2.初始值不同 java会给成员变量一个初始值(初始值为0):java不会给局部变量赋予初始值.(使用局部变量必须要先赋值) 示例: 3.同名的情况 在同一个方法中,不…
一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制,在数据封装后,其他的类成员想要访问当前类成员,就必须要有足够的权限才能访问:这样做的目的就是我可以随意修改不想让其他类成员没有权限访问的数据,只要约定好相关的协议,不影响其他类成员访问即可: 二 权限修饰词介绍 public 意指公有的意思,其修饰的成员权限最低,表示任何成员都可以访问:注意点是一…
类和对象 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态.确定对象将有的特征(属性)和行为(方法),用来确定对象信息,具有相同属性和方法的一组对象的集合 软件对象也有状态和行为.软件对象的状态就是属性,行为通过方法体现. 哈希编码:每个对象都有自己的哈希编码,程序调用时,通过寻找对象的哈希编码来查找对象在内存的位置. 在软件开发中,方法操作对象内部状态的改…
基本概念 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分. 实例化:类的实例化可生成对象(使用关键字new来创建一个对象). //实例化类生成对象 //new操作会在堆内存中分配一个对象的内存 new String(“hello”); 引用:java中使用引用来操作对象. //创建一个引用 String…
本节把类和对象的初始化所涉及到的所有代码块阐述一边. 示例代码: public class Demo { private static String name; private String age; // 主函数 public static void main(String[] args) { Demo demo = new Demo(); } // 构造函数 public Demo() { System.out.println("我是构造函数,随着对象建立而运行"); } // 我…
类 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中可以有多个类,但是最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件的名称可以为任意的名称 在类内部,对于成员变量,如果在定义的时候没有进行显示的赋值初始化,则Java会保证类的每个成员变量都得到恰当的初始化: 1)对于  char.short.byte.int.long.float.double等基本数据类型的变量来说会默认初始化为0(boo…
一. static关键字 使用static关键字修饰成员变量表示静态的含义,此时成员变量由对象层级提升为类层级,整个类共享一份静态成员变量,该成员变量随着类的加载准备就绪,与是否创建对象无关 使用static修饰属性:静态变量(或类变量) 静态变量随着类的加载而加载,可以通过类名.静态变量的方式进行调用 静态变量的加载早于对象的创建 类只会加载一次,静态变量在内存中只有一份,在方法区的静态域中 使用static关键字修饰类方法:静态方法 静态方法中只能代用静态方法的属性或方法 非静态方法中,可以…
一.Object类 java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间接子类 如果定义一个Java类时没有使用extends关键字声明其父类,则其父类为 java.lang.Object 类. Object类定义了"对象"的基本行为, 被子类默认继承. object源码中没有成员变量,只有成员方法,包括 equals() / toString() / getClass() /hashCode() / clone() / final…
一.继承(extends) 面向对象的三大特性之一,当多个类中存在相同属性和行为时,将这些内容抽取到一个公共类中,让多个类(子类)吸收公共类(父类.超类)中已有特征和行为,而在多个类型只需要编写自己独有特征和行为的机制,叫做继承 作用:继承的出现减少了代码冗余,提高了代码的复用性,可拓展性, 提供了多态的前提. 子类不能继承父类的构造方法和私有方法,可以继承父类的私有成员变量,不可以直接访问父类的私有成员和变量方法,可以通过getter 和setter 等方法访问 无论用何种方式构造子类的对象实…
一. 类和对象 面向对象:以属性和行为的观点去分析现实生活中的事物,将功能封装进对象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做 类:是对具有相同特征和行为的多个对象共性的抽象描述,在Java语言中体现为一种引用数据类型,里面包含了描述特征/属性的成员变量以及描述行为的成员方法,用于构建对象的模板,对象的数据结构由定义它的类来决定 对象:是实际存在的该类事物的每个个体, 是类的实例 类的定义 类主要包括成员变量和成员方法,构…
本章学习要点:        1.  掌握static 修饰的类,方法以及变量的功能及用法;        2.  掌握代码块(静态,非静态)的作用以及注意事项:        3.  了解基本数据类型的封装类的功能和用法以及自动装箱.拆箱        4.  了解类对象比较(==, equals)方法用法;        5.  了解隐藏根类(Object)的几个默认方法的使用: 一.static 修饰符   二.类中代码块   三.基本类型封装类   四.对象之间的比较   五.根类方法解…
本章学习要点:       1.  了解Java多态特性;       2.  掌握Java多态的实现: 一.多态特性       1.  定义:            指同一个对象调用相同的方法实现不同的功能:       2.  用途:             作为面向对象三大特性之一,在设计模式中多态特性被运用的非常广泛. 在开发过程中常遇到相似类型的事物有着相同的行为,但在编译时无法确定具体是哪一个时就可用多态来实现从而             提升代码的扩展性和灵活性, 通常配合抽象类…
一个简单的demo,主要运用: 抽象类,类的继承 类的实例化,构造函数 @Override重写父类方法 package week4; abstract class Person { void showFullName() { System.out.print("Person"); } } class People extends Person{ int age; final String name; People (int age, String name){ this.age = a…
一.类与接口的关系 1.类与类的关系 继承关系,只能单继承,不能多继承:但是可以多层继承 2.类与接口的关系 实现关系,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口 3.接口与接口的关系 继承关系,可以单继承也可以多继承 二.抽象类与接口的区别 1.成员区别 抽象类:变量:常量:有构造方法:有抽象方法,也有具体方法 接口:只有常量:只有抽象方法 2.关系区别 类与类:继承.单继承 类与接口:实现:可以单实现,也可以多实现 接口与接口:继承:单继承,多继承 3.设计理念区别 抽象类…
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_PRIVATE.各种字节码指令等等许多概念听起来都是云山雾罩.一知半解,原因就在于对类文件结构和类加载机制不够了解.直到后来细读了<深入理解 Java 虚拟机>中虚拟机执行子系统的相关内容,才建立了清晰的认知.如果你也和我一样,不了解类结构和类加载,但是工作中又涉及到字节码相关内容,相信后面两篇文章…
一直不太搞得明确jvm究竟是如何进行类载入的,在看资料的过程中迷迷糊糊.在理解类载入之前,首先看看java的类文件结构究竟是如何的,都包含了哪些内容. 最直接的參考当然是官方文档:The Java® Virtual Machine Specification 我写了一个最简单的java程序.依据这个程序来分析一下.class文件里究竟都存了些什么. java程序: class Par { public int x = 5; public void f(){ System.out.println(…