类的初始化时机1.创建类的实例

2.访问类或接口的静态变量(static final常量除外,static final变量可以)3.调用类的静态方法

4.反射(Class.forName(packageName.className))

5.初始化类的子类(子类初始化问题:满足主动调用,即访问子类中的静态变量、方法,否则仅父类初始化)6.java虚拟机启动时被标明为启动类的类

注:加载顺序:启动类的static block最先加载(父类静态成员、静态代码块—>子类静态成员、静态代码块—>父类实例成员、代码块——>父类构造函数—>子类实例成员、代码块—>子类构造函数)

Java代码

package test01;

class Singleton {

public static Singleton singleton = new Singleton();

public static int a;

public static int b = 0;

private Singleton() {

super();

a++;

b++;

}

public static Singleton GetInstence() {

return singleton;

}

}

public class MyTest {

public static void main(String[] args) {

Singleton mysingleton = Singleton.GetInstence();

System.out.println(mysingleton.a);

System.out.println(mysingleton.b);

}

}

从入口开始看

Singleton mysingleton = Singleton.GetInstence();

是根据内部类的静态方法要一个Singleton实例。

这个时候就属于主动调用Singleton类了。

之后内存开始加载Singleton类

1):对Singleton的所有的静态变量分配空间,赋默认的值,所以在这个时候,singleton=null、a=0、b=0。注意b的0是默认值,并不是咱们手工为其赋予的的那个0值。

2):之后对静态变量赋值,这个时候的赋值就是我们在程序里手工初始化的那个值了。此时singleton = new Singleton();调用了构造方法。构造方法里面a=1、b=1。之后接着顺序往下执行。

3):

public static int a;

public static int b = 0;

a没有赋值,保持原状a=1。b被赋值了,b原先的1值被覆盖了,b=0。所以结果就是这么来的。类中的静态块static块也是顺序地从上到下执行的。

编译时常量、非编译时常量的静态变量

Java代码

package test01;

class FinalStatic {

public static final int A = 4 + 4;

static {

System.out.println("如果执行了,证明类初始化了……");

}

}

public class MyTest03 {

public static void main(String[] args) {

System.out.println(FinalStatic.A);

}

}

结果是只打印出了8,证明类并没有初始化。反编译源码发现class里面的内容是

public static final int A = 8;

也就是说编译器很智能的、在编译的时候自己就能算出4+4是8,是一个固定的数字。没有什么未知的因素在里面。

将代码稍微改一下

public static final int A = 4 + new Random().nextInt(10);

这个时候静态块就执行了,证明类初始化了。在静态final变量在编译时不定的情况下。如果客户程序这个时候访问了该类的静态变量,那就会对类进行初始化,所以尽量使用静态final变量,尽量没什么可变因素在里面,否则性能会有所下降。

1. ClassLoader的剖析

ClassLoader的loadClass方法加载一个类不属于主动调用,不会导致类的初始化。如下代码块

Java代码

ClassLoader classLoader = ClassLoader.getSystemClassLoader();

Class clazz = classLoader.loadClass("test01.ClassDemo");

并不会让类加载器初始化test01.ClassDemo,因为这不属于主动调用此类

jvm初始化类时,要求其父类都已经被初始化,但此规则不适用于接口1.在初始化一个类时,并不会先初始化它所实现的接口

2.在初始化一个接口时,并不会先初始化它的父类接口

因此,一个父接口并不会因为它的子接口或实现类的初始化而初始化。当且仅当程序首次使用接口的静态变量(注意是静态变量,使用静态常量不会初始化)时,才回导致该接口的初始化

publicclassTest02 {publicstaticvoidmain(String[] args) {

System.out.println(J.i);

System.out.println(K.j);

}staticintout(String s,inti) {

System.out.println(s+"="+i);returni;

}

}interfaceI {inti=1;intii=Test02.out("ii",2);

}interfaceJextendsI {intj=Test02.out("j",3);intjj=Test02.out("jj",4);

}interfaceKextendsJ {intk=Test02.out("k",5);

}

调用:System.out.println(J.i);

打印:1

解释:J.i 对于J而言没有主动调用,对I 有调用但是i 为static final常量,因此J、I类都没有初始化调用:System.out.println(K.j);

打印:j=3

jj=43

解释:K.j 对于K而言没有主动调用,对于J 调用了该接口的j为static final 变量,满足主动调用,因此初始该接口

转自:

