zoukankan      html  css  js  c++  java
  • Java类的各种成员初始化先后顺序

    class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法。
    子类也是这样,然后继承之后,关于程序打印输出的结果。
    涉及到Java类的各种成员的初始化顺序。
    经测试,得到如下结论:

    1.父类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行。
    2.子类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行。
    3.父类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
    4.执行父类的构造方法。
    5.子类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
    6.执行子类的构造方法。

    下面看测试代码以及测试结果的图:

    父类:

    package com.yu.ClassInitTest;
     
    /**
     * 父类
     */
    public class Parent {
        static {
            System.out.println("父类:静态代码块");
        }
     
        {
            System.out.println("父类:普通代码块");
        }
     
        private static String staticStringInParent = initStaticStringInParent();
     
        private String stringInParent = initStringInParent();
     
        public Parent() {
            System.out.println("父类:构造方法");
        }
     
        private static String initStaticStringInParent() {
            System.out.println("父类:静态方法,被静态成员变量赋值调用。");
            return "initStaticStringInParent";
        }
        private String initStringInParent() {
            System.out.println("父类:普通成员方法,被普通成员变量赋值调用。");
            return "initStringInParent";
        }
     
    }

    子类:

    package com.yu.ClassInitTest;
     
    /**
     * 子类
     */
    public class Child extends Parent {
     
        private String stringInChild = initStringInChild();
        private static String staticStringInChild = initStaticStringInChild();
     
        {
            System.out.println("子类:普通代码块");
        }
     
        static {
            System.out.println("子类:静态代码块");
        }
     
        public Child() {
            System.out.println("子类:构造方法");
        }
     
        private static String initStaticStringInChild() {
            System.out.println("子类:静态方法,被静态成员变量赋值调用。");
            return "initStaticStringInChild";
        }
     
        private String initStringInChild() {
            System.out.println("子类:普通成员方法,被普通成员变量赋值调用。");
            return "initStringInChild";
        }
    }

    测试main方法

    package com.yu.ClassInitTest;
     
    /**
     * 测试Java类的成员和初始化块(代码块)初始化顺序
     */
    public class ClassInitTest {
        public static void main(String[] args) {
            System.out.println("测试代码开始");
            new Child();
            System.out.println("测试代码结束");
        }
    }

    代码的执行结果图:

    为了看的方便,我把代码执行结果,和得到的理论放在一个图。

  • 相关阅读:
    Javascript Fromdata 与jQuery 实现Ajax文件上传以及文件的删除
    Javascript Fromdata 与jQuery 实现Ajax文件上传
    web.xml配置
    servlet反射、生命周期、接口
    Tomcat
    java--反射原理及操作
    CSS基础--属性选择器、伪类选择器
    webStom常用快捷键备忘
    HTML5--sessionStorage、localStorage、manifest
    ES6
  • 原文地址:https://www.cnblogs.com/yuandluck/p/9474656.html
Copyright © 2011-2022 走看看