初始化块

源代码:

class Root{
    static{
        System.out.println("Root的静态初始化块");
    }
    {
        System.out.println("Root的普通初始化块");
    }
    {
        System.out.println("Root的无参数初始化块");
    }
}
class Mid extends Root{
    static{
        System.out.println("Mid的静态初始化块");
    }
    {
        System.out.println("Mid的普通初始化块");
    }
    public Mid(){
        System.out.println("Mid的无参数构造器");
    }
    public Mid(String msg){
        this();
        System.out.println("Mid的带参数的构造器,其参数值:"+msg);
    }
}
class Leaf extends Mid{
    static{
        System.out.println("Leaf的静态初始化块");
    }
    {
        System.out.println("Leaf的普通初始化块");
    }
    public Leaf(){
        super("疯狂java讲义");
        System.out.println("执行Leaf的构造器");
    }
}
public class Java11 {
    public static void main(String[] args) {
        new Leaf();
        System.out.println(" ");
        new Leaf();
    }
}

运行结果:

1.初始化块只有两种,一种是static修饰的,另外一种是没有static修饰的,有static修饰的初始化块叫做静态初始化块;普通初始化块负责对对象执行初始化,静态初始化块则负责对类进行初始化;

2.初始化块执行的顺序是:先执行静态的初始化块,再执行动态的初始化块,但是在执行动态的初始化块的时候;要把构造器的因素考虑进来,即在程序中执行的初始化块的顺序是(此时考虑构造器):先执行完静态初始化块,然后按照非静态初始化和构造器的顺序由上至下依次执行;(上面的源代码就是例子)

3.虽然java允许在一个类里面定义两个普通初始化块,当时这其实是没有很大的意义的,因为初始化块是在创建java对象时隐式执行的,而且它总是全部执行,因此完全可以把多个普通初始化块合并成为一个初始化块;

4.如果有一段初始化处理代码对所有对象都完全相同,且无需接受任何的参数,就可以把这段初始化代码提取到初始化块中;

5.在编译了代码之后,初始化中的代码会被还原到每个构造其中,而且位于构造器所有代码的前面;

6.静态初始化块同样也属于类的静态成员,因此也需要遵循静态成员不能访问非静态成员的规则,因此静态初始化块不能访问非静态成员,包括不能访问实例变量和实例方法;

7.上面源代码中第二次引用构造器比第一次引用构造器少执行了三个静态初始化块,这是因为第一次初始化系统不存在Leaf类,所以要加载Leaf类,加载类是会引用静态初始化块的。而第二次中则由于Leaf类先前被加载了,所以系统以及存在了Leaf,不需要加载了。(在执行源代码中,类加载了一次就会一直存在于虚拟机中)

时间: 2024-11-13 03:46:51

初始化块的相关文章

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5

Java学习之初始化块

初始化块: 分类: 1.静态初始化块 2.非静态初始化块 语法: [修饰符]{ 初始化块逻辑 } 例子: 父类 public class Block { static { System.out.println("父类静态初始化块..."); } { System.out.println("父类非静态初始化块..."); } public Block(){ System.out.println("构造器..."); } } 子类 public cl

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

关于初始化块与构造函数的关系

public class A{ public static int nextID; public static int ID; public String name ; { ID = nextID; nextID++; } public a(){ this.name = ""; } public a(String name){ this.name = name; } } 当我们用构造方法构造对象的时候,比如员工,不管调用哪个构造方法,每new一个对象出来就会自动的给这个员工分配一个ID

java中的初始化块

public class Person { { System.out.println("Person初始化块"); } { if(1) { System.out.println("Person第二个初始化块"); } } public Person() { System.out.println("Person第二个初始化块"); } }

疯狂Java讲义(十一)---- 初始化块

普通初始化块 一个类里可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的先执行,后面定义的后执行. 初始化块的修饰符只能是static,使用static修饰的初始化块被称为静态初始化块. 普通初始化块.声明实例属性指定的默认值都可认为是对象的初始化代码,执行顺序与声明顺序相同. 当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始化,初始化顺序为:先执行初始化块或声明属性时制定的初始值,再执行构造器里指定的初始值

Java 中的 static 使用之静态初始化块

Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量. 而普通初始化块只要有创建一个实例(即new一次),就执行一次. 我们来看一段代码: 运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行

初始化块与构造方法

class InitializeBlockClass { {    field=200; }    public int field=100;    public InitializeBlockClass (int value){    this.field=value; } public InitializeBlockClass(){ }     public static void main(String[] args) {    // TODO Auto-generated method

java中的静态初始化块

Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量. 我们来看一段代码: 运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法.由于静态初始化块只在类加载时执行一次,所以当再次创建对

成员变量与初始化块

public class A { public int number = 5; { number = 10; } public static void main(String[] args) { A a = new A(); System.out.println(a.number); }} 这段代码的执行结果是a的值是10;下面将初始化块和成员变量交换一下顺序让成员变量在后面 public class A { { number = 10; } public int number = 5; pub