java新建对象的static块与构造器的执行顺序

前言:本文解决的问题

  • 新建一个对象静态代码块什么时候执行
  • {}里面的代码什么时候执行
  • 有继承关系时的执行顺序

1.问题出现的背景:

构造器是用来实例化一个对象,当我们使用new关键字来新建对象时,构造器就会被调用。如果class中含有静态代码块(static)和普通代码块(在{}括号下),新建对象时的调用顺序是:静态代码块>{里面的代码}>构造器

2.例子说明:

2.1代码说明

//父类
public class StaticExample{
     {
        System.out.println("***This is normal block***");
    }

    static {
        System.out.println("This is first static block");
    }

    public StaticExample(){
        System.out.println("This is constructor");
    }    

    public static String staticString = "Static Variable";

    static {
        System.out.println("This is second static block and "
                                                    + staticString);
    }   

    static {
        staticMethod();
        System.out.println("This is third static block");
    }

    public static void staticMethod() {
        System.out.println("This is static method");
    }

    public static void staticMethod2() {
        System.out.println("This is static method2");
    }
} 

//子类
public class StaticSubClass extends StaticExample{
    static {
        System.out.println("This is the subclass static block");
    }
    {
        System.out.println("***This is the initialise block in subcluss***");
    }
    public StaticSubClass() {
        System.out.println("This is the subclass constructor");
    }
//测试
    public static void main(String[] args){
        StaticSubClass statEx = new StaticSubClass();
        StaticExample.staticMethod2();
    }
}

2.1运行结果

This is first static block

This is second static block and Static Variable

This is static method

This is third static block

This is the subclass static block

This is initialise block base

This is base constructor

This is the initialise block in subcluss

This is the subclass constructor

This is static method2

3.结果分析:

3.1static代码块先执行

先分别执行基类的两个静态代码块,然后执行父类的静态代码块,由于父类静态代码块中含有静态方法,因此执行staticMethod(),然后再执行子类的静态代码块,输出为:

This is first static block

This is second static block and Static Variable

This is static method

This is third static block

This is the subclass static block

3.2新建父类,执行初始化代码块

执行完初static代码块后,再执行父类初始化代码块,然后执行父类的构造器,输出为:

This is initialise block base

This is base constructor

3.3新建子类,执行初始化代码块

输出为:

This is the initialise block in subcluss

This is the subclass constructor

3.3执行子类中的方法

最后调用继承父类的方法staticMethod2(),输出:

This is static method2

4.总结

使用new关键字新建对象时,

  • 首先执行static代码块中的,当存在继承关系时,限制性父类的static代码块,然后执行子类的static
  • 其次执行{}初始化代码块,当有继承关系时,执行父类的初始代码块,然后执行父类构造器。
  • 最后执行构造器

5.关于类中static代码块注意事项

  • 不能使用this关键字,因为还没有实例化(You cannot use the this keyword since there is no instance.)
  • 也不能使用super(You shouldn’t try to access super since there is no such a thing for static blocks.)
  • 不要返回值(You should not return anything from this block.)

更多请参考



java新建对象的static块与构造器的执行顺序

原文地址:https://www.cnblogs.com/java-learner/p/9559206.html

时间: 2024-12-26 10:19:39

java新建对象的static块与构造器的执行顺序的相关文章

静态代码块和构造器的执行顺序

这段时间在学习ContentProvider,还是不太明白ContentProvider中数据库是什么时候创建的.经过自己测试,实际上是用户真正插入数据的时候生成的数据库.具体代码见下一篇关于ContentProvider中的数据生成时机的随笔. 现在就说下静态代码块和构造器的执行顺序.实例化一个类A的时候(这里用的是new的方式进行实例化),如果A中有static{},即静态代码块,那么肯定先执行代码块里的代码.然后执行非静态代码块,最后才真正执行构造器里的代码. 实例化一个类A的时候的执行顺

初始化代码块和构造器的执行顺序

1 package Lab5; 2 3 4 class Root{ 5 static{ 6 System.out.println("Root的静态初始化"); 7 } 8 { 9 System.out.println("Root普通初始化代码"); 10 } 11 public Root(){ 12 System.out.println("root 无参数构造方法"); 13 }; 14 } 15 16 class Mid extends Roo

验证构造块和构造器的执行顺序

public class Test04 { public Test04() { System.out.println("我是构造器"); } { System.out.println("我是构造块"); } public static void main(String[] args) { Test04 t1 = new Test04(); } //结论:构造块先于构造器执行 }

静态 非静态代码块和构造器的执行顺序测试方法

public class Test { static{ System.out.println("静态区"); } { System.out.println("非静态!"); } private int i; public Test(int i) { super(); this.i = i; } public Test() { System.out.println("构造器!!"); } public static void main(String

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块.构造代码块.构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存.所以静态的会优先非静态的. 执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步: 1,super语句,可能出现以下三种情况: 1)构造方法体的第一行是this语句,则不会执行隐式三步, 2)构造方法体的第一行是super语句,则调用相应的父类的构造方法

Java基础6:代码块与代码加载顺序

Java基础6:代码块与代码加载顺序 代码块:用{}包围的代码 java中的代码块按其位置划分为四种: 局部代码块 位置:局部位置(方法内部) 作用:限定变量的生命周期,尽早释放,节约内存 调用:调用其所在的方法时执行 public class 局部代码块 {@Testpublic void test (){   B b = new B();   b.go();}}class B {   B(){}   public void go() {       //方法中的局部代码块,一般进行一次性地调

静态块、main方法、构造块、构造方法的执行顺序

在牛客网做题,遇到关于静态块.main方法.构造块.构造方法的执行顺序的问题,添加该随笔记之. 题目是写出如下java代码执行后所打印的顺序: 1 public class B 2 { 3 public static B t1 = new B(); 4 public static B t2 = new B(); 5 { 6 System.out.println("构造块"); 7 } 8 static 9 { 10 System.out.println("静态块")

关于子类对象的构造函数和父类构造函数的执行顺序

我们分别为父类和子类添加显式的构造函数,代码如下: class Person     {         private int nAge;         protected string strName;         double douHeight;         public string strEateType;         //父类的构造函数         public Person()         {             Console.WriteLine("我