Java类的静态块の一

类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次。

下面这个例子可以帮助理解:

 1 package untility;
 2
 3 public class A {
 4     // 静态块
 5     static {
 6         A c ;
 7         System.out.println(200);
 8         c = new A();
 9         i = 10;
10     }
11
12     public static int i;
13     public int j;
14
15     public A() {
16         System.out.println(A.i);
17         System.out.println(j);
18     }
19
20     public static void main(String[] args) {
21         A a = null;
22         System.out.println(100);
23         a = new A();
24         //A b = new A();
25     }
26 }

运行结果:

200
0
0
100
10
0

解析:

程序从main方法进去,执行到21行代码加载类,然后执行static模块,继续执行到第6行,再次加载类,再次运行到static模块,此时第6行已经被执行过一次,所以不会再被执行(写完Java类的静态块の二发现这里的描述是有问题的,这里不会重复加载A类,只会重复往下执行第7行),然后执行第7行,所以第一个被打印出来是200,然后执行第8句的构造函数(没有执行到第9句,所以i和j都是0),打印出来2个0,然后继续执行static模块中的第9句,此时i=10,到此加载类完成,然后继续执行21行的=null语句,在执行22行的打印,输出100,最后执行第23行的构造函数,打印出来10 0(因为i是静态的)。

时间: 2024-11-03 03:30:39

Java类的静态块の一的相关文章

Java类的静态块の二

在上一篇Java类的静态块の一中介绍到:类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次. 但是在下面的例子中却发现JVM并不是把把所有的static模块都执行完成再执行其他(Java果然是解释性语言): 1 /** 2 * 单例模式 之 饿汉模式 3 * 4 * @author Administrator 5 * 6 */ 7 public class SingletonStarving { 8 static { 9 System.out.println("this is Star

Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序

前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论 这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下: 实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行) 实现自身的非静态属性和

Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

Java 类的实例变量初始化的过程 静态块.非静态块.构造函数的加载顺序 先看一道Java面试题: 1 public class Baset { 2 private String baseName = "base"; 3 // 构造方法 4 public Baset() { 5 callName(); 6 } 7 // 成员方法 8 public void callName() { 9 // TODO Auto-generated method stub 10 System.out.p

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java 类成员的初始化顺序

Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. ? 1 ?无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test { static Samp

Android(java)学习笔记136:Java类初始化顺序

Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化(先父类,后子类) 2 .父类初始化完成(普通成员的初始化-->构造函数的调用) 3 .子类初始化(普通成员-->构造函数) Java初始化顺序如图: 代码演示: class Sample { Sample(String s) { System.out.println(s); } Sample() { Sy

分析java类的静态成员变量初始化先于非静态成员变量

分析java类的静态成员变量初始化先于非静态成员变量 依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过 连接 验证:对字节码进行验证 准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,static final修饰的常量直接赋予相应的值) 解析:类中符号引用转换成直接引用 初始化:为类的静态变量/静态语句块初始化相应的值 而类的初始化契机是:类在被第一次主动使用的情况下,主动使用包括以下6中情况: 使用new关键字实例化对象时. 调用

JAVA类的加载顺序

JAVA类的加载顺序 JAVA中类的初始化规则是:先初始化static成员变量和static块,再初始化non-static成员变量和non-static块,最后初始化构造函数. 例1: package demo; /** * 此类主要介绍java类的加载顺序 * */ public class TestOrder { public static int k = 0; public static TestOrder t1 = new TestOrder("t1"); public st

Java 类与对象的初始化

面试的时候,经常会遇到这样的笔试题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和静态块,它们只包含一些简单的输出字符串到控制台的代码,然后让我们写出正确的输出结果.这实际上是在考察我们对于类的初始化知识的了解. 首先,我们先看看下面的代码,这就是很经典的考察方式. public class InitField { public static void main(String[] args) { SuperInitField p = new SuperInitField();