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 静态初始化块
-----
相关文档:
系统自动抛出的异常
所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。
语句抛出的异常
用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。
throw是语句抛出 ......
package com.softeem.jbs.lesson4;
import java.util.Random;
/**
* 排序测试类
* 排序算法的分类如下:
* 1.插入排序(直接插入排序、折半插入排序、希尔排序);
* 2.交换排序(冒泡泡排序、快速排序);
* 3.选择排序(直接选择排序、堆排序);
* 4 ......
Publication and Escape 发布一个对象意味着能够从它能够从它当前范围之外被访问到。比如,保存可以被其他代码找到的这个对象的一个引用,或者将其作为一个非私有方法的返回值,或者将其作为参数传递给其它的类。 public static Set<Secret> knownSecrets;
public void initialize() {
knownSecrets = new Ha ......
昨天写了用面向对象的思想去分析一个实际的问题,呵呵,那么今天就就类和对象做一个详细的讨论。
昨天说了在CS中人物可能是一个抽象类或一个接口,而各种各样的人物就是继承或实现了这个接口,而说到这里我们还在讨论类,还没有涉及到对象,那么什么时候产生的对象呢?那是咱登陆了CS后选择了一个人物,然后再我们选好的同 ......
关键字: java sizeof
在C/C++中,当我们想知道一个对象或者一个原始数据类型所占用的内存大小时,只需简单调用sizeof操作符即可,但是,在java中是没有相应的操作符或者方法来直接完成相应功能的。sizeof 在C/C++得到大量的运用,是程序员必不可少的工具之一,那么为什么java却不提供呢?要回 ......