package job;
public class TestConsSeq {
public static void main(String[] args) {
/*
* 几大原则
* 一、静态成员变量(Static)
* 1、静态成员变量为类变量,所有对象共享同一内存空间
* 2、静态成员变量的声明和定义仅在首次加载类时执行一次
* 3、首次加载类时首先对所有静态成员变量根据类型默认赋初值,然后再对有右值的附右值
* 二、静态初始块
* 1、静态初始化块仅在首次加载类时执行一次
* ······多个静态成员变量与静态始化快参照出现顺序先后执行······
* 三、动态成员变量
* 1、动态成员变量定义在每次实例化对象时在构造函数之前执行
* 四、动态初始化块
* 1、动态初始化块在每次实例化对象时在构造函数之前执行
* ······多个动态成员变量与动态初始化块参照出现顺序先后执行······
* 总结:总的来说,在不涉及继承的前提下,当首次加载类时,按照如下顺序执行
* 1、按照出现顺序先后执行静态成员变量定义与静态初始化块
* 2、按照出现顺序先后执行动态成员变量定义与动态初始化块
* 3、执行构造函数
* 再次实例化对象时只执行第2、3步即可
*
* ············成员变量与定义与初始化块先于构造函数执行·········
* 五、当涉及到继承时,按照如下顺序执行
* 1、执行父类的静态成员变量定义与静态初始化块,执行子类的静态成员变量定义与静态初始化块
* 2、执行父类的非静态成员变量定义与动态初始化块,执行父类构造方法
* 3、执行子类的非静态成员变量定义与动态初始化块,执行子类构造方法
* 另:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在调用父类构造函数中使用子类重写的方法
*/
int i = 0;
switch(i) {
case 0:
new A();
new A();
break;
case 1:
A ab = new B();
break;
case 2 :
C c1 = new C();
System.out.println("c.i1 = " + c1.i1);//2
System.out.println("c.i2 = " + c1.i2);//3
break;
}
/* 对i=2时的解释
* 为什么是2和3呢?
* 其实代码的执行顺序是这样的:在初始化c1的时候首先加载类
* 定义静态变量t1,i1,i2并赋初值null,0,0
* 然后计算右值表达式new C(),准备将此对象赋给静态成员变量c
* 然而上步中静态成员变量已定义,直接执行c的构造函数即可
* 这样i1++,i2++被执行,i1,i2都变为1
* 继续执行到int i1;没有赋值语句, i1,i2的值仍然是1
* 继续执行到int i2 = 2时i2被赋值2,即i1 = 1,i2 = 2
* 继续执行到c1的构造函数,i1,i2再执行++,此时i1 = 2,i2 = 3
* 输出i1,i2,结果就是:c1.i1 = 2,c1.i2 = 3
* 通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。
*/
}
}
class A {
public A() {
System.out.println("construct A");
m();
System.out.println();
}
private int ai = getAI();
{
System.out.println("dynamic block in A");
}
static {
System.out.println("static block in A");
}
private static int asi = getASI();
static int getASI() {
System.out.println("initial static int asi");
System.out.println();
return 5;
}
static int getAI() {
System.out.println("initial int ai");
return 10;
}
public void m() {
System.out.println("A.m()");
}
}
class B extends A{
public B() {
System.out.println("construct B");
super.m();
m();
}
{
System.out.println("dynamic block in B");
}
private int bi = getBI();
private static int bsi = getBSI();
static {
System.out.println("static block in B");
System.out.println();
}
static int getBSI() {
System.out.println("initial static int bsi");
return 5;
}
static int getBI() {
System.out.println("initial int bi");
return 10;
}
public void m() {
System.out.println("B.m() bi=" + bi);
}
}
class C{
private static C c = new C();
public static int i1;
public static int i2 = 2;
public C(){
i1++;
i2++;
}
}
i=0时输出:
static block in A
initial static int asi
initial int ai
dynamic block in A
construct A
A.m()
initial int ai
dynamic block in A
construct A
A.m()
i=1时输出:
static block in A
initial static int asi
initial static int bsi
static block in B
initial int ai
dynamic block in A
construct A
B.m() bi=0
dynamic block in B
initial int bi
construct B
A.m()
B.m() bi=10
i=2时输出
c.i1 = 2
c.i2 = 3
分享到:
相关推荐
静态块是Java类中用于初始化静态变量的代码块。它们在类加载时执行,且只执行一次。无论创建多少个类的实例,静态块只会被执行一次。这是因为在Java中,类的静态成员是与类相关的,而非类的实例。 ```java public ...
非静态代码块可以包含任意Java代码,但通常用于设置实例变量的初始值。比如: ```java public class MyClass { int value; { value = 5; // 非静态代码块,初始化实例变量 } public MyClass() { // 这里可以...
在Java中,当一个类继承自另一个类时,实例化子类对象时构造函数与静态块的执行顺序遵循以下规则: 1. **静态块的执行**:首先,所有父类的静态块会被执行,然后再执行子类的静态块。这是因为静态块是在类加载时...
Java构造代码块、静态代码块原理与用法实例分析 Java构造代码块和静态代码块是Java中两种特殊的代码块,它们的运行机制和应用场景不同,下面将详细介绍Java构造代码块和静态代码块的原理、用法和注意事项。 一、...
Java 代码块是指在类中使用大括号 `{}` 包围的代码块,这些代码块可以出现在类的任何位置,包括构造函数、静态代码块、实例代码块等。Java 代码块的执行顺序取决于其所在的位置和上下文环境。 在上面的实例代码中,...
这里我们将深入探讨Java中的普通代码块(实例初始化块)和静态代码块的执行顺序,并通过实例来阐述这一概念。 首先,我们需要明白两种类型的代码块: 1. 静态代码块(Static Block):这些代码块在类加载时执行,...
本文将深度剖析几个常见的Java面试题目,包括方法重写、静态代码块和构造方法的执行顺序。 首先,我们来讨论**方法重写(Override)**。在面向对象编程中,子类可以继承父类的属性和方法,有时需要根据自己的需求对...
1 静态变量,静态代码块(类加载时执行,类不加载不执行) 2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行) 3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private...
在Java编程语言中,静态块(Static Block)是一种特殊的代码段,用于初始化类级别的静态变量。它是类加载时执行的,且只执行一次。在理解静态块之前,我们需要先了解类加载的过程和静态变量的概念。 静态变量是属于...
Java静态代码块作用及执行顺序解析 Java静态代码块是Java语言中的一种特殊代码块,它们在类加载的时候执行,且只执行一次。它们通常用来初始化静态变量、设置静态变量的初始值等。静态代码块的作用域是整个类,而...
Java编程语言中有三种类型的代码块,它们分别是普通代码块、构造代码块和静态代码块,每种都有其特定的用途和执行顺序。 1. **普通代码块**: 普通代码块(也称为局部代码块)是在方法或者类的成员变量声明之间...
Java静态代码块加载驱动代码实例 Java静态代码块是一种特殊的代码块,它可以在类加载时被执行,该代码块只能被加载一次,无论new多少个对象。静态代码块通常用来加载配置文件、初始化操作等。 在Java中,静态代码...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
1. **初始化静态变量**:当需要对类中的静态成员进行初始化时,通常会使用静态代码块。例如: ```java public class MyClass { static int myVar; static { myVar = calculateSomeValue(); } // ... 其他...
这意味着静态代码块常被用来初始化静态变量或执行类级别的操作。多个静态代码块将按照它们在类中出现的顺序依次执行。 下面的例子展示了静态代码块的使用: ```java public class Demo { static { System.out....
在Java编程语言中,了解静态代码块和构造方法的执行顺序是至关重要的,尤其是在处理类的初始化和对象的创建时。下面将详细解释这些概念及其执行逻辑。 首先,静态代码块(也称为静态初始化器)是由`static`关键字...
在Java编程语言中,类的初始化过程涉及到几个关键的概念,包括静态代码块、构造代码块和构造方法。这些概念在创建对象和管理类的状态时起着至关重要的作用。以下是关于这三个概念的详细解释: 1. **静态代码块**: ...
在Java编程语言中,静态变量和实例变量是两种不同类型的成员变量,它们在内存中的分配、生命周期、以及使用方式上有着显著的区别。本篇文章将详细探讨这两种变量的差异。 1. 内存分配: - 静态变量:静态变量是...
特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块、非静态块以及构造函数时,明确它们的初始化顺序有助于避免潜在的编程错误。 根据题目提供的内容,我们将重点讨论这些概念以及它们之间的相互关系...
静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...