Java的静态块与实例块(转)

1.当一个类被第一次使用时,它需要被类加载器加载,而加载过程涉及以下两点:

(1)在加载一个类时,如果它的父类还未被加载,那么其父类必须先被加载;

(2)当类加载到内存之后,按照在代码中的出现顺序执行它的静态数据域和静态块。

2.调用一个类的构造函数时,调用过程涉及以下三点:

(1)调用父类的构造函数;

(2)按照在代码中出现顺序初始化实例数据域和实行实例块;

(3)执行其构造函数体。

public class InitializationDemo {

    public static void main(String[] args) {

        new InitializationDemo();
    }

    public InitializationDemo() {

        new B();
    }

    {
        System.out.println("2. Initialization 的实例块。");
    }

    static {
        System.out.println("1. Initialization 的静态块。");
    }

}

class A {

    A() {
        System.out.println("6. A 的构造函数体。");
    }

    {
        System.out.println("5. A 的实例块。");
    }

    static {
        System.out.println("3. A 的静态块。");
    }
}

class B extends A {

    B() {
        System.out.println("8. B 的构造函数体。");
    }

    {
        System.out.println("7. B 的实例块。");
    }

    static {
        System.out.println("4. B 的静态块。");
    }
}

  

上面的例子在类中各个部分输出对应的文字,以便从输出中看出其执行顺序。

对应的输出如下:

1. Initialization 的静态块。

2. Initialization 的实例块。

3. A 的静态块。

4. B 的静态块。

5. A 的实例块。

6. A 的构造函数体。

7. B 的实例块。

8. B 的构造函数体。

由输出可以看出程序执行的顺序如下:

1.首先,要使用Initialization类,则加载Initialization类,所以它的静态块被执行,于是输出1;

2.程序调用Initialization的构造函数,所以Initialization类的实例块被执行,于是输出2;

3.然后,执行Initialization的构造函数体,即new B(),这时因为要使用类B,所以将其加载;

4.因为类B的父类为A,那么在加载B之前,要先加载A,所以这时候执行A的加载过程,即执行A的静态块,于是输出3;

5.A加载完之后,这时候就到B加载了,这时执行B的加载过程,即执行B的静态块,于是输出4;

6.加载完成后,这时候按照代码,执行new B(),即B的构造函数,所以这时又要先调用父类A的构造函数,于是这时依次执行A的实例块和构造函数体,输出5和6;

7.最后,终于到“真正”执行B的构造函数了(因为之前已经一直在说执行new B(),却是一直在调用其他),于是依次执行B的实例块和构造函数体,输出7和8。

时间: 2024-08-06 09:15:09

Java的静态块与实例块(转)的相关文章

java 静态块和构造块等执行顺序分析学习

构造块:在类成员变量区域用大括号括起来的代码,和方法相比没有修饰,没有返回,没有参数:静态块:在构造块前加 static修饰静态代码块:静态块+静态变量非静态代码块:普通类成员变量+构造块 程序执行顺序:静态代码块->非静态代码块->类构造方法 1 public class Test { 2 3 static { 4 System.out.println("静态块"); 5 } 6 7 { 8 System.out.println("构造块"); 9 }

HDFS API的java代码分析与实例

HDFS API的java代码分析与实例 1.HDFS常用的方法,我已经写好,我们看一下 // Create()方法,直接在HDFS中写入一个新的文件,path为写入路径,text为写入的文本内容 public static void  Create(String path,String text) throws IOException {             Configuration conf=new Configuration();                  conf.set(

java中的静态初始化块

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

java中可以让实例改变了类Feild(java这么干就是一个错误,你看到了就当做是类在该修改或这个类Feild)

class Person { public String name;//定义实例Feild public static int eyeNum;//定义类Feild } public class PersonTest { public static void main(String[] args) { System.out.println("Person的eyeNum的类Feild值是:" + Person.eyeNum); } } 运行: [[email protected] java

java中类的静态代码块、构造代码块、构造方法、静态成员的初始化顺序详解

一.描述 java中类的静态代码块.构造代码块.构造方法.静态成员的初始化顺序: 首先,在类加载时,为类中的静态成员变量分配内存空间,并为其赋予默认值(整数型为0,浮点型为0.0,布尔型为false,字符型为'\u0000',引用型为null): 其次,执行静态成员变量的显式初始化操作.静态成员的初始化方法有两种,其一为在声明的时候直接初始化,其二为使用静态代码块进行初始化, 这两种初始化方式会按照在类中的出现顺序来执行,而且只在类加载的时候执行一次. 再次,如果创建了类的对象,便会在堆中为类的

java中多线程通信实例:生产者消费者模式

线程间的通信: 其实就是多个线程再操作同一个资源,但是操作的动作不同   当某个线程进入synchronized块后,共享数据的状态不一定满足该线程的需要,需要其他线程改变共享数据的状态后才能运行,而由于当时线程对共享资源时独占的,它必须解除对共享资源的锁定的状态,通知其他线程可以使用该共享资源. Java中的 wait(),notify(),notifyAll()可以实现线程间的通信. 生产者--消费者问题是典型的线程同步和通信问题 /** * 生产者和消费者问题,生产者生成出产品,消费者去购

java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名.成员这个方式,因为静态成员是属于类的,并不是属于具体的对象 c#中     只能通过类名.成员调用,并不能 用实例来进行调用 2.c#的静态构造函数和java中的构造代码块.静态代码块 c# 静态构造函数的特点:        1)静态构造函数不需要手动调用,系统自动调用        2)静态构造

java学习教程之代码块

学编程吧java学习教程之代码块发布了,欢迎通过xuebiancheng8.com来访问 java中的代码块包括下面几种: 1.普通代码块 2.构造代码块 3.静态代码块 1.普通代码块很简单看下面这个例子: public class Test{ public static void main(String args[]){ { //此处就是普通代码块,普通代码块中的代码按顺序执行 System.out.println("hello"); } } } 2.构造代码块 public cl

java mail 邮件发送实例【搬】

说明:转自国外博客:欢迎查阅原作 该实例较新,简明易懂,值得新手借鉴 以gmail为例,注意: 1.通过TLS方式发送 1 package com.mkyong.common; 2 3 import java.util.Properties; 4 5 import javax.mail.Message; 6 import javax.mail.MessagingException; 7 import javax.mail.PasswordAuthentication; 8 import java