静态块、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("静态块");
11     }
12     public static void main(String[] args)
13     {
14         B t = new B();
15     }
16 }

该题重点:

  1. 静态块(以static开头的部分)在JVM加载该class时只执行一次。
  2. 在一个类中,静态块和静态属性是优先级别相同的,所以按先后顺序执行。

所以JVM在加载这个类时,首先因为静态块和静态属性优先级别相同,所以按先后顺序是new两个B对象赋予t1和t2, 所以会先打印两次"构造块",紧接着执行静态块,打印"静态块",最后执行静态的main方法,main方法中再次new了一个B对象,所以再次打印"构造块"。

所以该问题的答案为:构造块 构造块 静态块 构造块。

时间: 2024-11-05 19:34:54

静态块、main方法、构造块、构造方法的执行顺序的相关文章

Java Object 构造方法的执行顺序

Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象 2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用 3)初始化:若该类有超类,对其初始化,执行静态初始化器(构造器算一个)和静态初始化块. 类初始化时构造方法执行顺序 对于某一个子类时: (1)初始化对象的存储空

Java构造方法的执行顺序

1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法.   Class ThisClass{ } 默认隐式添加无参的构造方法,相当于 Class ThisClass{ public ThisClass(){ } } 2.构造方法的执行顺序.     (1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法. public ThisClass(){ } 默认隐式添加父类无参构造方法,相当于

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

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

ASP.NET MVC 全局过滤器(FilterConfig)、标记在控制器上和方法上的筛选器执行顺序

原文:ASP.NET MVC 全局过滤器(FilterConfig).标记在控制器上和方法上的筛选器执行顺序 FilterConfig->控制器上的筛选器-->方法上的筛选器(大-->小,上-->下) 全局-->控制器->个别 尝试的时候记得把返回true 1 protected override bool AuthorizeCore(HttpContextBase httpContext) 2 { 3 //return base.AuthorizeCore(httpC

关于静态块、静态属性、构造块、构造方法的执行顺序

总结: 1.类加载时,执行静态代码块和初始化静态变量.执行顺序跟代码顺序一致. 2.类实例化时,初始化变量.执行代码块.执行构造.其中初始化变量和代码块的顺序跟代码顺序一致.执行构造是在最后. 3.实例化子类时,会先调用父类的构造方法.调用构造方法之前,会先执行该类的代码块. 4.类只会加载一次. 5.静态变量或静态方法中如果调用构造,可以把构造当做一个普通方法来看.但会先执行一遍代码块. 下面是在网上找到的比较典型的例子,以此来说明 例一: class A { static { System.

静态代码块、非静态代码块(普通代码块)和构造方法的执行顺序

Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的.结构如下: static { 静态语句代码块 } { 非静态语句代码块 }  相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值. 不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数). 1 public class Test_Static_Class { 2 //静态

【Java基础】继承中的代码块和构造方法的执行顺序探索

本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ static { System.out.println("执行Person静态代码块"); } { System.out.println("执行Person构造代码块"); } public Person(){ System.out.println("执行Person构

Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序

前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论 这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下: 实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行) 实现自身的非静态属性和

Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 也就是说非静态初始化块的执行顺序要在构造函数之前. class FatherStaticTest { static { System.out.println("执行父类的静态代码块."); } FatherStaticTest() { System.out.println(&qu