public class InitObject { private int id; private String name; private static int age; public InitObject(){ System.out.println(id); System.out.println(name); System.out.println(age); } public static void main(String[] args) { new InitObject(); } }
输出结果:
0
null
0
从输出结果可以知道,一个类的所有成员变量无论是静态还是非静态的,都已经在调用构造方法之前被初始化过了。
public class StaticInitialization { public static void main(String[] args) { System.out.println("start"); new Market(); System.out.println("end"); } static Shop shop = new Shop(); static Market market = new Market(); } class Apple { public Apple(int num) { System.out.println("apple" + num); } } class Shop { Apple apple = new Apple(1); static Apple apple2 = new Apple(2); public Shop() { System.out.println("shop"); } } class Market { Apple apple = new Apple(1); public Market() { System.out.println("Market"); } static Apple apple2 = new Apple(2); }
输出结果:
apple2
apple1
shop
apple2
apple1
Market
start
apple1
Market
end
从输出结果可以看到静态数据只在必要时初始化,如果不创建Shop或者没有调用Shop中的静态方法或变 量,那么Shop中的静态数据永远也不会被初始化,
只有在第一个Shop对象被创建或者第一次访问静态数据的时候,静态成员变量才会被初始化,此后,无论静态对象不会再次被初始化。
初始化对象的顺序:先静态对象然后是非静态对象
下面以一道阿里巴巴的面试题来试试手
public class Alibaba { public static int k = 0; public static Alibaba t1 = new Alibaba("t1"); public static Alibaba t2 = new Alibaba("t2"); public static int i = print("i"); public static int n = 99; private int a = 0; public int j = print("j"); { print("构造块"); } static { print("静态块"); } public Alibaba(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++i; ++n; } public static int print(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++n; return ++i; } public static void main(String args[]) { Alibaba t = new Alibaba("init"); } }
根据初始化原则:有静态数据先初始化静态数据
k=0 t1=null t2=null i=0 n=0 又由于存在对静态数据的显示赋值: t1=new Alibaba("t1"); 这步之前会先初始类中的非静态的成员变量 所以会调用j=print("j"); 1:j i=0 n=0 由于存在构造块 2:构造块 i=1 n=1 然后调用构造方法 3:t1 i=2 n=2 接着初始化t2: 4:j i=3 n=3 5:构造块 i=4 n=4 6:t2 i=5 n=5 下一步为静态变量i赋值: 7:i i=6 n=6 接下来就是初始化静态块,然后是初始化非静态的成员变量然后执行构造块(如果有的话) 最后执行构造方法。
相关推荐
当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
让我们深入探讨Java中的初始化顺序及其背后的机制。 1. **类加载阶段**: 在Java程序运行时,JVM会先加载类的字节码文件(.class文件)。这个过程包括加载、验证、准备、解析和初始化五个步骤。这里我们主要关注...
以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...
本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...
在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 问题场景 在实际开发中,我们经常会遇到...
子类 --构造器 这个输出揭示了在继承关系中类的初始化顺序: 1. **静态成员和静态初始化块**:首先,会按照父类到子类的顺序初始化静态变量和执行静态初始化块。在上面的例子中,"父类 --静态变量" 和 "子类 --静态...
Java中,类变量(static变量)的初始化顺序遵循以下规则: 1. 首先,执行父类的静态初始化块(方法),如果有的话。 2. 然后,执行子类的静态初始化块。 3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而...
### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...
在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面。正确理解类的初始化顺序对于编写正确、高效的代码至关重要。 首先,需要了解Java类初始化的基本规则,即在类的...
在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...
静态变量`a`和`b`的初始化顺序是按照它们在源代码中的出现顺序进行的,这里`a`先被初始化,然后是`b`。 另外,Java程序对类的使用有主动使用和被动使用两种情况。主动使用包括以下六种场景: 1. **创建类的实例**...
在 Java 中,类的元素初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**: 首先,Java 解释器会执行类中的静态变量初始化和静态初始化块。这些静态元素的初始化只会在类加载时执行一次,并且按照它们在源...
Java 中的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 Java 初始化顺序的知识点总结: * 类变量(静态变量)和实例变量(对象变量)的区别 * ...
在 JAVA 中,类的初始化顺序可以分为四个阶段:静态变量、静态初始化块、变量、初始化块和构造器。其中,静态变量和静态初始化块的初始化顺序是最高的,接着是变量和初始化块,最后是构造器。 在了解类的初始化顺序...
在 Java 中,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。如果一个静态变量依赖于另一个静态变量的值,那么这两个变量的初始化顺序是重要的。 在给定的代码中,我们可以看到有多个静态变量的声明和初始...