Java类的初始化顺序
Java类的初始化顺序
我把Java类的初始化顺序分为两部分。第一部分是类的初始化,第二部分是对象的初始化。
在初始化之前JVM必须先把该类的字节码加载到内存中来。这时不管创不创建对象都会马上执行类的初始化:
执行静态初始化表达式(如static int a = 10)和静态初始化块(即static{}中的内容),注意两者按在源代码中的先后顺序执行。
当创建一个对象,就会执行对象的初始化:
首先调用父类的构造函数。
第二步执行初始化表达式(如int a = 10)和初始化块({}中的内容),同样按在源代码中的先后顺序执行。
最后执行自身的构造函数。
对于静态初始化表达式与初始化表达式,如果只是声明,没有初始化,则赋默认值。如int i;则i会被赋值为0。
总结:
1、 类初始化
(1) 静态初始化表达式,静态初始化块
2、对象初始化
(1)父类的构造函数
(2)初始化表达式,初始化块
(3)自身的构造函数
注意:初始化表达式可能不是准确的术语,但明白是指什么就行了。
测试代码:
代码
package principle;
public class InitializeTest {
public static void main(String[] args) throws ClassNotFoundException{
System.out.println("-----类初始化-----");
Class.forName("principle.MyClass");
System.out.println("\n" + "-----对象初始化-----");
MyClass myClass = new MyClass();
}
}
class MyClass extends Father{
MyClass() {
System.out.println("3.自身的构造函数");
}
static int staticInt = 5; //如果放在static{}后面则编译不通过
static {
System.out.print("1.静态初始化表达式:staticInt=" + staticInt + "\t");
System.out.println("静态初始化块");
}
int instanceInt; //将会被赋默认值0
{
System.out.print("2.初始化表达式:instanceInt=" + instanceInt + "\t");
System.out.println("初始化块");
}
}
class Father {
Father() {
System.out.println("1.父类的构造函数");
}
}
输出结果:
-----类初始化-----
1.静态初始化表达式:staticInt=5 静态初始化块
-----
相关文档:
一、向上转型。
通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。
1,向上转型中的方法调用。
看下面代码:
package com.wensefu.others;
public class Animal {
public void eat(){
System.out.println("animal eatting...");
}
}
class Bird extends Animal{
public void ......
1.
BufferedReader in = new BufferedReader(new FileReader("远程文件"));
in.readLine() ;
l 使用 Java 操作文本文件的方法详解
http://java.ccidnet.com/art/3737/20041108/523627_1.html
l FileReader 是什么类?和 FileInputStream 有什么不同???
ht ......
自Java2以来,Java语言增加了一个关键字strictfp,虽然这个关键字在大多数场合比较少用,但是还是有必要了解一下。
strictfp 的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成 ......
Publication and Escape 发布一个对象意味着能够从它能够从它当前范围之外被访问到。比如,保存可以被其他代码找到的这个对象的一个引用,或者将其作为一个非私有方法的返回值,或者将其作为参数传递给其它的类。 public static Set<Secret> knownSecrets;
public void initialize() {
knownSecrets = new Ha ......