[java] java中的初始化顺序
先看程序:
package init_cls;
class A{
{System.out.println("i am in the class A!");}
static { System.out.println("static is the class A");}
}
public class init_cls {
{System.out.println("i am in the init_cls");}
static{System.out.println("i am static in the init_cls class");}
public static void main(String[] args) {
// TODO Auto-generated method stub
A a=new A();
init_cls c=new init_cls();
}
}
运行结果为:
i am static in the init_cls class
static is the class A
i am in the class A!
i am in the init_cls
从结果中可以看到,当我们只是使用一个类中的方法的时候(在这里使用的init_cls中的main),只初始化静态变量,所以最先输出:i am static in the init_cls class
之后当实例化一个类A的时候,先初始化其中的静态域static ,所以输出:static is the class A
之后初始化非静态域,所以输出:i am in the class A!
最后,只有当我们实例化init_cls类的时候,才初始化了类A中的非静态域,有了输出:i am in the init_cls
类是在任何static成员被访问时候被加载的,构造器也属于static方法,每个类被加载前都会先加载其基类。
这些和python中的初始化顺序非常不同,在python中加载一个包的时候,会从上到下全部初始化,遇到语句时候全部执行
顺便看一个java版的单例模式:
public class singleton {
private singleton(){System.out.println("created!");}
private static singleton obj=new singleton();
public static singleton create(){
return obj;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
singleton s1 = singleton.create();
singleton s2 = singleton.create();
System.out.println(s1==s2);
}
}
其中,第3行obj要用static就是因为类singleton没有实例化,obj也就没有初始化,那么create()中就没有obj可以return,但是如果obj为static的话,在main()中,用
singleton.create()之前,就会先把obj初始化。
类是在任何static成员被访问时候被加载的,构造器也属于static方法,每个类被加载前都会先加载其基类。
那么在继承结构中的初始化顺序是怎么样的?
class JC1{
{System.out.println("3");}
static {System.out.println("1");}
}
class JC2 extends JC1{
{System.out.println("4");}
static {System.out.println("2");}
}
public class jicheng {
public static void main(String[] args) {
// TODO Auto-generated method stub
JC2 jc = new JC2();
}
}
输出结果:
1
2
3
4
可以看书,在继承结构中,先初始化基类-子类的静态变量,再初始化基类-子类的非静态变量
参考资料:thinking in java
[java] java中的初始化顺序的更多相关文章
- java类中元素初始化顺序
结论:对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. public class Test4 { @Tes ...
- java继承中的初始化顺序
初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类 ...
- java类中元素初始化顺序详解
父类静态变量父类静态块子类静态变量子类静态块父类普通变量父类普通块父类构造方法子类普通变量子类普通块子类构造方法
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)
本文链接 http://blog.csdn.net/xiaodongrush/article/details/29170099 參考文章 http://my.oschina.net/le ...
- Java 类成员的初始化顺序
Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. 1 无继承情况下的Jav ...
- java类的成员初始化顺序和初始化块知识
java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...
- Java静态方法,静态变量,初始化顺序
1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...
- Java类的成员初始化顺序
Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...
随机推荐
- Postgresql数据库安装中文全文搜索插件zhparser的问题
在PG数据库的基础上加装zhparser中文全文搜索插件,说实话,挺怕这些单独编译安装的插件的,因为安装PG数据库方法的不同,最后可能导致安装的插件各种安装不上,这里说一下我遇到的坑,系统环境是Cen ...
- 【BZOJ】3456: 城市规划 动态规划+多项式求逆
[题意]求n个点的带标号无向连通图个数 mod 1004535809.n<=130000. [算法]动态规划+多项式求逆 [题解]设$g_n$表示n个点的无向图个数,那么显然 $$g_n=2^{ ...
- 20145234黄斐《Java程序设计》第五周
教材学习内容总结 第八章部分 - 异常处理 语法与继承架构 使用try...catch 首先要明确一点:Java中所有错误都会打包为对象 JVM会尝试执行try区块中的程序代码,如果发生错误,执行程序 ...
- 基本控件文档-UILabel属性
CHENYILONG Blog 基本控件文档-UILabel属性 Fullscreen UILabel属性技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http ...
- mac nginx 安装及PHP配置
安装nginx 1.安装brew命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mas ...
- linux nginx大量TIME_WAIT的解决办法--转
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 8535 CLOSE_WAIT 5 FIN ...
- Gh0st配置加密与解密算法(异或、Base64)
1.前言 分析木马程序常常遇到很多配置信息被加密的情况,虽然现在都不直接分析而是通过Wireshark之类的直接读记录. 2017年Gh0st样本大量新增,通过对木马源码的分析还发现有利用Gh0st加 ...
- python内置模块之itertools
前言 itertools模块是python内置的迭代器模块,定义了可生成多种迭代器的函数,用来代替可迭代对象的遍历等操作,节约内存. 迭代器函数的类型 无限迭代器:包括count.cycle.repe ...
- shell脚本练习题->1
猜随机数的大小 描述: 写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入:并且提示用户输入的数字比预设数字大或者小 分析: 1:随机数字 ...
- 04 Go 1.4 Release Notes
Go 1.4 Release Notes Introduction to Go 1.4 Changes to the language For-range loops Method calls on ...