http://aixiangct.blog.163.com/blog/static/91522461201131872019995?suggestedreading

java 接口初始化_Java类的初始化 | 学步园相关推荐

  1. java类的静态成员初始化_Java类的初始化顺序 (静态变量、静态初始化块、变量、初始......

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  2. java生成密码_java生成密码生成 | 学步园

    一.根据当前日期生成MD5加密密码 package com.test; import java.security.MessageDigest; import java.text.SimpleDateF ...

  3. java 优化包_java美化界面包 | 学步园

    导入配置jar包 substance.jar 然后在frame的主函数 加入如下代码 JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setD ...

  4. java初始化实例化_java类的初始化和实例化区别

    结论: 参考https://blog.csdn.net/qq_43672627/article/details/86616624 类的初始化:是完成程序执行前的准备工作.在这个阶段,静态的(变量,方法 ...

  5. java类加载过程_java类的加载过程

    在这本书里面,在讲到类初始化的五种情况时,提及了一个比较有趣的事情.先来看看下面的代码 public class SubClass { static{ System.err.println(" ...

  6. java 接口编程_JAVA面向接口编程

    一.什么是面向接口编程 要正确地使用Java语言进行面向对象的编程,从而提高程序的复用性,增加程序的可维护性.可扩展性,就必须是面向接口的编程.面向接口的编程就意味着:开发系统时,主体构架使用接口,接 ...

  7. java 接口初始化_Java类和接口的初始化

    类的初始化由执行类中静态代码块的初始化和类中声明的静态域的初始化两部分组成 接口的初始化由接口中声明的域(常量)的初始化组成 初始化的时机 类或接口T在以下任意情况发生之前会立即进行初始化:T是一个类 ...

  8. java 类 加载 初始化_java类的加载与初始化

    https://blog.csdn.net/u013349237/article/details/71076617 1在命令行启动虚拟机jvm进行加载, 2用class.forname()方法进行动态 ...

  9. java的连接 初始化_java类从加载、连接到初始化过程详解

    Java代码在编译后会转化成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化成汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 类加载 ...

最新文章

  1. 车载DMI linux系统,基于嵌入式的CTCS3级车载DMI系统的设计与实现
  2. double a=25/2
  3. Ubuntu ADSL 拨号上网时断时续问题
  4. cad细等线体不显示_CAD打印文字不显示?很多人不知道这个知识点!
  5. 《20天吃透Pytorch》Pytorch自动微分机制学习
  6. 1381. 设计一个支持增量操作的栈
  7. hbase 架构和存储
  8. 个人三观的东西(1)
  9. 客户机无法上网,ping 127.0.0.1提示unable to contact IP driver ,error code2
  10. 驰骋工作流引擎-自由表单
  11. CentOS 7 下挂载新硬盘
  12. Ubuntu18.04配置ork(ecto、ecto_image_pipeline、ecto_opencv、ork_reconstruction)
  13. 【可视化】数据仓库与数据挖掘大作业
  14. python人脸识别门禁系统_一种基于python的人脸识别开源系统
  15. 项目管理常用套表模板介绍
  16. matlab计算abc三相短路电流_供配电系统设计需要用到的计算公式(结合手册简要总结)...
  17. html5 摇骰子游戏,HTML5+JavaScript实现掷骰子游戏代码
  18. 一个手握安兔兔,一个执掌鲁大师,周鸿祎雷军这场仗谁能赢?
  19. 银行储蓄系统 类图 顺序图 E_R图 功能结构图 数据流图 系统流图 逻辑结构设计 关系模式 数据关系表
  20. 使用蓝桥杯单片机做一个智能密码锁可以修改密码

热门文章

  1. 飞秋官方下载 访问我博客也有近一半的用户
  2. 秋式开源团队,欢迎您的加入!
  3. 飞鸽传书扫描器 v1.3
  4. 37岁程序员失业投500份简历就3次面试猎头:超35岁不要
  5. java 重启tomcat_linux下重启tomcat的命令
  6. 监督学习 | 线性回归 之正则线性模型原理及Sklearn实现
  7. Adobe illustrator 调整对象大小 - 连载 11
  8. 高薪招聘生物信息工程师-中国科学院深圳先进技术研究院合成所合成生物大设施...
  9. 中国电子学会python等级考试一级
  10. 动画学信奥 漫画学算法 CSP-J入门级 (一)、计算机基础与编程环境(依据「NOI大纲」)