java入栈_java中代码块的执行,也会有入栈的步骤吗?
首先这个问题很有意思,不过题主没具体指明放在何处的代码块。
这里至少有三种情况,第一种就是在普通的方法里面,第二种是实例初始化代码块,第三种是静态初始化代码块。
第一种情况
使用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中代码块的执行,也会有入栈的步骤吗?相关推荐
- 举例说明Java中代码块的执行顺序
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 结论 这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的 ...
- java 方法互斥_Java中的互斥方法执行
检查底部的更新 – 我不认为这种方法可行.留下它作为信息. >如果某个线程在b()中,则尝试执行a()的线程将阻塞,直到执行b()结束. >如果一个线程在b()中并且第二个线程试图运行b( ...
- Java笔记——Java代码块的执行顺序
Java代码块的执行顺序 Java程序中代码块的执行顺序对于学习Java的人来说是必不可少需要掌握的. 代码块 在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为: 局 ...
- java类中的static块_java类中static代码块的执行次数
java类中 static静态代码块的执行次数 1.在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行,static块只执行一次,由JVM保证其只执行一次. 2.直接看示例 ...
- java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 #java中的构造方法 #构造方法简介 #构造方法实例 #例-1 #例-2 #java中的几种构造方法详解 #普通构造方法 #默认构造方法 #重载构造方法 #java子类构造方法调用父类构造方法 ...
- java静态代码块和构造方法_Java静态代码块和构造方法执行顺序
package com.uno.staticBlock; import java.lang.reflect.Field; import java.util.Vector; /** * 验证静态代码块和 ...
- java类静态初始化_Java静态代码块和类初始化、实例初始化过程
1. 静态代码块 静态代码块:定义在类中方法外,使用static修饰 ①可以为类变量(静态变量)初始化 ②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次 ③若有多个静态代码块, ...
- Java中构造函数,静态代码块,构造代码块的执行顺序
静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...
- java中代码块之静态代码块和非静态代码块
一.代码块: 语法:使用{}包裹的,可以在{}中写代码. 修饰符:static 或者不修饰. static修饰的为静态代码代码块. 格式: //静态代码块,随着类的加载児执行static{System ...
最新文章
- 关于MCP2515帧连发、多发的坑
- axis2创建web service
- 事件绑定中的this问题
- HTML DOM之属性的各种操作方法
- java写算法之二叉搜索树查找
- gerrit配置replication插件
- bzoj 1625: [Usaco2007 Dec]宝石手镯(01背包)
- GANs之信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
- C# 改变图片大小的功能代码片段 (wince5)
- 微粒群算法(PSO)
- Java8新特性-Lambda表达式
- 如何加载和保存AutoCAD DXF文件(四参数法)
- saveas中参数gcf的理解
- 阿里巴巴编码规范考试答案
- 将Excel文件导入到数据库中
- Ubuntu 16.04下安装Preempt_rt
- java的StadIn函数_Java經典算法案例---Java深入
- Java中怎么打开jsp_jsp文件怎么打开 打开jsp文件的详细步骤【详细介绍】
- libopencv_viz.so未定义使用
- c++植树问题解决代码
热门文章
- windows 如何在Windows命令行下配置IP地址
- Container.ItemIndex 获取reapeater行号
- WinCE CEDDK之DMA相关函数
- CentOS 5.2 安装Apache服务器后无法访问解决方法
- C程序设计语言上机13,《高级语言程序设计》北大上机试题(十三)
- python 元组比较大小_为什么元组比列表更快?
- Spring AOP两种使用方式以及如何使用解析
- 服务器虚拟化性能瓶颈怎么办,如何突破虚拟化三大瓶颈
- obj.val 非数组_在Ruby中使用Array.new(size,obj)创建数组
- Java GregorianCalendar add()方法与示例