/* * * All Rights Reserved. */ package com.thinkInJava.chapter05; public class Father { public Father() { System.out.println("Father"); } static { System.out.println("I am Father class"); } { System.out.println("Father Class"); } }
子类:
package com.thinkInJava.chapter05; public class Sun extends Father{ public Sun(){ System.out.println("Sun"); } static{ System.out.println("I am sun class"); } { System.out.println("sun class"); } public static void main(String[] args) { new Sun(); } }
运行结果:
I am Father class
I am sun class
Father Class
Father
sun class
Sun
当 类在进行初始化时一定是先初始化父类中的静态的内容,父类静态的内容出事完毕后,会初始化子类中的静态内容,然后会再次查看父类中是否存在非静态的内容, 如果有则进行初始化,然后回到子类中查找是否存在非静态的内同需要初始化,如果有则进行初始化。最后执行父类中的构造方法,父类构造方法执行完后执行子类 的构造方法。
总结:
父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》父类的构造方法---》子类的构造语句块---》子类的构造方法。
在进一步改进一下子类中main方法结果会是怎样呢?
public static void main(String[] args) { new Sun(); System.out.println("==================="); new Sun(); }
运行结果:
I am Father class
I am sun class
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
从运行结果看到红色变大的字体部分属于父类和子类中的静态内同:运行顺序依然是:父类的静态语句块---》子类的静态语句块---》父类的构造语句块---》父类的构造方法---》子类的构造语句块---》子类的构造方法。
但是我们在main方法中创建了两个子类对象,但是静态内同值初始化一次,而构造语句块每次都会初始化,这也是构造语句块和静态语句块的区别。
再次修改子类中的main方法
public static void main(String[] args) { System.out.println("main start"); new Sun(); System.out.println("==================="); new Sun(); System.out.println("main end"); }
运行结果如下:
I am Father class
I am sun class
main start
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
main end
通过运行结果可以看到完整的执行顺序为:父类的静态语句块---》子类的静态语句块---》main方法---》父类的构造语句块---》父类的构造方法---》子类的构造语句块---》子类的构造方法。
非常感谢大家的点评和指正,运行结果没有问题,只是顺序写错了。
相关推荐
在Java编程语言中,构造器(Constructor)是一个特殊的方法,主要负责对象的初始化工作。当创建一个新的类实例时,构造器会被自动调用。构造器的名称必须与类名完全相同,且没有返回类型,包括void。理解并熟练运用...
以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...
- **静态构造器不存在**:Java中没有静态构造器的概念,所有构造器都用于创建对象实例。 #### 七、示例代码解析 在提供的部分代码中,可以看到如下示例: ```java public class Platypus extends Mammal { String...
在Java编程语言中,了解静态代码块和构造方法的执行顺序是至关重要的,尤其是在处理类的初始化和对象的创建时。下面将详细解释这些概念及其执行逻辑。 首先,静态代码块(也称为静态初始化器)是由`static`关键字...
构造器的主要作用是初始化对象的实例变量。 对象的内存分配 在 Java 中,对象的内存分配是通过 new 关键字来实现的。new 关键字用于创建对象,并将其分配到堆中。 实例和静态 在 Java 中,实例和静态是两个概念...
静态块适用于类级别的初始化,而构造器适用于对象级别的初始化。 通过上述知识点,我们可以理解Java中的静态块是类加载过程中的一个重要组成部分,它在初始化静态变量和管理类级别资源等方面发挥着关键作用。在学习...
这是因为静态代码块随着类的加载而执行,非静态代码块在创建对象时执行,而构造器则用于初始化对象。 通过以上例子,我们可以理解代码块在Java面向对象编程中的重要性,尤其是在初始化阶段。静态代码块适用于类级别...
本文将深入探讨Java中类对象的构造方式,包括构造器(Constructor)的作用、静态与实例初始化块的功能、构造过程中的特殊调用(如`this()`和`super()`),以及类成员变量的初始化顺序等内容。 #### 构造器...
文章目录【Java语言基础】初始化块使用初始化块静态初始化块总结代码 【Java语言基础】初始化块 初始化块又称为代码块。属于类中的第四大成员。本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,...
在Java编程语言中,类的初始化过程涉及到几个关键的概念,包括静态代码块、构造代码块和构造方法。这些概念在创建对象和管理类的状态时起着至关重要的作用。以下是关于这三个概念的详细解释: 1. **静态代码块**: ...
在Java面试中,关于类的初始化顺序问题是非常常见的考察点之一。此类题目旨在检测面试者对于Java语言基础的理解程度,特别是对象创建过程中的细节掌握情况。下面我们将从多个角度对这个问题进行深入解析。 #### ...
初始化块可以是静态的,也可以是非静态的,分别在类加载时和对象构造时执行。对于继承关系中的类,子类的初始化会在其父类初始化之后进行,确保父类的状态在子类使用前已经被正确设置。 清理过程主要涉及垃圾回收。...
在构造器中,`super()`必须作为第一条语句,因为它是初始化过程的一部分。如果遗漏或位置不当,会导致编译错误。 最后,值得注意的是,Java编译器会在构造器中自动插入对超类构造器的调用,如果没有显式指定,会...
这意味着它们的初始化顺序早于 `main` 函数中的其他语句。这种特性使得静态变量可以在类的生命周期早期就被使用,即使没有创建任何实例。 在 `Table` 类和 `Cupboard` 类的构造器中,可以看到静态变量的初始化会...
构造器初始化 构造器是一种特殊的方法,用于初始化Java实例域的值。构造器的名称与类名相同,且没有返回值。构造器可以有参数,也可以没有参数。构造器可以被重载,以便于不同的初始化方式。例如: ```java public...
在Java编程语言中,面试时常会涉及到类的初始化顺序,这是理解对象生命周期和类加载机制的关键部分。在Java中,类的初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**:首先,静态变量(static fields)会被...
例如,静态代码块用于类级别的设置,构造器代码块用于对象的初始化,而局部代码块则提供了一种在特定逻辑范围内控制变量的方式。 在提供的`main.java`文件中,可能包含了对这些代码块的实践和示例,通过阅读和理解...