首先这个问题很有意思,不过题主没具体指明放在何处的代码块。

这里至少有三种情况,第一种就是在普通的方法里面,第二种是实例初始化代码块,第三种是静态初始化代码块。

第一种情况

使用javap反汇编了一下有代码块的代码和无代码块的代码。结果比较后发现它们居然是一样的。

public class HelloWorld {

public void main(String[] args) {

int n = 1;

System.out.println(n);

// {int m = 2;

System.out.println(m);

// }}

}

然后执行一下javac HelloWorld.java && javap -c HelloWorld看汇编代码

public class HelloWorld {

public HelloWorld();

Code:

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

public void main(java.lang.String[]);

Code:

0: iconst_1

1: istore_2

2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

5: iload_2

6: invokevirtual #3 // Method java/io/PrintStream.println:(I)V

9: iconst_2

10: istore_3

11: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

14: iload_3

15: invokevirtual #3 // Method java/io/PrintStream.println:(I)V

18: return

}

所以我得出结论,普通代码块仅是词法语法层面的,对运行时没有影响,也就是说不存在所谓的「进入代码块入栈保存程序状态,出代码块再通过出栈来恢复程序状态」这种只有函数代码块才会出现的步骤。

第二种情况

实例初始化代码块里面的代码会被自动添加到「所有的构造器」的开头,代码块本身无额外压栈弹栈操作。而且要注意的是,这里说的是「所有的构造器」,有几个构造器,汇编代码中就会出现多少的冗余片段。如果有很多构造器,那就会有相当的浪费。

public class UserDB {

private Map rows = new HashMap<>();

{

rows.put("Linus", "linux");

rows.put("Neumann", "math");

rows.put("Turing", "gay");

}

public boolean checkAccess(String name, String passwd) {

return rows.containsKey(name) && rows.get(name).equals(passwd);

}

}

第三种情况

静态代码块是一个非常特殊的代码块,编译器会将同一个类中所有的静态代码块合并成一个函数static{},它们共享一次压栈弹栈操作。

public class UserDB {

private static Map rows = new HashMap<>();

static {

rows.put("Linus", "linux");

rows.put("Neumann", "math");

rows.put("Turing", "gay");

}

public boolean checkAccess(String name, String passwd) {

return rows.containsKey(name) && rows.get(name).equals(passwd);

}

}

java入栈_java中代码块的执行,也会有入栈的步骤吗?相关推荐

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

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 结论     这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的 ...

  2. java 方法互斥_Java中的互斥方法执行

    检查底部的更新 – 我不认为这种方法可行.留下它作为信息. >如果某个线程在b()中,则尝试执行a()的线程将阻塞,直到执行b()结束. >如果一个线程在b()中并且第二个线程试图运行b( ...

  3. Java笔记——Java代码块的执行顺序

    Java代码块的执行顺序 Java程序中代码块的执行顺序对于学习Java的人来说是必不可少需要掌握的. 代码块 在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为: 局 ...

  4. java类中的static块_java类中static代码块的执行次数

    java类中 static静态代码块的执行次数 1.在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行,static块只执行一次,由JVM保证其只执行一次. 2.直接看示例 ...

  5. java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序

    目录 #java中的构造方法 #构造方法简介 #构造方法实例 #例-1 #例-2 #java中的几种构造方法详解 #普通构造方法 #默认构造方法 #重载构造方法 #java子类构造方法调用父类构造方法 ...

  6. java静态代码块和构造方法_Java静态代码块和构造方法执行顺序

    package com.uno.staticBlock; import java.lang.reflect.Field; import java.util.Vector; /** * 验证静态代码块和 ...

  7. java类静态初始化_Java静态代码块和类初始化、实例初始化过程

    1. 静态代码块 静态代码块:定义在类中方法外,使用static修饰 ①可以为类变量(静态变量)初始化 ②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次 ③若有多个静态代码块, ...

  8. Java中构造函数,静态代码块,构造代码块的执行顺序

    静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...

  9. java中代码块之静态代码块和非静态代码块

    一.代码块: 语法:使用{}包裹的,可以在{}中写代码. 修饰符:static 或者不修饰. static修饰的为静态代码代码块. 格式: //静态代码块,随着类的加载児执行static{System ...

最新文章

  1. 关于MCP2515帧连发、多发的坑
  2. axis2创建web service
  3. 事件绑定中的this问题
  4. HTML DOM之属性的各种操作方法
  5. java写算法之二叉搜索树查找
  6. gerrit配置replication插件
  7. bzoj 1625: [Usaco2007 Dec]宝石手镯(01背包)
  8. GANs之信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
  9. C# 改变图片大小的功能代码片段 (wince5)
  10. 微粒群算法(PSO)
  11. Java8新特性-Lambda表达式
  12. 如何加载和保存AutoCAD DXF文件(四参数法)
  13. saveas中参数gcf的理解
  14. 阿里巴巴编码规范考试答案
  15. 将Excel文件导入到数据库中
  16. Ubuntu 16.04下安装Preempt_rt
  17. java的StadIn函数_Java經典算法案例---Java深入
  18. Java中怎么打开jsp_jsp文件怎么打开 打开jsp文件的详细步骤【详细介绍】
  19. libopencv_viz.so未定义使用
  20. c++植树问题解决代码

热门文章

  1. windows 如何在Windows命令行下配置IP地址
  2. Container.ItemIndex 获取reapeater行号
  3. WinCE CEDDK之DMA相关函数
  4. CentOS 5.2 安装Apache服务器后无法访问解决方法
  5. C程序设计语言上机13,《高级语言程序设计》北大上机试题(十三)
  6. python 元组比较大小_为什么元组比列表更快?
  7. Spring AOP两种使用方式以及如何使用解析
  8. 服务器虚拟化性能瓶颈怎么办,如何突破虚拟化三大瓶颈
  9. obj.val 非数组_在Ruby中使用Array.new(size,obj)创建数组
  10. Java GregorianCalendar add()方法与示例