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);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java md5 密钥_Java 生成16/32位 MD5密钥串

注意&#xff01;网上广为流传的MD5计算的版本&#xff0c;与标准MD5计算结果不同(原因可能是编码方式的不同)。请注意甄别。以下代码是经过测试的正确版本。public class MD5 {private static final char HEX_DIGITS[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F };p…

java observer模式_Java观察者模式(Observer)详解及应用

Java观察者模式(Observer)详解及应用(2011-12-15 14:03:30)标签&#xff1a;杂谈Java观察者模式(Observer)详解及应用由于网站带有弱sns功能&#xff0c;因此需要设计关注和被关注的消息或是动作通知&#xff0c;那么将这个需求抽象出来的时候就会发现正好符合java中订阅者模式…

java 反射创建对象并赋值_java使用反射创建并操作对象的方法

Class 对象可以获得该类里的方法(由 Method 对象表示)、构造器(由 Constructor 对象表示)、成员变量(由 Field 对象表示)&#xff0c;这三个类都位于 java.lang.reflect 包下&#xff0c;并实现了 java.lang.reflect.Member 接口。程序可以通过对象来执行对应的方法&#xff0c…

cad注释比例和打印比例不一样_cad注释比例(cad注释比例与打印比例)

这两个比例有什么区别 分别代表的是什么意思 麻烦说详细点 谢谢是物体被缩小了50倍后的图形这两个比例。但是一张图纸不允许出现两个或以上的比例(局部放大除外)&#xff0c;但是标注的数字是实际尺寸&#xff0c;两个没有区别画的是800*500mm的线&#xff0c;注释比例用的1:1&…

java bundle管理_java.util.ResourceBundle使用详解

一、认识国际化资源文件这个类提供软件国际化的捷径。通过此类&#xff0c;可以使您所编写的程序可以&#xff1a;轻松地本地化或翻译成不同的语言一次处理多个语言环境以后可以轻松地进行修改&#xff0c;支持更多的语言环境说的简单点&#xff0c;这个类的作用就是读取资源属…

java mac postgresql_PostgreSQL 的安装与使用 for mac

##安装 在 mac 下&#xff0c;可以利用 homebrew 直接安装 PostgreSQL&#xff1a;brew install postgresql安装好之后有一个数据库(postgres)&#xff0c;如需要重新初始化数据库&#xff1a;initdb /usr/local/var/postgres_mao启动&#xff1a;pg_ctl -D /usr/local/var/pos…

疯狂java讲义价格_疯狂java讲义

封装&#xff1a;封装&#xff1a;将对象状态信息隐藏在对象内部&#xff0c;不允许外部程序直接访问对象内部信息&#xff0c;而是用类所提供的方法访问和操作。访问控制符&#xff1a;private(当前类访问权) ,protected(子类访问),public(公共访问)&#xff0c;default(包访问…

java源代码实例倒计时_Java倒计时三种实现方式代码实例

写完js倒计时&#xff0c;突然想用java实现倒计时&#xff0c;写了三种实现方式一&#xff1a;设置时长的倒计时&#xff1b;二&#xff1a;设置时间戳的倒计时&#xff1b;三&#xff1a;使用java.util.Timer类实现的时间戳倒计时代码如下&#xff1a;package timer;import ja…

java 加密 encrypt_JAVA Encrypter 加密算法

Java代码/*** 加密者** time: 2007-8-29 下午05:45:36*/public final class Encrypter {private static Cipher ecipher;private static Cipher dcipher;// 必须24个字符private static final String key "*:1$7!a*:1$7!a*:1$7!^";private static final String alg …

java base64 加解密_java Base64加解密

import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class Base64Util {public static void main( String[] args ) {String data2 " var re1/[a-zA-Z]/g; return (FIELD_VALUE.match(re1)).length;";try {// BASE64加密BASE64Encoder encoder n…

python svn库_python实现svn新老库迁移

1 #!/usr/bin/env python2 #codingutf-834 #启动环境&#xff1a;linux&#xff0c;安装了python&#xff0c;svn客户端&#xff0c;并且具备python部分依赖包&#xff0c;xlrd&#xff0c;shutil&#xff0c;如果没有网上搜索安装5 #启动方式&#xff1a;将文件MvSvnLibToNew.…

python二维表转一维表_二维表格转换成一维表格

# 加载数据import pandas as pddf_old1 pd.read_excel(r"D:\Jupyter\data\Python.xlsx",sheet_name "变一维")df_old1# 数据清洗&#xff0c;把第一列设为索引列df_old2 pd.read_excel(r"D:\Jupyter\data\Python.xlsx",sheet_name "变一…

java web后台_java web 后台那些事

java web 后台运行原理当Web服务器接收到一个HTTP请求时&#xff0c;它会先判断请求内容——如果是静态网页数据&#xff0c;Web服务器将会自行处理&#xff0c;然后产生响应信息&#xff1b;如果牵涉到动态数据&#xff0c;Web服务器会将请求转交给Servlet容器。此时Servlet容…

MyBatis的缓存!!!!

1.一级缓存&#xff08;默认开启&#xff09; (1) 首先在UserMapper接口定义两个方法&#xff1a; package com.by.mapper;import com.by.pojo.User; import org.apache.ibatis.annotations.Param; import org.junit.Test;import java.util.List;/*** <p>Project: myb…

java动态语言_探秘Java 7:JVM动态语言支持详解

JDK 7 增加了对 JSR 292 的支持&#xff0c;在 JVM 中动态类型语言的运行速度将变得更快。这一支持的关键在于增加了新的 Java 字节码&#xff0c;invokedynamic&#xff0c;它用于方法调用&#xff0c;还有新的连接机制&#xff0c;其中包含了一个新的构造&#xff1a;方法句柄…

java 反射机制 视频_JAVA反射机制及其原理实现

9.1 概念JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;public、protected、private。OO(面向对象)&#xff0c;private私有的&#x…

python模型的属性是什么_python – Django:为什么Django模型字段的类属性?

不,原因与此相同&#xff1a;>>> class Foo(object):... bar Foo attribute...>>> f Foo()>>> f.barFoo attribute>>> Foo.barFoo attribute>>> f.bar instance attribute>>> f.barinstance attribute>>> F…

java 安卓下载文件_GitHub - Charay/downloadfile: 使用Retrofit2+Rxjava+Rxandroid+okhttp的方式下载文件并存储到sd卡指定目录...

downloadfile使用Retrofit2RxjavaRxandroidokhttp的方式下载文件并存储到sd卡指定目录使用&#xff1a;gradleStep 1.在工程build.gradle文件中加入maven地址repositories:allprojects {repositories {...maven { url https://jitpack.io }}}Step 2. 在module的build.gradle中添…

java map 队列_Java:queue队列,map集合

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Queue&#xff1a; 基本上&#xff0c;一个队列就是一个先入先出(FIFO)的数据结构Queue接口与List、Set同一级别&#xff0c;都是继承了Collection接口。LinkedList实现了Deque接 口示例代码&#xff1a;1. import java.util.Linke…

java溢出怎么处理_java数据溢出怎么处理?

publicstaticvoidmain(String[]args){//TODO自动生成的方法存根ScannerscnewScanner(System.in);Stringaasc.nextLine();sc.close();floatdn0,xn0,kn0,sn0,qn0;for(inti0;i<a...public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scnew Scanner(S…