在查看别人代码的时候 看到了 static静态代码块 之后经过搜索和自己的亲试,下面贴出测试代码和解释。
package Test;
public class TestA {
static {
System.out.println("父类--静态代码块");
}
public TestA() {
System.out.println("父类--构造方法");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new TestB();
}
}
class TestB extends TestA {
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public Test() {
System.out.println("子类--构造方法");
}
}
跑起来的结果是:
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造方法
子类--非静态代码块
子类--构造方法
在这个代码中,代码的执行顺序,就是 在主类中首先执行static静态代码块中的代码,同理,之后在主函数中 建立了TestB对象,在执行构造函数之前,首先查看TestB中是否有static静态块,之后首先执行了静态代码块中的代码。当TestB的静态代码块执行完毕之后,它接着又去看A有没有非静态代码块,如果有就执行A类的非静态代码块,A的非静态代码块执行完毕,接着执行A的构造方法;A的构造方法执行完毕之后,它接着去看B有没有非静态代码块,如果有就执行B的非静态代码块。B类的非静态代码块执行完毕再去执行B类的构造方法,这个就是一个对象的初始化顺序。
噫,,写出来了好像挺麻烦的。。大致就是 1静态代码块 -->2非静态代码块 -->3构造方法
然后进行了有一个测试:
这个测试是测试是否一定是静态块先执行。
package Test;
public class TestA2 {
private static TestA2 a = new TestA2();
static {
System.out.println("父类--静态代码块");
}
public TestA2() {
System.out.println("父类--构造方法");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new TestB2();
}
}
class TestB2 extends TestA2 {
private static TestB2 b = new TestB2();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public TestB2() {
System.out.println("子类--构造方法");
}
}
结果如下:
父类--非静态代码块
父类--构造方法
父类--静态代码块
父类--非静态代码块
父类--构造方法
子类--非静态代码块
子类--构造方法
子类--静态代码块
父类--非静态代码块
父类--构造方法
子类--非静态代码块
子类--构造方法
这里先new了一个 静态的对象
private static TestA2 a = new TestA2();
而 在静态代码块和创建静态对象时,是按照 代码的顺序执行的,就是说 需要执行完 这个创建对象的语句才能执行下面的 静态代码块中的语句。所以给人的感觉像是“跳过了”静态代码块,所以一开始是:1非静态代码块2构造方法。之后执行完了 创建对象的语句,继续执行,即静态代码块。之后就是在主类中创建一个TestB2对象,像上面的测试一样,不同的也只是在执行创建对象语句静态代码块和顺序的问题。而执行了两次非静态代码和构造方法的原因就是,一次是创建静态对象时,一次是执行完静态方法后的执行。
总结:
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
相关推荐
本案例是一个通过静态代码块获取资源属性文件的代码块,从而来提高应用性能。。
java静态代码块与非静态代码块.doc
java静态代码块与非静态代码块参照.pdf
Java的静态代码块、非静态代码块、构造函数的简单的java代码
主要介绍了java 代码块与静态代码块加载顺序的相关资料,需要的朋友可以参考下
主要介绍了Java静态代码块作用及执行顺序解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在Java中静态代码块的使用,及静态代码块的相关基础知识
下面小编就为大家带来一篇Java 普通代码块静态代码块执行顺序(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题
主要介绍了Java静态代码块加载驱动代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
其中静态代码在类的初始化阶段被初始化。而非静态代码则在类的使用阶段(也是实例化一个类的时候)才会被初始化。 静态变量 可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象...
java 静态块实例块构造器调用在继承中的调用顺序,包括代码及注释
关于 static 静态代码块的一点东西 静态代码块(static block ),不包含在任何方法体中当类被载入时,自动执行静态代码块,且只被执行一次经常用于类属性的初始化。 这是网上通行的关于静态代码块的定义。 在Java...
1 静态变量,静态代码块(类加载时执行,类不加载不执行) 2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行) 3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private...
主要介绍了Java构造代码块,静态代码块,结合实例形式分析了Java构造代码块,静态代码块的功能、原理、用法及操作注意事项,需要的朋友可以参考下
主要介绍了Java 中普通代码块,构造代码块,静态代码块区别及代码示例的相关资料,需要的朋友可以参考下
构造代码块和静态代码块的执行时机
对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。
下面小编就为大家带来一篇java中的静态代码块、构造代码块、构造方法详解。小编觉得挺好的,现在分享给大家。给大家一个参考。一起跟随小编过来看看吧
主要给大家介绍了关于Java中静态代码块执行的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。