jvm执行流程(static代码块和初始化快和父类子类执行过程)

大家猜想一下,结果会是什么?

为什么会是这样呢?

1.jvm加载StaticBlock的main方法前,要看SubClass中是否有静态的变量和语句,如果有,先给这些静态的变量分配存储空间和执行静态语句(不是静态方法),且由于SubClass的父类中也有静态的变量,根据继承的特性,则先执行父类Parent的静态数据的初始化,然会执行子类的静态数据的初始化。

2.执行main方法中的new StaticBlock(); 语句,进行Parent的类的实例化因为Parent的静态数据已经实例化,并且在一个执行过程只实例化一次,所以在执行new Parenet()语句时,
先执行非静态变量定义和类的非静态语句,之后再执行构造方法,所以有上面的结果

总结如下:
(1)先静态。具体是先父静态->子静态(参考下面2)

(2)先父后子。先父的全部,然后子的全部。
(3)优先级:父类 > 子类 。静态代码块 > 非静态代码块 > 构造函数 (与位置的前后无关系)

先静态,可以这么理解,只要出现了某类的关键字,那么这个类的类变量或方法就要初始化,否则引用的时候就没有初始化的时机了;
先父后子,可以这样理解,子类会引用父类的东西,那么必须先父后子。

上面的代码输出结果是什么呢?

大家都懂了吗?

时间: 2024-11-01 22:07:22

jvm执行流程(static代码块和初始化快和父类子类执行过程)的相关文章

数据-java static代码块的执行问题

问题描述 java static代码块的执行问题 为什么static代码块先执行,然后把数据给faceTexts? 解决方案 我想"语言就是这么规定的"或许是一个答案,但是这不是一个让你满意的答案. 事实上,Java是人设计的,是人规定的,既然人可以这么规定,那么也可以那么规定.所以为什么静态代码块要规定为先于静态成员初始化? 本质上静态成员初始化是写在静态类型的构造函数中的.而静态构造函数是在这个类被实例化,或者它的静态方法首次被调用的时候才执行.如果一个类,从来没有被调用,那么就不

java中static{.......}代码块的作用

问题描述 java中static{.......}代码块的作用 java中static{.......}代码块主要用在哪里,表示什么意思,有什么用,里面主要写什么内容 解决方案 static后不跟方法名,这个块在该类第一次加载的时候运行,就是说比初始化模块还早就运行,一般用于加载该类需要一次性完成的功能使用. 解决方案二: Java中的static静态代码块 解决方案三: 初始化用,不需要创建实例,当你访问这个类时,就会执行 解决方案四: static 就是静态.你可以搜索一下关于静态的解释.网

static代码块

static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块. 如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次.看例子:   public class Test5 {  private static int a;  private int b;  static {   Test5.a = 3;   System.out.println(a

线程类中可以用静态代码块做初始化静态变量么?这些静态变量会不会有并发问题呢?

问题描述 线程类中可以用静态代码块做初始化静态变量么?这些静态变量会不会有并发问题呢? public class SalesConfirmationUploadThread extends Thread { private boolean result = false; private final SalesConfirmationPipedInputStream input; private long orderId; private String pin; private JingdongS

PHP 中的循环语句用于执行相同的代码块指定的次数

循环 在您编写代码时,您经常需要让相同的代码块运行很多次.您可以在代码中使用循环语句来完成这个任务. 在 PHP 中,我们可以使用下列循环语句: while 只要指定的条件成立,则循环执行代码块 do...while 首先执行一次代码块,然后在指定的条件成立时重复这个循环 for 循环执行代码块指定的次数 foreach 根据数组中每个元素来循环代码块 while 语句 只要指定的条件成立,while 语句将重复执行代码块. 语法 while (condition) code to be exe

基本线程同步(五)使用Lock同步代码块

声明:本文是< Java 7 Concurrency Cookbook >的第二章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞 使用Lock同步代码块 Java提供另外的机制用来同步代码块.它比synchronized关键字更加强大.灵活.它是基于Lock接口和实现它的类(如ReentrantLock).这种机制有如下优势: 它允许以一种更灵活的方式来构建synchronized块.使用synchronized关键字,你必须以结构化方式得到释

举例说明Java中代码块的执行顺序_java

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

Java中的static静态代码块

一.与静态方法的比较 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口.两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的.   二.静态方法注意事项 使用类的静态方法时,注意: a.在静态方法里只能直接调用同类中其他的静态成员(包括

java中static{}语句块使用详解

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例: 示例一 class Test{          public static int X=100;      public final static int Y;=200      public Test(){          System.out