JVM 1.类的加载、连接、初始化
Java类的加载是由类加载器来完成的,过程如下:

首先,加载是把硬盘、网络、数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用来描述该类,再在方法区存放这些二进制数据,用来保存类对应的数据结构

Java的类加载器有哪些?

下面的String对象是由bootstrap根类加载器加载的,而自定义类C是由系统加载器加载的:
/**
* 源文档中这样描述:
* Some implementations may use null to represent the bootstrap class loader.
* This method will return null in such implementations
* if this class was loaded by the bootstrap class loader.
* @author Administrator
*
*/
public class ClassLoader2 { //测试
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("java.lang.String");
System.out.println("String类的加载器:"+c1.getClassLoader());//bootstrap根类加载器(C++实现的),返回null
Class c2 = Class.forName("com.mlxs.classloader.MyClass");
System.out.println("自定义MyClass类的加载器:"+c2.getClassLoader());//AppClassLoader 系统(应用)加载器
/**
* 返回数据:
* String类的加载器:null
* 自定义MyClass类的加载器:sun.misc.Launcher$AppClassLoader@425224ee
*/
} } class MyClass{ }
关于初始化,什么情况下初始化类?在主动使用的时候初始化:

一个例子:
public class ClassLoader1 {
private static ClassLoader1 classLoader1 = new ClassLoader1();
private ClassLoader1(){
a ++;
b ++;
}
public static int a;
public static int b = 0;
public static ClassLoader1 getIntsance(){
return classLoader1;
}
//测试
public static void main(String[] args) {
ClassLoader1 clazz = ClassLoader1.getIntsance();
/**
* 类加载后,
* 准备阶段:(1)classLoader1赋值null,(2)a和b都赋值默认值0;
* 初始化阶段: (1)new classLoader1的时候,a++(=1),b++(=1)
* (2)a没默认值,值不变;b默认值为0,b赋值0
* 所以,最后a=1,b=0
*
* 如果把new ClassLoader1()放到int a b 的后面,则最后a=1,b=1
*/
System.out.println("a:"+clazz.a);
System.out.println("b:"+clazz.b);
}
}
结果:
a:1
b:0
要注意的是:
子类主动使用,会导致父类的初始化;而父类主动使用,不会使子类初始化。如,new Object() 不会导致它的子类(所有的Java类)都初始化
而子类实现接口,当子类被初始化,不会导致接口初始化。只有当接口中的静态变量被使用时才会初始化
JVM 1.类的加载、连接、初始化的更多相关文章
- Java 类的加载与初始化
本文结构: 1.先看几道题 2.类的加载于初始化 (1)类的加载 (2)类的初始化 (a)会发生类的初始化的情况 (b)不会发生类的初始化的情况 首先看几道题. 解析可在看完讲解后再看 Demo1 p ...
- java类的加载以及初始化顺序
类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classl ...
- 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类从字节代码到能够 ...
- jvm(1)类的加载(三)(线程上下文加载器)
简介: 类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的. Java Applet 需要从远程下载 Java 类文件到浏览器中并执行. 现在类加载器在 ...
- java类的加载与初始化
https://blog.csdn.net/u013349237/article/details/71076617 1在命令行启动虚拟机jvm进行加载, 2用class.forname()方法进行动态 ...
- Java类的加载及初始化
每个类的编译代码都存在于它自己的独立文件中,该文件在需要使用该程序代码时才会被加载.通常有以下三种加载情况: (1) 访问了子类的静态变量或静态方法:仅对类的静态变量,静态块执行初始化操作,并仅初始化 ...
- java 类的加载、连接和初始化
JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区. ...
随机推荐
- struts2 笔记04 杂记
流程: 1. StrutsPrepareAndExcuteFilter:StrutsPrepareAndExcuteFilter作为前端控制器,是整个Struts2的调度中心. 2. ActionMa ...
- 利用arcigs制作出 源解析要用的ASCII文件
准备:1.确定好模拟区域范围,精度,行列数 2.确定好源解析的城市规划 思路: 1.全国省级图+本地市县图-->合成一张区域图(联合) 合成之后,添加一个字段,一个数字类型字段 ...
- Hive报错之java.sql.SQLException: Field 'IS_STOREDASSUBDIRECTORIES' doesn't have a default value
在创建表的时候报出如下错误: hive> create table if not exists testfile_table( > site string, > url string ...
- mac下多个php版本快速切换的方法是怎么样
一.使用brew安装php多版本方法# brew install php56# brew install php70二.安装切换工具# brew install php-version# source ...
- Eclipse如何设置字体
Eclipse 是一个开放源代码的.基于Java的可扩展开发平台,是学习java和开发java最常用的IDE之一.有时候会遇到这种情况,刚刚下载了新的Eclipse,字体显示英文没问题,但是显示中文就 ...
- C#:简单线程样例
1.定义线程类及内部事件 using System; using System.Collections.Generic; using System.Text; using System.Threadi ...
- java 错误集锦
Exception in thread "main" java.lang.Error: Unresolved compilation problem: at com.niuniu. ...
- [HTML]js定时器使用 setInterval
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 s ...
- vs2013的asp.net 管理
iisexpress.exe /path:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ASP.NETWebAdminFiles /vpath:/AS ...
- asp.net 查询,导出
using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using S ...