Java靜態初始化與構造方法的執行順序
来源:互联网 发布:java多线程详解 编辑:程序博客网 时间:2024/06/05 13:21
import static net.mindview.util.Print.*
class Insect{
private int i=9;
protected int j;
Insect(){
print("i="+i+",j="+j);
j=39;
}
private static int x1=printInit("static Insect.x1 initialized");
static int printInit(String s){
print(s);
return 47;
}
}
public class Beetle extends Insect{
private int k=printInit("Beetle.k initialized");
public Beetle(){
print("k="+k);
print("j="+j);
}
private static int x2=printInit("static Beetle.x2 initialized");
public static void main(String[] args){
print("Beetle constructor");
Beetle b=new Beetle();
}
}
输出结果是:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i=9,j=0
Beetle.k initialized
k=47
j=39
class Insect{
private int i=9;
protected int j;
Insect(){
print("i="+i+",j="+j);
j=39;
}
private static int x1=printInit("static Insect.x1 initialized");
static int printInit(String s){
print(s);
return 47;
}
}
public class Beetle extends Insect{
private int k=printInit("Beetle.k initialized");
public Beetle(){
print("k="+k);
print("j="+j);
}
private static int x2=printInit("static Beetle.x2 initialized");
public static void main(String[] args){
print("Beetle constructor");
Beetle b=new Beetle();
}
}
输出结果是:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i=9,j=0
Beetle.k initialized
k=47
j=39
因为是静态方法。
JAVA初始化顺序
1、调用顺序:
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
其他说明:
2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法
5、类消除时候,首先消除子类部分,再消除父类部分
JAVA初始化顺序
1、调用顺序:
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
其他说明:
2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法
5、类消除时候,首先消除子类部分,再消除父类部分
class A {
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A {
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Hello{
public static void main(String[] arge){
System.out.println(" ");
A ab = new B();
System.out.println(" ");
ab = new B();
}
}
最后输出是1a2b
2b
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A {
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Hello{
public static void main(String[] arge){
System.out.println(" ");
A ab = new B();
System.out.println(" ");
ab = new B();
}
}
最后输出是1a2b
2b
変一下
class a{
static{
System.out.println("1");
}
public a(){
System.out.println("2");
}
}
class b extends a{
static{
System.out.println("a");
}
public b(){
System.out.println("b");
}
}
public class d {
public static void main(String[] args) {
// TODO 自动生成方法存根
System.out.println("空格");
a ab=new a();
System.out.println("空格 ");
ab=new b();
}
}
結果為:
空格
1
2
空格
a
2
b
1
2
空格
a
2
b
最后為什么會多一個a呢? 因為這里類b并沒初始化!
再來一個例子
class d
{ static int x=10;
static { x+=5;}
public static void main(String[] args)
{System.out.println("x=" + x);}
static { x/=5;} }
{ static int x=10;
static { x+=5;}
public static void main(String[] args)
{System.out.println("x=" + x);}
static { x/=5;} }
執行結果是多少呢?
x=3
0 0
- Java靜態初始化與構造方法的執行順序
- JAVA对象数组的初始化方法
- 一种少见的Java初始化方法
- JAVA对象数组的初始化方法
- Java中两种字符串初始化方法的区别
- Java中两种字符串初始化方法的区别
- JAVA对象数组的初始化方法
- Java中两种字符串初始化方法的区别
- java中初始化对象变量的方法
- Java重写方法与初始化的注意事项
- Java重写方法与初始化的隐患
- Java重写方法与初始化的隐患
- Java重写方法与初始化的隐患
- JAVA中初始化数据的方法?
- Java 数组初始化的两种方法
- java中类的方法初始化顺序
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造方法)
- 初始化(2)--初始化的方法
- 命令模式
- Android   Intent 的几种启动活动的方式
- 数组与指针的区别
- C++中引用和指针的区别
- Java中的线程间协作
- Java靜態初始化與構造方法的執行順序
- shell 中 关于 $
- CComboBoxEx 扩展组合框
- 重定向 关闭文件描述符等
- 重定向 禁止命令输出
- 创建临时文件 临时目录
- tee命令 管道
- 结构型模5:外观模式(Façade Pattern)
- Shell 使用函数输出