先看一个例子:
public class Test {
public static Test test=new Test("static test");
public static int a=5;
public int b=2;
{
System.out.println("非静态初始化块,此时a的值是:"+a+",b的值是:"+b);
}
public Test(String str){
System.out.println("from "+str);
System.out.println("a:"+a+" "+"b:"+b);
a++;
b++;
System.out.println("in the constructor,此时a的值是:"+a+",b的值是:"+b);
}
public static void main(String[] args) {
Test test=new Test("instance test");
}
}
执行结果是:
非静态初始化块,此时a的值是:0,b的值是:2
from static test
a:0 b:2
in the constructor,此时a的值是:1,b的值是:3
非静态初始化块,此时a的值是:5,b的值是:2
from instance test
a:5 b:2
in the constructor,此时a的值是:6,b的值是:3
初次使用一个类创建对象时,JVM实际上做了三歩工作:加载、链接、初始化。在程序中能看到的是第二步“链接”中的“准备阶段”和第三步“初始化”。
首先只对静态成员变量a进行分析。在准备阶段会将静态成员变量的值设为默认,也就是test=null,a=0。
然后,在初始化阶段对静态成员变量赋初值。首先是test=new Test("static test")。从执行结果可以看出此时a==0,这正是准备阶段所赋的默认值。之后a++,即a==1。再初始化a:a有初始值5,此时a==5(如果a没有初始值,那么a不会被强制赋值,也就是保持a==1)。之后a++,此时a==2。
最后,执行test=new Test("instance test")时,由结果可知,此时a==5,a++,a==6。最后输出a为6。
关于非静态成员变量b,在这里只说一下b在整个执行过程中的变化,因为在某些地方我也没有弄的很透彻。初始化从test开始,这里new了一个对象,此时在构造器执行之前执行了非静态代码块,此时a==0而b已经直接初始化为2。在构造器内部b++,输出结果可知b==3。到此,Test的初始化过程结束。
初始化顺序:
父类的静态代码——>子类的静态代码——>父类的非静态代码——>父类构造函数——>子类非静态代码——>子类构造函数
分享到:
相关推荐
以下是对java变量初始化的时机的分析。 【java变量执行初始化的步骤】 java是一门强类型语言,因此java语言规定每个变量必须先声明,然后才能使用,声明变量时必须指定该变量的数据类型。首先看下面这条语句的...
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
static所声明的变量在Java中有一个初始化的先后顺序,带着这个问题接下来我们就来进行Java中static静态变量的初始化完全解析:
主要介绍了6种方法初始化JAVA中的list集合,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
Java类加载器:静态变量初始化.docx
昨天看了一本叫做《突破程序员基本功的16课》的书,个人感觉还可以,主要对Java的技巧进行了一些深入的讲解,让我对类的初始化和对象的创建有了新的认识
主要介绍了Java静态和非静态成员变量初始化过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java变量的初始化及静态方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://crazybackkom.iteye.com/blog/968174
java面试题-类的初始化顺序.doc 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,...
本文提供了二十道常见的面试题,涵盖了Java中的基本数据类型、引用数据类型、作用域、初始化等方面的知识点。这些问题旨在考察候选人对Java变量类型的理解和应用能力。通过阅读本文,您将能够加深对Java变量类型的...
如果有static,即静态成员定义,首先初始化static的变量,如,在类Cups中c3在c2前面,可是在输出的结果中,你可以发现,c2是在c3前执行的,这就是因为,所有的static都在第一时间被初始化。
} 如果要将变量赋值为对象,那么只能在构造器中进行初始化,例如: class A { private $child; public function __construct() { $this->child = new B(); } } 但是php中并没有一个类似java中的静态构造器/静态块的...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
本篇文章是对Java变量的初始化顺序进行了详细的分析介绍,需要的朋友参考下
下面小编就为大家带来一篇关于Java变量的声明、内存分配及初始化详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java 构造器初始化成员变量 是否提供默认构造器 继承中构造器的调用
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器