精华内容
下载资源
问答
  • java对象初始化顺序

    千次阅读 2018-08-10 10:18:34
    Java初始化顺序 类变量(静态变量)、实例变量(非静态变量)、静态代码块、非静态代码块 的初始化时机 由 static 关键字修饰的(如:类变量[静态变量]、静态代码块)将在类被初始化创建实例对象之前被初始化,...

    环境:JDK1.7
    代码:

    public class Father {
    
      static final String STATIC_FIELD_01 = getFatherField("STATIC_FIELD_01");
    
      private String field01 = getMemberFatherField("field01");
    
      public Father() {
        System.out.println("父类构造方法!");
      }
    
      static {
        System.out.println("父类静态代码块!");
      }
    
      static final String STATIC_FIELD_02 = getFatherField("STATIC_FIELD_02");
    
      static String getFatherField(String str) {
        System.out.println("父类静态成员变量初始化-" + str);
        return str;
      }
    
      {
        System.out.println("父类代码块!");
      }
    
      private String field02 = getMemberFatherField("field01");
    
      String getMemberFatherField(String str) {
        System.out.println("父类静态成员变量初始化-" + str);
        return str;
      }
    
      static class Son extends Father {
    
        static final String STATIC_FIELD_01 = getSonField("STATIC_FIELD_01");
    
        private String field01 = getMemberSonField("field01");
    
        public Son() {
          System.out.println("子类构造方法!");
        }
    
        static {
          System.out.println("子类静态代码块!");
        }
    
        static final String STATIC_FIELD_02 = getSonField("STATIC_FIELD_02");
    
        static String getSonField(String str) {
          System.out.println("子类静态成员变量初始化-" + str);
          return str;
        }
    
        {
          System.out.println("子类代码块!");
        }
    
        private String field02 = getMemberSonField("field02");
    
        String getMemberSonField(String str) {
          System.out.println("子类成员变量初始化-" + str);
          return str;
        }
      }
    
      public static void main(String[] args) {
        new Son();
      }
    }

    输出结果:
    父类静态成员变量初始化-STATIC_FIELD_01
    父类静态代码块!
    父类静态成员变量初始化-STATIC_FIELD_02
    子类静态成员变量初始化-STATIC_FIELD_01
    子类静态代码块!
    子类静态成员变量初始化-STATIC_FIELD_02
    父类静态成员变量初始化-field01
    父类代码块!
    父类静态成员变量初始化-field01
    父类构造方法!
    子类成员变量初始化-field01
    子类代码块!
    子类成员变量初始化-field02
    子类构造方法!


    Java初始化顺序

    类变量(静态变量)、实例变量(非静态变量)、静态代码块、非静态代码块 的初始化时机
    由 static 关键字修饰的(如:类变量[静态变量]、静态代码块)将在类被初始化创建实例对象之前被初始化,而且是按顺序从上到下依次被执行;
    没有 static 关键字修饰的(如:实例变量[非静态变量]、非静态代码块)初始化实际上是会被提取到类的构造器中被执行的,但是会比类构造器中的代码块优先执行到,其也是按顺序从上到下依次被执行。

     1、在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)
     2、在装载类时,先装载父类A,再装载子类B
     3、装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,按照代码中出现的顺序初始化)
     4、装载子类B后,完成静态动作
    

    类装载完成,开始进行实例化

    1、在实例化子类B时,先要实例化父类A2,实例化父类A时,先成员实例化(非静态代码)
    2、父类A的构造方法
    3、子类B的成员实例化(非静态代码)
    4、子类B的构造方法
    

    先初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数

    参考:https://www.cnblogs.com/abcjun/articles/4687539.html

    展开全文
  • Java对象初始化顺序

    2010-07-26 11:01:00
    对象初始化顺序

    初始化 顺序应该是.

    父静态变量-->子静态变量-->父非静态变量-->父静态代码块-->父构造函数------>子非变量-->子静态代码块-->子构造函数

     

    以上是网上盛传的

    其实应该是这样:(大家自己写代码验证)

    1.  父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
    2.  子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
    3.  父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
    4.  父类构造方法
    5.  子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
    6.  子类构造方法
    附测试代码:
     
     
    测试结果:

     

    展开全文
  • java创建对象的几种方式: (1) 用new语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect....(4) 运用反序列手段,调用java.io.ObjectInputStream对象的 readO

    java创建对象的几种方式:

    (1) 用new语句创建对象,这是最常见的创建对象的方法。
    (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
    (3) 调用对象的clone()方法。
    (4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

    其中:

    (1)和(2)都会明确的显式的调用构造函数 ;

    (3)是在内存上对已有对象的影印,所以不会调用构造函数 ;

    (4)是从文件中还原类的对象,也不会调用构造函数。


    对象的初始化顺序:

    (1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;

    (2)当static语句执行完之后,再执行main方法

    (3)如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。



    展开全文
  • Java 对象初始化顺序 执行顺序

    千次阅读 2015-10-14 22:59:53
    先看一道Java面试题: 求这段程序的输出。   解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题:   从程序的执行顺序去解答: 1.编译;当这个类被编译通知后,会在相应的...

    先看一道Java面试题:

    求这段程序的输出。

     

    解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题:

     

    从程序的执行顺序去解答:

    1.编译;当这个类被编译通知后,会在相应的目录下生成两个.class 文件。一个是 Base.class,另外一个就是Base$Sub.class。这个时候类加载器将这两个.class  文件加载到内存

     

    2、Base base= new Sub():

     

      声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟机);

     

    3、JVM为Base,Sub 的的成员开辟内存空间

     

      此时,Base 和Sub类中的值为null;

     

    4、new Sub();

     

      这个时候会调用Sub类的隐式构造方法,

         Sub的构造方法本质为:

         public Sub(){

      super();//  调用父类的构造方法必须在构造方法中的第一行,为什么呢?这是因为在一些程序的升级中,要兼容旧版本的一些功能,父类即原先的一些初始化信息也要保证  //被执行到,然后执行当前

      baseName = "sub";//子类字段初始化

          }

        new Sub()执行到super()这行代码也就是跑到父类中去执行了,我们跳转到父类中的无参构造方法中执行,最后执行Sub()中的baseName = "sub";

     

    5、public Base() ;

          父类无参构造方法的本质为:

     

      public Base(){

     

      baseName= "base";//父类字段初始化

     

      callName();

     

        }

     

      即将父类的baseName赋值为“base”,赋值后调用callName();

     

    6、callName()方法在子类中被重写,因此调用子类的callName(),子类的callName方法执行,打印输出的是子类的baseName 字段的值,而这个时候子类的构造函数中字段的赋值还未执行。

     

    7、父类的构造函数执行完毕,这个时候又回到子类当中,从super()的下一行继续执行,这个时候才为子类字段baseName 分配好存储空间,随后为其赋值:

     

     可见,在baseName = "sub"执行前,子类的callName()已经执行,所以子类的baseName为默认值状态null;

     

    二、总结

    java对象初始化顺序
    1.父类静态初始化方法 static{ }
    2.子类静态初始化方法 static{ }
    3.父类字段初始化 ,如private String name ="base"
    4.父类非静态初始化方法 {}
    5.父类构造方法
    6.子类字段初始化,如private String name="sub";
    7.子类非静态初始化方法{}
    8 子类构造方法

    展开全文
  • 一、 代码块的概念在探究对象初始化顺序之前,我们先通过代码来了解一下代码块的概念。class Test{ public static String str1; //静态字段 public String str2; //普通字段 static{ //静态代码块 } { //构
  • java对象初始化顺序

    2017-10-15 20:42:49
    java初始化顺序是 初始化类变量(即static修饰的成员变量),并未赋值。不管写的位置在哪里,只要是类变量,系统总会先找到它进行变量初始化。 执行静态代码块和类变量定义式,两者根据写的位置来决定先后,先写...
  • java 对象属性初始化顺序

    千次阅读 2018-05-30 16:19:56
    A、类的初始化顺序如下: ->1、为静态属性分配内存并赋值(后面大括号语句不执行,这里是初始化,只是添加变量和值)   或 执行静态代码块(立刻执行大括号里面的语句)  为什么这样说呢,因为谁在前先加载...
  • Java之创建对象初始化顺序

    千次阅读 2018-09-28 16:12:47
    父类静态成员(包括方法和变量,按顺序初始化) 子类静态成员(包括方法和变量,按顺序初始化) 父类成员变量(包括非静态代码块) 父类构造方法 子类成员变量(包括非静态代码块) 子类构造方法 验证代码:...
  • JAVA初始化顺序总结

    万次阅读 2018-09-27 23:16:24
    初始化顺序 首先来看下,当一个类从main入口方法,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序: public class ClassLoadTest { private static User user = new User(); static { ...
  • Java程序初始化顺序

    2017-03-12 15:48:41
    Java程序初始化原则 静态优先于非静态。具体指的是静态的变量或者是对象优先于非静态的变量或者是对象。并且,静态只初始化一次,而非静态可能会初始化多次。 父类优先于子类进行初始化。 按照成员变量定义的顺序...
  •  2) 这种代码块就是初始化代码块,用于给数据成员初始化,里面可以调用方法,使用if、for等Java语句,也就是说初始化块本质上和普通方法没有区别;  3) 初始化块会在构造器之前执行,对数据成员初始
  • Java 对象初始化过程

    千次阅读 2016-05-03 17:57:45
    本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本文在最后也会对类的初始化进行介绍,相对于对象初始化来说,类的初始化要相对简单一些)。...
  • java初始化顺序

    千次阅读 2017-09-01 17:57:33
    java初始化顺序先贴一段代码,结果输出弄明白了,就不用往下看了 class Meal{ Meal(){ System.out.println("Base constructor: Meal()"); } static String wsp=printf("Base static field"); static String ...
  • java类内容初始化顺序

    千次阅读 2014-07-15 16:35:40
    初始化的先后顺序是:静态变量(类load进内存就初始化)------静态代码块(类load进内存就初始化)--------成员变量(对象初始化时)------------初始化块------------构造函数 测试程序如下: package com.evan; /*...
  • JAVA 成员初始化顺序和内存分配过程

    千次阅读 2017-05-25 09:53:21
    成员初始化顺序属性、方法、构造方法和自由块都是类中的成员,在创建类的对象时,类中各成员的执行顺序: 父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。 子类静态成员和静态初始化块,按在代码中出现...
  • java继承 初始化顺序

    千次阅读 2013-08-01 10:13:26
     Derived的初始化顺序:  1.按定义时的顺序初始化基类的static成员  2..按定义时的顺序初始化扩展类的static成员  (以上两条是对第一次定义扩展类对象时运行)  3.按定义时顺序执行基类的指定初始化  ...
  • Java初始化顺序的一些理解

    千次阅读 2019-04-10 23:21:21
    构造代码块:类中直接用{}定义,每一次创建对象时执行。 执行顺序优先级:(静态块| 静态变量) , main(), (构造块|成员变量) , 构造方法。 括号内的内容根据声明的先后顺序进行执行。 构造函数 public HelloA(){//...
  • 彻底搞懂java程序的初始化顺序

    千次阅读 2019-08-09 08:00:00
    使用场景 在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。 原则 ...初始化顺序 父类...
  • Java成员变量初始化顺序

    千次阅读 2018-11-24 22:28:49
    Java中成员变量分为两类:1、类变量 2、实例变量 1、类变量初始化 ...1.2 初始化顺序 上述两种方式在程序中的排列顺序即为执行顺序 class ClassVarInit{ static int value=10; static{ value=10...
  • Java初始化顺序

    千次阅读 2016-03-20 15:30:38
    了解包括继承在内的初始化全过程,以对所发生的一切有个全局的把握,是很有益的。 请看下例: package org.easyliu.demo2.inittest; class Insect { private int i = 9; protected int j; Insect() { System...
  • 阿里巴巴面试题--Java对象初始化

    千次阅读 多人点赞 2014-02-21 10:12:22
    这是一道阿里巴巴的关于Java对象初始化的面试题,堪称经典,代码很简单(编写格式做了些修改),但是需要面试者对Java中对象初始化有一个透彻的认识,那么通过这道面试题,对我有点启发,所以希望在这里分享给大家,...
  • 静态属性和静态代码块看书写先后顺序 5.统一类型(非数据类型),按代码书写顺序 父类静态变量,父类静态代码块 子类静态变量,子类静态代码块 父类非静态变量,父类非静态代码块 父类构造函数,子类非静态...
  • Java 对象初始化与清理

    千次阅读 2017-06-24 15:34:15
    Java有自动的垃圾回收器,不需要我们手动清理对象,但却需要我们手动创建对象。那么,对于一个对象来说,它的创建过程或者说初始化过程是怎样进行的,我们在设计自己的类时又要如何保证对象初始化顺利进行?
  • Java类的初始化顺序

    万次阅读 多人点赞 2018-07-05 10:03:23
    对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。初始化顺序图示:我们也可以通过下面的测试代码来验证这一点:...
  • java对象创建过程/初始化顺序

    千次阅读 2013-10-15 17:36:15
    Java虚拟机创建一个对象都包含以下步骤。 (1)给对象分配内存。 (2)将对象的实例变量自动初始化为其变量类型... 对于以上第三个步骤,Java虚拟机可采用3种方式来初始化对象,到底采用何种初始化方式取决于创建
  • Java程序的初始化顺序

    2016-05-25 17:43:53
    Java程序的初始化顺序其他Java笔试面试题目: Java面试笔试试题积累(每天更新)在Java语言中,当实例化对象的时候,对象所在类的所有成员变量首先要进行初始化,当所有类成员完成初始化之后才会调用对象所在类的构造方法...
  • Java类属性和对象属性的初始化顺序如下: (1)
  • 在上一篇文章中, 探索了在一条继承链中静态初始化块和静态变量初始化初始化块和实例域初始化、构造函数的执行顺序(见...如果new一个自身类的对象赋值给静态变量来初始化的执行顺序会是怎么样... 以下是代码:package ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 273,350
精华内容 109,340
关键字:

java对象初始化顺序

java 订阅