jvm学习:类的加载、连接、初始化、常量
类在jvm中有这几个过程类的加载、连接、初始化、使用、卸载
类的加载
类的加载是将class文件中的二进制数据加载到内存中,将其放在运行时的数据区:方法区内,然后在内存中创建一个
java.lang.Class对象用来封装类在方法区内的数据结构。规范没有规定Class对象放在哪里,hotspot虚拟机将其放在了方法区中。
加载.class文件的方式
从本地系统中加载
从网络下载.class文件
从zip jar文件中加载
将java原文件动态的编译为.class文件,比如jsp
类的使用
java的类主动使用,才会执行初始化
主动使用
创建类的实例
访问某个类或者接口的非final变量、对改静态变量的赋值
调用类的静态方法
反射
初始化一个类的子类
表明为启动类比如main方法
java1.7动态语言支持
例子
运行下面的例子可以先打印str1,然后打印str2。
package com.javalearn.jvm.classloader;
import lombok.extern.slf4j.Slf4j;
/**
* 对于静态字段来说,只有直接使用定义了该字段的类才会被初始化
* 当一个类加载要求父类加载完毕
*/
@Slf4j
public class MyTest {
public static void main(String[] args) {
log.info(MyChild1.str2);
}
}
@Slf4j
class MyParent1 {
public static String str1 = "hello";
static {
log.info("my parent static block");
}
}
@Slf4j
class MyChild1 extends MyParent1 {
public static String str2 ="hello child2";
static {
log.info("my child1 static block");
}
}
结果
22:47:54.901 [main] INFO com.javalearn.jvm.classloader.MyParent1 - my parent static block
22:47:54.905 [main] INFO com.javalearn.jvm.classloader.MyChild1 - my child1 static block
22:47:54.905 [main] INFO com.javalearn.jvm.classloader.MyTest - hello child2
使用反射是主动使用,会初始化类,但ClassLoader不是主动使用
package com.learn.java.javabase.jvm.classloader;
public class ClassLoaderTest012 {
public static void main(String[] args) {
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
Class<?> c1;
try {
c1 = classLoader.loadClass("com.learn.java.javabase.jvm.classloader.Test012");
System.out.println(c1);
System.out.println("--------");
c1=Class.forName("com.learn.java.javabase.jvm.classloader.Test012");
System.out.println(c1);
System.out.println("--------");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("--------");
}
}
class Test012{
static {
System.out.println("test012");
}
}
运行结果
class com.learn.java.javabase.jvm.classloader.Test012
--------
test012
class com.learn.java.javabase.jvm.classloader.Test012
--------
--------
初始化
类初始化的时候,会首先初始化它的父类,比如Object类
接口初始化的时候,不会初始化它的父接口
初始化是按照上下文的顺序初始化
package com.learn.java.javabase.jvm.classloader;
import java.util.Random;
public class ClassLoaderInterfaceTest {
public static void main(String[] args) {
// Paraent01 paraent01 =new Paraent01();
// Paraent01 paraent02 =new Paraent01();
// Child01 child01 =new Child01();
//System.out.println(Paraent01.paraent01);
System.out.println(Child01.childInt);
}
}
class Paraent01 {
//常量会在编译期间放到调用类的常量池中
public static final int paraent01=10;
//public static int paraent01=10;
//静态代码块随着类的加载只会执行一次
static {
System.out.println("paraent01");
}
}
class Child01 extends Paraent01 {
public static int childInt =5;
static {
System.out.println("child01");
}
}
结果
paraent01
child01
5
常量
常量会在编译期加载使用类的常量池中
下面的例子Child01的常量在test类使用的时候,已经放入到常量池。说明
final变量的调用不是主动使用,并不会导致父类的初始化
package com.learn.java.javabase.jvm.classloader;
import java.util.Random;
public class ClassLoaderInterfaceTest {
public static void main(String[] args) {
// Paraent01 paraent01 =new Paraent01();
// Paraent01 paraent02 =new Paraent01();
// Child01 child01 =new Child01();
//System.out.println(Paraent01.paraent01);
System.out.println(Child01.childInt);
}
}
class Paraent01 {
//常量会在编译期间放到调用类的常量池中
public static final int paraent01=10;
//public static int paraent01=10;
//静态代码块随着类的加载只会执行一次
static {
System.out.println("paraent01");
}
}
class Child01 extends Paraent01 {
public static final int childInt =5;
static {
System.out.println("child01");
}
}
输出结果
5
jvm学习:类的加载、连接、初始化、常量的更多相关文章
- 深入java虚拟机学习 -- 类的加载机制(续)
昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...
- Java 类的加载与初始化
本文结构: 1.先看几道题 2.类的加载于初始化 (1)类的加载 (2)类的初始化 (a)会发生类的初始化的情况 (b)不会发生类的初始化的情况 首先看几道题. 解析可在看完讲解后再看 Demo1 p ...
- java类的加载以及初始化顺序
类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classl ...
- JVM 1.类的加载、连接、初始化
Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用 ...
- 深入java虚拟机学习 -- 类的加载机制
当看到"类的加载机制",肯定很多人都在想我平时也不接触啊,工作中无非就是写代码,不会了可以百度,至于类,jvm是怎么加载的我一点也不需要关心.在我刚开始工作的时候也觉得这些底层的内 ...
- jvm(1)类的加载(二)(自定义类加载器)
[深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...
- JVM:java类的加载机制
原文连接:https://www.cnblogs.com/ityouknow/p/5603287.html 类加载机制的奥妙. 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读 ...
- Java类的加载 链接 初始化
原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...
- 深入java虚拟机学习 -- 类的加载机制(三)
类的初始化时机 在上篇文章中讲到了类的六种主动使用方式,反射是其中的一种(Class.forName("com.jack.test")),这里需要注意一点:当调用ClasLoade ...
- jvm(1)类的加载(三)(线程上下文加载器)
简介: 类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的. Java Applet 需要从远程下载 Java 类文件到浏览器中并执行. 现在类加载器在 ...
随机推荐
- react脚手架和深入理解jsx语法
react的mvc和vue的mvvm vue的mvvm属于双向绑定,view层,model数据层,vm实现双向绑定的控制层 此种模式,再某一类项目种很有优势:管理系统 ( OA, ERP , CRM ...
- HashMap知识初探
public class TestHashMap { /** * HashMap是数组和链表组合构成的数据结构 * 数组里面每个地方都存了key-value这样的实例Java7叫Entry,Java8 ...
- Python开发五子棋游戏【新手必学】
五子棋源码,原创代码,仅供 python 开源项目学习.目前电脑走法笨笨的,下一期版本会提高电脑算法ps:另外很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为 ...
- MSComm控件进行串口编程的基本步骤
Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控 ...
- Integer数值小于127时使用==比较的坑
Java在处理Integer时使用了一个缓存,其中缓存了-128到127之间的数字对应的Integer对象,所以在绝大多数情况下,当我们把2个小于128的Integer对象用==比较时,Java往往是 ...
- opencv:图像直方图相似性比较
void hist_compare(Mat src1, Mat src2) { int histSize[] = { 256, 256, 256 }; int channels[] = { 0, 1, ...
- 201771010135 杨蓉庆《面对对象程序设计(java)》第十六周学习总结
1.实验目的与要求 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程的优先级属性及调度方法: (4) 掌握线程同步的概念及实现技术: 一.理论知识 ⚫ 线程的概念 (1 ...
- SpringCloud全家桶学习之断路器---Hystrix(五)
目前我也在摸索着学习Spring Cloud,本节主要摸索的是服务熔断.服务降级.Hystrix服务监控. 一.Hystrix概述 (1)服务雪崩 服务雪崩:多个微服务之间调用的时候,假设微服务A调用 ...
- sklearn笔记:决策树
概述 sklearn中决策树的类都在 tree 这个模块下.这个模块总共包含五个类: tree.DecisionTreeClassifier:分类树 tree.DecisionTreeRegresso ...
- Flexconnect部署
该记录主要用于针对于无线网络中Flexconnect的部署,可能涉及到的有Flexconnect中的组件,如何部署.(注意:在7.2版本以前,Flexconnect叫做HREAP),目前都称作为Fle ...