Java 程序初始化顺序

Java程序的初始化一般遵循三个原则(优先级依次递减):

  • 1,静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化很多次。
  • 2,父类优先于子类进行初始化。
  • 3,按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法被调用之前先初始化。

Java程序初始化工作可以在许多不同的代码块中完成(例如静态代码块,构造函数等),它们的执行顺序如下:

  1. 父类静态变量
  2. 父类静态代码块
  3. 子类静态变量
  4. 子类静态代码块
  5. 父类非静态变量
  6. 父类非静态代码块
  7. 父类构造函数
  8. 子类非静态变量
  9. 子类非静态代码块
  10. 子类构造函数。

下面给出一个不同模块初始化时执行顺序的一个例子:

class Base{
           static {
                System.out.println("Base static block");

                     }

           public Base(){
           System.out.println("Base constructor");

           }

 public class Derived extends Base{
           static{
          System.out.println("Drevied static block");

                     }

            {
          System.out.println("Drevied  block");

           }

 public  Derived(){
          System.out.println("Drevied  constructor");

          }

public static void main(String args[]){
                new Derived();

          }

          }

先自己利用上面给出的执行顺序进行判断:

程序的运行结果为:

Base static block

Derived static block

Base block

Base constructor

Derived block

Derived constructor

怎么样,运行结果是否与你的结果一致呢?

最后,我们再来看一道面试真题:

下列代码运行结果是什么?

  class B extends Object{
          static{
          System.out.println("Load B1");

                     }

         public  B(){
          System.out.println("Create B");

          }

           static{
          System.out.println("Load B2");

           }

           }

class A extends B{
          static{
          System.out.println("Load A");

                     }

         public  A(){
          System.out.println("Create A");

          }

          }

          public class Testclass{
          public static void main(String[ ] args){
                        new A();

          }

          }

运行结果是:

Load B1      LoadB2      Load A     Create B     Create A

在面试中出现的执行顺序的问题,无非也就是把上面的代码再换几个形式,但,万变不离其宗,只要掌握它的执行顺序的规律,所有问题就都可以迎刃而解了

到此这篇关于Java 程序初始化顺序的文章就介绍到这了,更多相关Java程序初始化顺序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 程序初始化顺序

    Java程序的初始化一般遵循三个原则(优先级依次递减): 1,静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化很多次. 2,父类优先于子类进行初始化. 3,按照成员变量的定义顺序进行初始化.即使变量定义散布于方法定义之中,它们依然在任何方法被调用之前先初始化. Java程序初始化工作可以在许多不同的代码块中完成(例如静态代码块,构造函数等),它们的执行顺序如下: 父类静态变量 父类静态代码块 子类静态变量 子类静态代码块 父类非

  • Java对象初始化顺序的使用

    单一类:(静态成员变量&静态初始化块)<(成员变量&初始化块)<构造函数 复制代码 代码如下: public class 对象初始化顺序 {    public static void main(String[] args){        Person p = new Person();    }}class Person{    public static String staticfield ="静态成员变量";    public String fi

  • Java——对象初始化顺序使用详解

    一. 代码块的概念 在探究对象初始化顺序之前,我们先通过代码来了解一下代码块的概念. class Test{ public static String str1; //静态字段 public String str2; //普通字段 static{ //静态代码块 } { //构造代码块 } public Test() { //构造函数 } } 二. 创建子类对象时,对象的初始化顺序 1. 字段初始化.代码块和构造函数的执行顺序 我们先看代码和结果 public class CodeBlockTe

  • java对象初始化顺序验证示例

    复制代码 代码如下: public class Derive extends Base {    private Member m1 = new Member("Member 1");    {        System.out.println("Initial Block()");    } public Derive() {        System.out.println("Derive()");    } private Member

  • Java实例域初始化方法及顺序

    Java实例域初始化方式 1.构造器 public class Employee { private String name; private String gender; private int age; private double salary; public Employee() { this.salary = 1000.0; } public Employee(String name, String gender, int age, double salary) { this.name

  • 详解Java的初始化与清理

    大家都知道,Java是站在巨人的肩上成功的,它是在C&C++的基础上进一步的开发,投入面向对象开发的怀抱.Java吸取了很多以前的教训,加入自己很多独创的方式.在程序语言发展初期,许多C程序员经常忘记初始化变量,在程序结束后也经常忘记对创建的数据类型进行释放内存,造成内存泄漏.这些"不安全"的编程方式当然需要程序员有良好的编程习惯,但如果编程语言能够加入自动清理与初始化的工作,这回大大降低开发成本.随着技术的发展,C++语言引入了构造器(constructor),即在创建对象自

  • Java中对象初始化顺序的详细介绍

    前言 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com.ds.test; public class Upper { String upperString; public Upper() { Initializer.initialize(this); } } package com.ds.test; public class Lower extends

  • Java类继承关系中的初始化顺序实例详解

    本文实例讲述了Java类继承关系中的初始化顺序.分享给大家供大家参考,具体如下: Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类InitialOrderWithoutExtend中包含了静态成员变量(类变量)SampleClass 类的一个实例,普通成员变量SampleClass 类的2个实例(在程序中的顺序不一样)以及一个静态代码块,其中静态代码块

  • Java程序顺序结构中逻辑控制语句详解流程

    目录 一.顺序结构 二.分支结构 1.if语句 2.switch 语句 三. 循环结构 1 .while 循环 2. break 3. continue 4.for循环 5.do while循环 四.输入输出 1.输出到控制台 2 .从键盘输入 五.练习 看前欣赏美图! 上才艺! 目录 一.顺序结构二.分支结构1.if语句2.switch 语句 三. 循环结构1 .while 循环2. break3. continue4.for循环5.do while循环 四.输入输出1.输出到控制台2 .从键

  • 浅谈Java变量的初始化顺序详解

    规则1(无继承情况下):对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器证明代码: 复制代码 代码如下: public class InitialOrderTest {    // 静态变量    public static String staticField = "静态变量";    // 变量    public String field = "变量";    // 静

随机推荐