在《java编程思想》(第四版)146页,说到: 初始化之处就是static初始化发生之处,所有的static对象和static代码段都会在加载时依照程序中的循序初始化
package com.woyo.init;
/**
*@author Antty_ge
*@date 2010-12-25
*/
class InitParent{
public static int parentId= getParentId(44, true);
public int id = getParentId(1, false);
static{
System.out.println("==this is the parent static block===");
}
public InitParent(){
System.out.println("===parent构造器");
}
public static void getParentName(){
System.out.println("==parent name is antty");
}
public static int getParentId(int id){
System.out.println("==parent id is " + id);
return id;
}
public static int getParentId(int id, boolean staticSign) {
if(staticSign){
System.out.println("==初始化静态属性parent id is " + id);
}else{
System.out.println("===初始化非静态属性 id is" + id);
}
return id;
}
}
class InitChild extends InitParent{
public static int childId = getChildId(22, true);
public int id = getChildId(1, false);
static{
System.out.println("==this is the child static block===");
}
public InitChild(){
System.out.println("===child构造器");
}
public static void getChildName(){
System.out.println("==child name is bob");
}
public static int getChildId(int id, boolean staticSign) {
if(staticSign){
System.out.println("==初始化静态属性child id is " + id);
}else{
System.out.println("===初始化非静态属性 id is" + id);
}
return id;
}
}
public class Initialization extends InitChild{
public static void main(String[] args) {
Initialization init = new Initialization(); //测试初始化
}
}
运行结果:
==初始化静态属性parent id is 44
==this is the parent static block===
==初始化静态属性child id is 22
==this is the child static block===
===初始化非静态属性 id is1
===parent构造器
===初始化非静态属性 id is1
===child构造器
把代码的59行注释掉,执行main函数,运行结果变为:
==初始化静态属性parent id is 44
==this is the parent static block===
==初始化静态属性child id is 22
==this is the child static block===
最后总结类的初始化过程:
(1)如果是继承关系,则先从基类依次进行初始化
(2)static的属性跟代码段 -------如果是加载类
(3)static的属性跟代码段,非静态属性,构造器 ---如果是初始化对象
(4)stastic的方法,不会再加载类,或者初始化对象的时候初始化
分享到:
相关推荐
类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。
- 当多个线程同时尝试初始化同一个类时,Java保证只会执行一次类的初始化过程。这是由JVM的同步机制保证的,避免了数据竞争的问题。 5. **接口初始化**: - 接口没有实例变量,所以不存在实例初始化阶段。接口的...
当创建一个子类实例时,初始化过程遵循以下步骤: 1. **静态初始化**:首先,执行父类的静态初始化块,然后执行子类的静态初始化块。静态初始化块用于初始化类级别的静态变量,它们只在类加载时执行一次。 2. **...
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
当一个Java类被实例化或者其静态成员被访问时,类的初始化过程就开始了。以下详细解释了Java类的初始化顺序: 1. **初始化父类**: 在子类的构造方法执行之前,首先会调用父类的构造方法。如果子类没有明确指定...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础知识 1. **静态成员变量(Static Fields)**:在类加载时初始化。 2. **实例成员变量(Instance Fields)**...
本篇文章将围绕“类继承的初始化顺序”这一主题展开,详细解析初始化过程中涉及的关键概念和技术细节。 ### 类继承的初始化顺序概述 在面向对象语言中(如Java、C#等),当创建一个继承自某个基类的子类对象时,会...
总之,理解并有效地使用静态和对象初始化块是Java开发中的关键技能,它们可以帮助我们更好地控制类和对象的初始化过程,确保代码的高效性和正确性。在实际编程中,我们应该根据需求谨慎选择合适的初始化策略,以优化...
Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 在 Java 语言中,每个变量必须先声明,然后才能使用。声明变量时必须指定该变量的数据类型。...
Java 对象初始化顺序是指在 Java 程序中,对象的初始化过程中发生的顺序问题。这是 Java 编程语言的基础知识点之一,但是许多学生在学习和使用时总是感到困惑和困难。 二、JVM 执行过程中的“礼让”原则 JVM 在...
Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...
### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...
【深入Java虚拟机(三)——类的生命周期(下)类的初始化1】 类的生命周期在Java中是一个关键的概念,它涵盖了从加载到卸载的整个过程。在类的生命周期中,初始化阶段是非常重要的,因为它涉及到类的静态变量的赋值...
Java初始化与方法是Java编程语言中的核心概念,它们在程序执行过程中起着至关重要的作用。本文将深入探讨Java中的初始化过程、方法的定义与调用,以及与之相关的源码和工具应用。 首先,让我们从类的初始化开始。在...
理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件...
Java 初始化顺序详解 在 Java 中,变量可以分为两类:类变量(静态变量)和实例变量(对象变量)。类变量是使用 static 关键字修饰的变量,它们属于类,而不是对象。实例变量则是没有使用 static 关键字修饰的变量...
特别要注意的是,在子类的初始化过程中,子类的静态变量和静态初始化块会在父类的变量、初始化块、构造器之前就被初始化。也就是说,在父类完全初始化完毕之前,子类的静态成员已经完成初始化了。 这个顺序很重要,...