Java类初始化顺序

jvm系列

  • 垃圾回收基础

  • JVM的编译策略

  • GC的三大基础算法

  • GC的三大高级算法

  • GC策略的评价指标

  • JVM信息查看

  • GC通用日志解读

  • jvm的card table数据结构

  • Java类初始化顺序

  • Java对象结构及大小计算

  • Java的类加载机制

  • Java对象分配简要流程

  • 年老代过大有什么影响

  • Survivor空间溢出实例

  • 关于Object=null

  • Java线程与Xss

本文主要演示Java类的初始化顺序

初始化顺序

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。

实例代码

public class InitialOrderTest {/* 静态变量 */public static String staticField = "静态变量";/* 变量 */public String field = "变量";/* 静态初始化块 */static {System.out.println( staticField );System.out.println( "静态初始化块" );}/* 初始化块 */{System.out.println( field );System.out.println( "初始化块" );}/* 构造器 */public InitialOrderTest(){System.out.println( "构造器" );}public static void main( String[] args ){new InitialOrderTest();}
}

输出

运行以上代码,我们会得到如下的输出结果:

  1. 静态变量

  2. 静态初始化块

  3. 变量

  4. 初始化块

  5. 构造器

继承的情况

实例代码

class Parent {/* 静态变量 */public static String p_StaticField = "父类--静态变量";/* 变量 */public String    p_Field = "父类--变量";protected int    i    = 9;protected int    j    = 0;/* 静态初始化块 */static {System.out.println( p_StaticField );System.out.println( "父类--静态初始化块" );}/* 初始化块 */{System.out.println( p_Field );System.out.println( "父类--初始化块" );}/* 构造器 */public Parent(){System.out.println( "父类--构造器" );System.out.println( "i=" + i + ", j=" + j );j = 20;}
}public class SubClass extends Parent {/* 静态变量 */public static String s_StaticField = "子类--静态变量";/* 变量 */public String s_Field = "子类--变量";/* 静态初始化块 */static {System.out.println( s_StaticField );System.out.println( "子类--静态初始化块" );}/* 初始化块 */{System.out.println( s_Field );System.out.println( "子类--初始化块" );}/* 构造器 */public SubClass(){System.out.println( "子类--构造器" );System.out.println( "i=" + i + ",j=" + j );}/* 程序入口 */public static void main( String[] args ){System.out.println( "子类main方法" );new SubClass();}
}

输出

父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
子类main方法
父类--变量
父类--初始化块
父类--构造器
i=9, j=0
子类--变量
子类--初始化块
子类--构造器
i=9,j=20

子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。静态变量、静态初始化块,变量、初始化块初始化了顺序取决于它们在类中出现的先后顺序。

分析

  • (1)访问SubClass.main(),(这是一个static方法),于是装载器就会为你寻找已经编译的SubClass类的代码(也就是SubClass.class文件)。在装载的过程中,装载器注意到它有一个基类(也就是extends所要表示的意思),于是它再装载基类。不管你创不创建基类对象,这个过程总会发生。如果基类还有基类,那么第二个基类也会被装载,依此类推。

  • (2)执行根基类的static初始化,然后是下一个派生类的static初始化,依此类推。这个顺序非常重要,因为派生类的“static初始化”有可能要依赖基类成员的正确初始化。

  • (3)当所有必要的类都已经装载结束,开始执行main()方法体,并用new SubClass()创建对象。

  • (4)类SubClass存在父类,则调用父类的构造函数,你可以使用super来指定调用哪个构造函数。基类的构造过程以及构造顺序,同派生类的相同。首先基类中各个变量按照字面顺序进行初始化,然后执行基类的构造函数的其余部分。

  • (5)对子类成员数据按照它们声明的顺序初始化,执行子类构造函数的其余部分。

类初始化

public class ClinitDemo {/*** 父类中定义的静态语句块要优于子类的变量赋值操作* JVM保证一个类的clinit方法在多线程中被正确加锁、同步*/static class Parent {public static int A = 1;static {A = 2;}}static class Sub extends Parent {public static int B = A;}public static void main(String[] args) {System.out.println(Sub.B);}}

输出2

static变量

public class Test {                                         static {                                                i = 0;  //  给变量复制可以正常编译通过                           
//        System.out.print(i);  // 这句编译器会提示“非法向前引用”         }                                                       static int i = 1;                                       static int j = 1;                                       static{                                                 j = 2;                                              }                                                       public static void main(String[] args){                 System.out.println(Test.i);  //1                    System.out.println(Test.j); //2                     }                                                       
}                                                           

不触发初始化实例

实例一二

/*** 被动使用类字段演示一:* 通过子类引用父类的静态字段,不会导致子类初始化**/
class SuperClass {static {System.out.println("SuperClass init!");}public static int value = 123;
}class SubClass extends SuperClass {static {System.out.println("SubClass init!");}
}/*** 非主动使用类字段演示**/
public class NotInitialization {public static void main(String[] args) {
//        System.out.println(SubClass.value);
//SuperClass init!
//123/*** 被动使用类字段演示二:* 通过数组定义来引用类,不会触发此类的初始化**/SuperClass[] sca = new SuperClass[10];}

实例三

/*** 被动使用类字段演示三:** 常量在编译阶段会存入调用类的常量池中,本质上没有直接引用到定义常量的类,* 因此不会触发定义常量的类的初始化。**/
public class ConstClass {static {System.out.println("ConstClass init!");}public static final String HELLOWORLD = "hello world";
}
public class Test {public static void main(String[] args){System.out.println(ConstClass.HELLOWORLD);}
}

输出

hello world

这里没有初始化ConstClass类,是因为在编译的时候,常量(static final 修饰的)会存入调用类的常量池【这里说的是main函数所在的类的常量池】,调用的时候本质上没有引用到定义常量的类,而是直接访问了自己的常量池。

参考

