类加载顺序

来源:互联网 发布:谷歌网络博物馆 编辑:程序博客网 时间:2024/06/05 13:25

关于通过new获取实例,来调用该类的方法或是其继承的父类的方法,规则如下:

代码奉上,根据现象推原理

package com.wang.oop.execute;//父类:静态代码块,构造方法,普通方法,代码块public class SuperClass {public SuperClass() {System.out.println("SuperClass默认的构造方法");}public SuperClass(String str){System.out.println("SuperClass带参的构造方法");}public static void test(){System.out.println("SuperClass静态方法");}static{System.out.println("SuperClass静态代码块");}{System.out.println("SuperClass代码块");}public void sup(){System.out.println("SuperClass普通方法");}}
package com.wang.oop.execute;//子类:静态代码块,构造方法,普通方法,代码块public class SubClass extends SuperClass{public SubClass() {System.out.println("SubClass默认构造方法");}public SubClass(String str){System.out.println("SubClass带参构造方法");}static{System.out.println("SubClass静态代码块");}{System.out.println("SubClass代码块");}public void sub(){System.out.println("SubClass普通方法");}}

测试及结果

package com.wang.oop.execute;public class LoadSortTest {public static void main(String[] args) {//获取SubClass类的实例new SubClass("测试").sub();/** * new SubClass("测试").sub(); * 单执行此句输出结果: * SuperClass静态代码块 *  SubClass静态代码块 *   *  SuperClass代码块 *  SuperClass默认的构造方法 *   *   SubClass代码块 *   SubClass带参构造方法 *   SubClass普通方法 *   说明: *   调用子类,先执行父类的静态代码块子类静态代码块,父类代码块父类默认构造方法; *   子类代码块子类相应的构造方法;最后执行所调用的方法 *   !!!静态代码块和静态方法不一样 *    */new SubClass().sup();/** * new SubClass().sup(); * 单执行此句输出结果: * SuperClass静态代码块 *  SubClass静态代码块 *   *  SuperClass代码块 *  SuperClass默认的构造方法 *   *   SubClass代码块 *   SubClass带参构造方法 *   SubClass普通方法 *   说明: *   调用子类,先执行父类的静态代码块子类静态代码块,父类代码块父类默认构造方法; *   子类代码块子类相应的构造方法;最后执行所调用的方法 *   !!!静态代码块和静态方法不一样 *    *//** * new SubClass("测试").sub(); * new SubClass().sup(); * 执行这两句输出结果: * SuperClass静态代码块 *  SubClass静态代码块 *   *  SuperClass代码块 *  SuperClass默认的构造方法 *   SubClass代码块 *    *   SubClass带参构造方法 *   SubClass普通方法 *    *   SuperClass代码块 *   SuperClass默认的构造方法 *   SubClass代码块 *    *  SubClass默认构造方法      //获取该类实例的方式(new默认构造/new带参构造) *  SuperClass普通方法 *   比较看出: *   1.静态代码块只加载一次 *   2.基类(江湖人称“老头子”)会调用代码块、默认构造方法 *   3.具体的类会调用代码块、相应的构造方法(哪种方式获取的实例) */SuperClass.test();/** * SuperClass静态方法 */}}

结论测试中已经写出,另附

1.在Java中,一个类的构造方法在如下两种情况中总是执行:

> 创建该类的对象(实例化)

> 创建该类子类的对象(子类的实例化)

换言之,JVM总会按照父类 ——>子类的顺序执行一系列的构造方法

2.子类继承父类时构造方法调用规则:

> 如子类构造方法中未出现super显式调用父类有参构造方法,也没有通过this显式调用自身其他构造方法,则系统默认调用父类无参构造方法

> 子类的构造方法中通过super显式调用父类带参构造方法,那么将执行父类相应的构造方法

> 若子类构造方法中通过this显式调用自身其他构造方法,在相应构造方法中应用以上两条规则

0 0
原创粉丝点击