Java变量Java对象初始化顺序

Posted wzdnwyyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java变量Java对象初始化顺序相关的知识,希望对你有一定的参考价值。

局部变量与成员变量:

局部变量分为:

  行参:在方法签名中定义的局部变量,随方法的结束而凋亡。

  方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡。
  代码块内的局部变量:必须在代码块内对其显示初始化,从初始化后开始生效,随代码块的结束而凋亡。

成员变量:

  静态属性:类加载时初始化,随着类的存在而存在;

  非静态属性:随着实例的属性存在而存在;

关于他两的区别:

  1.局部变量不可以加static;

  2.局部变量不可以加public、protected、private;

  3.局部变量必须赋初始值;

  4.局部变量存在于栈中;

  5.只写了局部变量,成员变量对比懂的。

实例变量与类变量:

  实例变量:局部变量、非静态成员变量;

  类变量:静态成员变量;

区别:

  就是是不是静态的区别;

  实例的总是可以引用类的;

涉及到原理的一丢丢:

  在JVM中,每个类对应一个class,但是一个类可以创建多个java对象;

  jvm的类变量只需要一块内存空间;

  这个类有几个实例,就要分配几块内存空间。

static可以修饰:

  1.只能修饰类里的成员部分;

  2.成员部分包括:成员变量;成员方法;内部类;初始化块;内部枚举类。

实例变量初始化的时机:

  1.定义变量时

  2.非静态初始化块

  3.构造方法

  4.注意:第1、2种方式比第3种方式更早执行,1、2种方式的执行属性与他们在源程序中的排序相同。

   5.第4点是因为下面一点

Java对象初始化顺序:

  1.先初始化静态的

  2.同静态先初始化父类的

  3.静态中先初始化变量,再初始化代码块

  4.非静态的也是先变量,再代码块,再构造函数

  5.所以初始化顺序可以看下面那张图

  6.子类构造器执行体内执行第一行代码使用super显示调用父类构造器,系统将根据super调用里传入的参数列表判断调用哪个构造器

  7.子类构造器执行体的第一行代码使用this调用本类中重载的构造器,根据传入参数判断调用哪个本类构造器

  8.子类构造器中既没有super调用也没有this调用,系统将会在执行子类构造器前,隐式调用父类无参数的构造器。

  9.super和this都只能在构造器中使用,而且super和this都必须作为构造器中的第一行,因此super和this只能调用其中之一,且最多只能调用一次。

技术图片

  

    

以上是关于Java变量Java对象初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java对象实例化顺序

java中类与对象的加载顺序

java类的初始化块/执行顺序,实例化对象数据赋值

Java 类初始化顺序

Java构造方法成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?

JAVA初始化的执行顺序