在复习Thinking in java的过程中看到了相关内容,顺便整理一下,像下面一样的代码具体的执行顺序(ABCD都是类)

public class A {
public A(String text){
System.out.println("A was built :"+text);
} D b1=new D("d in A"); static{
System.out.println("A Static Code out of constructor");
}
static D b2=new D("static b in A");
{
System.out.println("A Code out of constructor");
}
}

之前自己已经知道了,今天复习《Thinking in Java》又看到了这一段,在这里用代码来看看结果。最后给大家一个结论 代码如下(虽然有点长,但是仔细看还是挺简单的)

public class A {
public A(String text){
System.out.println("A was built :"+text);
}
D b1=new D("d in A"); static{
System.out.println("A Static Code out of constructor");
}
static D b2=new D("static b in A"); {
System.out.println("A Code out of constructor");
} }
class B extends A{
static{
System.out.println("B Static Code out of constructor");
} {
System.out.println("B Code out of constructor");
}
public B(String text){
super(text);
System.out.println("B was built :"+text);
}
}
class D{
public D(String text){
System.out.println("D was built :"+text);
}
public static void fsdaf(){ }
} class C{ static{
System.out.println("C static code out of constructor");
}
public C(String text){
System.out.println("C was built :"+text);
}
} class TestABC{
public static void main(String[] args) {
// A testA=null;
A testA=new A("testA");
System.out.println("********************************");
A testAf=new A("testA");
System.out.println("--------------------------------");
B testB=new B("testB");
System.out.println("********************************");
C testC=new C("testC"); }
}

结果如下

A Static Code out of constructor
D was built :static b in A
D was built :d in A
A Code out of constructor
A was built :testA
********************************
D was built :d in A
A Code out of constructor
A was built :testA
--------------------------------
B Static Code out of constructor
D was built :d in A
A Code out of constructor
A was built :testB
B Code out of constructor
B was built :testB
********************************
C static code out of constructor
C was built :testC

从上面可以看出,如果没有继承父类 那么执行的顺序是

1.static类型的对象和代码段(那个在前面先执行哪个 且该类没有被实例化过)

2.类中非static的代码段

3.构造函数 如果该类已被实例化过,那么static的内容就不会再次被执行。

如果继承了父类 那么执行顺序是

1.父类中static类型的对象和代码段(哪个在前面先执行哪个 且该类没有被实例化过)

2.子类中的static类型的对象和代码段(哪个在前面先执行哪个 且该类没有被实例化过)

3.父类中的代码段

4.父类的构造函数

5.子类中的非静态代码段

6.子类构造函数

另外static的内容并不是代码写好就已经被执行,而是必须在使用到、类加载或者实例化的时候才会运行,这一点需要注意

java类初始化的过程的更多相关文章

  1. Java类初始化

    Java类初始化 成员变量的初始化和构造器 如果类的成员变量在定义时没有进行显示的初始化赋值,Java会给每个成员变量一个默认值 对于  char.short.byte.int.long.float. ...

  2. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

  3. 【知识总结】Java类初始化顺序说明

    微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...

  4. Java类初始化和实例初始化过程

    1.类初始化过程 一个类要创建实例需要先加载并初始化该类 main方法所在的类需要先加载和初始化 一个子类要初始化需要先初始化父类 一个类初始化就是执行<client>()方法(编译器生成 ...

  5. Java 类初始化和实例初始化过程

    1.类初始化过程 2.实例初始化过程 3.方法的重写

  6. [读书笔记] java类初始化

    以下内容来自周志明的<深入理解java虚拟机>: 类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导 ...

  7. 转!!关于java类初始化顺序

    原文地址:http://www.cnblogs.com/luckygxf/p/4796955.html 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方 ...

  8. JAVA 对象初始化的过程

    对象初始化的过程例:Student S    =    new Student();1.因为new Student()用到了Student类,所以会把它从硬盘上加载进入内存2.如果有static静态代 ...

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

    Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论:     1 .继承体系的所有静态成员初始化( ...

随机推荐

  1. iOS之新浪微博的OAuth授权

    新浪微博的OAuth授权 之前通过新浪微博开发平台写过微博的的项目,现在就开始总结下各个方面的知识点,一个是为了加深印象.巩固知识,另一个记录自己学习过程,希望自己在开发这条路上有所积累,为以后的道路 ...

  2. sql server 日期

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  3. 网络知识学习4---(DNS的作用)

    1.DNS 简介 DNS是域名解析协议 在互联网中通过IP 地址来进行通信.但是IP 地址的表示形式是数字,很难进行记忆(比如116.213.120.232),所以为每个 IP取一个人类更易记忆的域名 ...

  4. Hadoop学习笔记(2) 关于MapReduce

    1. 查找历年最高的温度. MapReduce任务过程被分为两个处理阶段:map阶段和reduce阶段.每个阶段都以键/值对作为输入和输出,并由程序员选择它们的类型.程序员还需具体定义两个函数:map ...

  5. js 数据类型问题

    1. alert(type of 变量名) console.log(type of 变量名); 可以答应数据类型 2.var cost_price=parseFloat(parseFloat($(&q ...

  6. MIT 6.828 JOS学习笔记8. Exercise 1.4

    Lab 1 Exercise 4 阅读关于C语言的指针部分的知识.最好的参考书自然是"The C Programming Language". 阅读5.1到5.5节.然后下载poi ...

  7. CSS3动画里的过渡效果

    过渡效果中有: 1平滑效果 2线性过渡 3由慢到快 4由快到慢 5慢-快-慢  等等 具体参考 w3chool 例如: <body> <div class="out&quo ...

  8. 深入分析@Transactional的用法

    关键词:事务, 编程式事务,声明式事务.spring 事务管理.AOP事务增强.@Transactional 在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. ...

  9. requirejs的用法(二)

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...

  10. 微信 winwre 移动调试

    如果 微信服务号无法连接 网络,关闭window 防火墙