读书人

java 的运作过程

发布时间: 2012-10-12 10:17:04 作者: rapoo

java 的运行过程

例子看ChineseBreakfast.java构造对象时,先给属性赋值,后调用构造方法创建对象的执行顺序1 分配内存2 初使化变量,给默认初值3 赋值(可选)4 执行本类的构造方法java的运行过程1 调用super();this();2 调用父类构造方法a 调用super();this();b 调用父类构造方法3 初使化本类实例变量4 执行本类构造方法java的运行过程 一,我们所看不到的: 1,如果java文件没有package,就默认给文件加上"无名"package; 2,默认导入java.lang包,所以我们的java程序中可以使用Sting,Math,Integer等类,包括一些异常类; 3,如果生成的类没有父类,则为这个类隐式加上父类:Object;因此,包括Object中的许多方法可以使用; 4,字段的初始化; 二,我们所看的到的: 既然看的到,就先看程序运行结果: package com.andrew;public class Test {    public Test() {        System.out.println(" 构造函数");    }    static {        System.out.println("static{}");    }    {        System.out.println("{}");    }    public static void main(String[] args) {        System.out.println("main()");    }}运行结果: static{} main() 显然,程序运行时,先运行: static { System.out.println("static{}"); } 再调用main(); 注意: 我们可以得到一个副产品:不用main方法也能运行的程序: public class JRun1 { static { System.out.println("no main()"); System.exit(0); } } 如果我们在类中建立一个对象: package com.andrew;public class Test {    public Test() {        System.out.println(" 构造函数");    }    static {        System.out.println("static{}");    }    {        System.out.println("{}");    }    public static void main(String[] args) {        System.out.println("main()");        new Test();    }}运行结果: static{} main() {} 构造函数 从而,我们得出: 建立一个非主类对象,顺序为:静态初始化块static{}-->初始化块{}-->构造函数constructor; 那么,牵涉到继承,运行流程又如何? 看程序: package com.andrew;class JRun1Father {    JRun1Father() {        System.out.println("父类构造函数");    }    static {        System.out.println("父类静态初始化块");    }    {        System.out.println("父类初始化块");    }}public class Test extends JRun1Father {    public Test() {        System.out.println("子类构造函数");    }    static {        System.out.println("子类静态初始化块");    }    {        System.out.println("子类初始化块");    }    public static void main(String[] args) {        // System.out.println("主方法)");        new Test();    }}运行结果: 父类静态初始化块 子类静态初始化块 父类初始化块 父类构造函数 子类初始化块 子类构造函数 所以,牵涉到父类:父静态-->子静态-->父初始化及构造-->子初始化及构造; 注意:初始化块和构造是接连运行的,不会父类子类交替. *///pack.javaclass superPack {    superPack() {        System.out.println("父类构造函数");    }    {        System.out.println("父类初始化代码块");    }    static {        System.out.println("父类静态代码块");    }}class subPack extends superPack {    subPack() {        System.out.println("子类构造函数");    }    {        System.out.println("子类初始化代码块");    }    static {        System.out.println("子类静态代码块");    }};public class pack {    pack() {        System.out.println("pack构造函数");    }    static {        System.out.println("pack静态代码块");    }    {        System.out.println("pack初始化代码块");    }    public static void main(String[] args) {        superPack testPack = new subPack();    }};/*静态初始化块static{}在类加载时被执行并且只执行一次静态初始化块static{}不用创建对象也能被执行初始化块{}得创建对象才能执行并且优先于构造方法实例变量优先于初始化块{}运行结果: 父 静父类静态实例变量父类静态初始化块 子 静子类静态实例变量子类静态初始化块 调用super();this();父 实父 初始化块{}调用父类构造方法a 调用super();this();b 父 实c 父 初始化块{}d 调用父类构造方法3 初使化本类实例变量4 本类 初始化块{}5 执行本类构造方法程序块执行顺序(加载类连接相关资源Main方法)静态变量最好排在静态初始化块前面父类静态变量、静态初始化块(两者的顺序由具体的程序块决定,看程序前后)子类静态变量、静态初始化块(两者的顺序由具体的程序块决定,看程序前后)父类实例变量、动态显式初始化块子类实例变量、动态显式初始化块父类构造方法子类构造方法*/package com.andrew;import static java.lang.System.*;public class Test extends SuperClass {    static B a = new B();    static {        System.out.println("sun static");    }    public static void main(String[] args) {        out.println("System.out.println");    }}class SuperClass {    static A a = new A();    static {        System.out.println("super static");    }}class A {    A() {        System.out.println("super A");    }}class B {    B() {        System.out.println("sun B");    }}

读书人网 >软件架构设计

热点推荐