  • java类的初始化顺序(引了大半)

  • Java类加载的时机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Actionbarsherlock Demo 浅析 :Overlay

让Actionbar处于覆盖模式,当Activity需要显示大量滚动的内容,尤其是包含图片内容的时候,Overlay模式非常有效。 requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);//将Actionbar设置为Overlay模式。 getSupportActionBar().setBackg…

java中 怎么获取bean_java普通类如何得到spring中的bean类

在SSH集成的前提下。某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象。之前我在网上找了好几好久都没有找到合适的方法。例如:ApplicationContext context new ClassPathXmlApplicationContext();当时我觉得没有这个必要,浪费内存。…

浅析C#中构建多线程应用程序

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 引言 1.理解多线程 2. 线程异步与线程同步 3.创建多线程应用程序 3.1通过System.Threa…

58同城高性能移动Push推送平台架构演进之路

2019独角兽企业重金招聘Python工程师标准>>> 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比;移动Push推送第一阶段(单平台&#xff…

Android Studio 插件

https://plugins.jetbrains.com/?androidstudio转载于:https://www.cnblogs.com/xiaoyao095/p/4712552.html

resin指定java版本_resin的几个常用配置

本文着重介绍resin的几个常用配置注:1. 本文并非resin.conf的使用说明,只是从实用角度出发,按需分析常用的配置。更多的内容到官网学习吧;2. 基于resin3.x的探讨。(友情提示:刚下载的resin中,resin.conf里的…

Android生命周期函数执行顺序

转载自:http://blog.csdn.net/intheair100/article/details/39061473 程序正常启动:onCreate()->onStart()->onResume(); onCreate之后就会执行onStart,此时画面已经显示出来了,但还不能交互;然后执行onResume,此时可以与用…

hdoj-2028-Lowest common multiple plus

题目&#xff1a;Lowest common multiple plus 代码&#xff1a; #include<stdio.h> int common(int a,int b)//计算最大公约数 {int ca%b,t0;if(b>a){tb;ba;at;}while(a%b!0){ca%b;ab;bc;}return b; } int q[105]; int main() {int n,i,j,t0;while(scanf("%d&qu…

C#系统命名空间

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 一、基础命名空间 System.Collections 包含了一些与集合相关的类型,比如列表,队列,位数…

java不规则算法_分布式id生成算法 snowflake 详解

背景在复杂分布式系统中&#xff0c;往往需要对大量的数据和消息进行唯一标识。如在支付流水号、订单号等&#xff0c;随者业务数据日渐增长&#xff0c;对数据分库分表后需要有一个唯一ID来标识一条数据或消息&#xff0c;数据库的自增ID显然不能满足需求&#xff0c;此时一个…

Android中下载、安装和卸载(原)

应用场景&#xff1a;在检查版本更新的时候经常需要从服务器端下载然后安装到手机中 使用工具&#xff1a; XUtils&#xff0c;这个开源的框架真的是需要花大把时间去阅读和理解的&#xff0c;十分有用的&#xff0c;on the way &#xff01; fighting&#xff01; 下载&#x…

Android加载图片OOM错误解决方式

前几天做项目的时候&#xff0c;甲方要求是PAD &#xff08;SAMSUNG P600 10.1寸 2560*1600&#xff09;的PAD上显示高分辨率的大图片。 SQLITE採用BOLD方式存储图片&#xff0c;这个存取过程就不说了哈&#xff0c;网上一大堆。 可是在加载/读取/显示图片的时候会报OOM错误&am…

C# 对Ini文件操作(C# ini文件操作类)

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** /* C# 对Ini文件操作&#xff08;C# ini文件操作类&#xff09; [IniFiles.cs] 蝶晓…

python对文件进行读写操作

2019独角兽企业重金招聘Python工程师标准>>> python进行文件读写的函数是open或file file_handler open(filename,,mode&#xff09; Table mode 模式描述r以读方式打开文件&#xff0c;可读取文件信息。w以写方式打开文件&#xff0c;可向文件写入信息。如文件存在…

android:contentDescription

android:contentDescription这个属性相信大家并不陌生&#xff0c;在ImageButton的使用过程中如果不添加这个属性会有警告信息。 那么android:contentDescription究竟是干什么的呢&#xff1f;今天查了下资料才知道这个属性的真正作用。 该属性为视力障碍的用户提供方便&#x…

c#中bin,obj,properties文件夹的作用

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** Bin目录用来存放编译的结果&#xff0c;bin是二进制binrary的英文缩写&#xff0c;因为…

getAttribute实例例java_Java ExifInterface.getAttribute方法代码示例

import android.media.ExifInterface; //导入方法依赖的package包/类public static void copyExif(ExifInterface originalExif, int width, int height, String imageOutputPath) {String[] attributes new String[]{ExifInterface.TAG_APERTURE,ExifInterface.TAG_DATETIME,…

检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

判断图片是否缓存NSURL *url [NSURL URLWithString:[model.content objectForKey:"image"]];//请求网络地址数据的同步方法//因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题SDWebImageManager *manager [SDWebImageManager sharedManager];[man…

mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法...

发现问题 切换到mac平台后&#xff0c;突然想写点程序运行在mac下&#xff0c;想到mac自带java&#xff0c;会方便好多。不过在这过程中遇到了麻烦&#xff1a; 总是提示 “错误: 找不到或无法加载主类” 工程结构 查了好久&#xff0c;终于找到原型所在&#xff0c;发现网上很…

[转]VisualStudio如何组织解决方案的目录结构

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 解决方案与项目&#xff1a; 从VC6之后VC系列就使用解决方案&#xff08;Solution&…