`

java 静态语句块 构造快 构造器的初始化顺序

    博客分类:
  • java
阅读更多
/*
 * 
 * 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方法---》父类的构造语句块---》父类的构造方法---》子类的构造语句块---》子类的构造方法。

 

非常感谢大家的点评和指正,运行结果没有问题,只是顺序写错了。

1
1
分享到:
评论
8 楼 FireZHFox 2014-08-18  
FireZHFox 写道
jilo88 写道
同问!?没数错吗?


你觉得哪里错了?请指正


顺序确实错了,运行结果是正确的,顺序写错了,不好意思
7 楼 FireZHFox 2014-08-18  
FireZHFox 写道
yunduanyucan 写道
你确定顺序没有数错?


你觉得应该是什么顺序,请说明?谢谢


顺序确实是错了,运行结果没有问题,但是顺序写错了
6 楼 FireZHFox 2014-08-18  
肆无忌惮_ 写道
父类的静态语句块---》子类的静态语句块---》main方法---》父类的代码块---》父类的构造方法---》子类的代码块---》子类的构造方法。


不好意思,你的顺序是对的,非常感谢。
5 楼 FireZHFox 2014-08-18  
yunduanyucan 写道
你确定顺序没有数错?


你觉得应该是什么顺序,请说明?谢谢
4 楼 FireZHFox 2014-08-18  
jilo88 写道
同问!?没数错吗?


你觉得哪里错了?请指正
3 楼 肆无忌惮_ 2014-08-16  
父类的静态语句块---》子类的静态语句块---》main方法---》父类的代码块---》父类的构造方法---》子类的代码块---》子类的构造方法。
2 楼 jilo88 2014-08-16  
同问!?没数错吗?
1 楼 yunduanyucan 2014-08-15  
你确定顺序没有数错?

相关推荐

    java 构造器的调用

    在Java编程语言中,构造器(Constructor)是一个特殊的方法,主要负责对象的初始化工作。当创建一个新的类实例时,构造器会被自动调用。构造器的名称必须与类名完全相同,且没有返回类型,包括void。理解并熟练运用...

    java程序初始化顺序

    以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...

    Java入门理解构造器

    - **静态构造器不存在**:Java中没有静态构造器的概念,所有构造器都用于创建对象实例。 #### 七、示例代码解析 在提供的部分代码中,可以看到如下示例: ```java public class Platypus extends Mammal { String...

    java中静态代码块与构造方法的执行顺序判断

    在Java编程语言中,了解静态代码块和构造方法的执行顺序是至关重要的,尤其是在处理类的初始化和对象的创建时。下面将详细解释这些概念及其执行逻辑。 首先,静态代码块(也称为静态初始化器)是由`static`关键字...

    对象和构造器

    构造器的主要作用是初始化对象的实例变量。 对象的内存分配 在 Java 中,对象的内存分配是通过 new 关键字来实现的。new 关键字用于创建对象,并将其分配到堆中。 实例和静态 在 Java 中,实例和静态是两个概念...

    Java基础练习题练习下静态块的用处

    静态块适用于类级别的初始化,而构造器适用于对象级别的初始化。 通过上述知识点,我们可以理解Java中的静态块是类加载过程中的一个重要组成部分,它在初始化静态变量和管理类级别资源等方面发挥着关键作用。在学习...

    Java面向对象(高级)- 类的成员之四:代码块

    这是因为静态代码块随着类的加载而执行,非静态代码块在创建对象时执行,而构造器则用于初始化对象。 通过以上例子,我们可以理解代码块在Java面向对象编程中的重要性,尤其是在初始化阶段。静态代码块适用于类级别...

    深入剖析java类的构造方式.txt

    本文将深入探讨Java中类对象的构造方式,包括构造器(Constructor)的作用、静态与实例初始化块的功能、构造过程中的特殊调用(如`this()`和`super()`),以及类成员变量的初始化顺序等内容。 #### 构造器...

    【Java语言基础】初始化块

    文章目录【Java语言基础】初始化块使用初始化块静态初始化块总结代码 【Java语言基础】初始化块 初始化块又称为代码块。属于类中的第四大成员。本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,...

    java中的静态代码块、构造代码块、构造方法详解

    在Java编程语言中,类的初始化过程涉及到几个关键的概念,包括静态代码块、构造代码块和构造方法。这些概念在创建对象和管理类的状态时起着至关重要的作用。以下是关于这三个概念的详细解释: 1. **静态代码块**: ...

    JAVA面试题解惑系列

    在Java面试中,关于类的初始化顺序问题是非常常见的考察点之一。此类题目旨在检测面试者对于Java语言基础的理解程度,特别是对象创建过程中的细节掌握情况。下面我们将从多个角度对这个问题进行深入解析。 #### ...

    java初始化和清理

    初始化块可以是静态的,也可以是非静态的,分别在类加载时和对象构造时执行。对于继承关系中的类,子类的初始化会在其父类初始化之后进行,确保父类的状态在子类使用前已经被正确设置。 清理过程主要涉及垃圾回收。...

    理解构造器--构造器和方法的区别

    在构造器中,`super()`必须作为第一条语句,因为它是初始化过程的一部分。如果遗漏或位置不当,会导致编译错误。 最后,值得注意的是,Java编译器会在构造器中自动插入对超类构造器的调用,如果没有显式指定,会...

    java中静态与非静态的变量定义与使用

    这意味着它们的初始化顺序早于 `main` 函数中的其他语句。这种特性使得静态变量可以在类的生命周期早期就被使用,即使没有创建任何实例。 在 `Table` 类和 `Cupboard` 类的构造器中,可以看到静态变量的初始化会...

    Java实例域初始化方法及顺序

    构造器初始化 构造器是一种特殊的方法,用于初始化Java实例域的值。构造器的名称与类名相同,且没有返回值。构造器可以有参数,也可以没有参数。构造器可以被重载,以便于不同的初始化方式。例如: ```java public...

    JAVA面试题解惑系列114页.pdf

    在Java编程语言中,面试时常会涉及到类的初始化顺序,这是理解对象生命周期和类加载机制的关键部分。在Java中,类的初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**:首先,静态变量(static fields)会被...

    java代码-日常练习33,代码块### 静态代码块 static{代码内容;} 随着类的加载就执行一次 构造器代码块 {代码内容;} 每创建对象就执行一次 局部代码块 {代码内容;} 方法执行一次执行一次

    例如,静态代码块用于类级别的设置,构造器代码块用于对象的初始化,而局部代码块则提供了一种在特定逻辑范围内控制变量的方式。 在提供的`main.java`文件中,可能包含了对这些代码块的实践和示例,通过阅读和理解...

Global site tag (gtag.js) - Google Analytics