[Java基础]代码块及java反编译
块的作用域:
块(即复合语句)是指一对花括号括起来的若干条简单的java语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。但是,在嵌套的两个块中声明同名的变量时应注意,块中变量申明在块外变量之后,会报错(如本例),反之不会(如普通代码块的例子)。
public class BlockMain {
public static void main(String[] args)
{
int k;
{
int k; //此处在嵌套块中申明了相同变量,出错
int n;
}
}
}
java中的代码块分为普通代码块,构造代码块,静态代码块,同步代码块。
1.普通代码块
在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
public class CodeBlock01{
public static void main(String[] args){ {
int x=3;
System.out.println("1,普通代码块内的变量x="+x);
} int x=1;
System.out.println("主方法内的变量x="+x);
{
int y=7;
System.out.println("2,普通代码块内的变量y="+y);
}
}
}
2.构造代码块
初始化数据域的三种方法:
- 在构造器中设置值;
- 在申明中赋值;
- 在初始化代码块中赋值;
构造代码块:直接在类中定义且没有加static关键字的代码块{}称为构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数,如下例代码所示:
public class CBlock { public CBlock()//构造函数
{
i=300;//构造函数中初始化
} public int i=100;//显示初始化变量 {//构造代码块
i=200;//构造代码块中初始化变量
} }
从以下几点理解以上代码:
- java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端,故i可以在使用(构造函数)之后声明;
- 成员变量的初始化工作其实都是在构造函数中执行的;
- 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动构造函数中执行,是在构造函数之前执行的,原构造函数的中代码是最后执行的;
- 成员变量的显示初始化与构造代码块的代码是按照当前代码的顺序执行的。
总之,调用构造器初始化数据域的步骤为:
- 所有数据域被初始化为默认值(0、false、null,系统默认的);
- 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块;
- 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体;
- 执行这个构造器的主体。
3.静态代码块
- 静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
- 如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
- 注意:1) 静态代码块不能存在于任何方法体内。2) 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
- 执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。其中静态代码块只执行一次,构造代码块在每次创建对象是都会执行。。
可以使用java编写一个没有main方法的”Hello world”程序:
public class BlockMain {
public static void main(String[] args)
{ }
static
{
System.out.println("Hello Word");
}
}
4.同步代码块
5.java反编译
(参考:http://www.365mini.com/page/javap-disassemble-class-file-code.htm)
在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下)。
我们可以在dos窗口中使用javap来反汇编指定的Java字节码文件。在使用javap的相关dos命令之前,你必须确保已经将JDK安装目录\bin
添加到环境变量path中。
接着,我们就可以使用javap来反编译指定的Java字节码文件了。在此之前,我们先通过javap的帮助命令javap -help
查看javap相关指令的用法。
从上述内容我们可以知道,javap的使用命令格式为javap 选项参数 类名
,其中选项参数
可以有多个,中间用空格隔开,也可以一个都没有。下面我们编写如下源代码文件(包名test
,类名Person
),并将其编译为Person.class
字节码文件。
- package test;
- public class Person {
- public Person(String name, int age, boolean gender, String address) {
- this.name = name;
- this.age = age;
- this.gender = gender;
- this.address = address;
- }
- private String name; // private修饰符
- int age; // 默认无访问修饰符(即下面所说的package、friendly)
- protected boolean gender; // protected修饰符
- public String address; // public修饰符
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void sayHi() {
- System.out.println("Hello, my name is " + this.name);
- }
- }
先使用javac将Person.java编译为Person.class,再使用javap命令对Person.class进行反编译:
在执行命令之前,我们需要将dos窗口的当前工作目录变更为D:\java\test
。
1)使用不带任何选项参数的命令:javap Person—将*.class反编译为*.java源文件
javap Person
和javap -package Person
的显示结果一样,因为-package
选项参数是默认的,用于显示package
(不带任何访问修饰符,即我们常说的friendly)、protected
、public
修饰的类或成员。
备注:在dos下进入工作目录D:\java
,然后使用命令javap test.Person
也可以实现上述操作。下同。
2)使用命令:javap -public Person显示public修饰的类或成员
与此类似,选项参数-protected
用于显示protected
以上访问级别(protected
、public
)的类或成员;选项参数-private
用于显示private
以上访问级别,也就是所有的类或成员。
3)使用命令:javap -public -l Person显示public修饰的类或成员,并显示行号表格和本地变量表格
4)使用命令:javap -c Person显示Person.class反汇编出的字节码命令
由于选项参数之间组合较多,因此其他选项参数不再一一截图赘述,仅在下面使用文字进行说明:
- -classpath <pathlist>
- 手动指定用户class字节码文件的存放目录,javap程序将在此目录下查找class文件,多个路径以英文分号分隔。例如:javap -classpath D:\java\test Person(即使DOS窗口的当前工作目录为其他任意路径,该命令均可正确执行)。
- -s
- 打印变量的内部类型签名,例如:javap -classpath D:\java\test -s Person。
- -extdirs <dirs>
- 指定javap搜索已安装的java扩展的位置,默认的java扩展的位置为jre\lib\ext。例如:javap -classpath D:\java\test -extdirs D:\java\myext Person
- -bootclasspath <pathlist>
- 指定使用Java底层类加载器(bootstrap class loader)加载的字节码文件的位置。例如:javap -classpath D:\java\test -bootclasspath D:\java\core Person
- -verbose
- 打印方法参数和本地变量的数量以及栈区大小。
- -J<flag>
- 使用javap.exe来执行java.exe虚拟机的相关命令,例如javap -J-version相当于java -version,可以有多个命令,中间以空格隔开。
6.使用反编译理解代码块
有如下代码块,用反编译查看代码的执行顺序:
package ConstructBlock; public class CBlock {
public static void main(String[] args)
{
CBlock cBlock=new CBlock();
System.out.println(cBlock.i); int pt=100;
{
pt=200;
} } public CBlock()
{
i=300;
} public int i=100; {
i=200;//构造代码块
} }
使用 javap –c –l –private CBlock进行反编译,由结果可以看出执行顺序是100,200,300,最后输出300;
[Java基础]代码块及java反编译的更多相关文章
- 夯实Java基础系列7:Java 代码块和执行顺序
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例
Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...
- 使用 DJ Java Decompiler 将整个jar包反编译成源文件
使用 DJ Java Decompiler 将整个jar包反编译成源文件 所使用的软件是 DJ Java Decompiler 3.9. 下面是一个有用的参考文档,说明如何批量编译 http://ww ...
- Java面向对象-代码块
Java面向对象-代码块 代码块主要就是通过{}花括号 括起来的代码: 主要分为 普通代码块 构造块 静态代码块三类.后面学到线程还有一个同步代码块,到时候再说: 普通代码块:仅仅是花括号括起来的代码 ...
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
java静态代码块/静态属性.构造块.构造方法执行.main方法.普通代码块的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果. 理论知识: 静态代码块是:属于类的,在类加载时 ...
- java 静态代码块和spring @value等注解注入顺序
java 静态代码块和spring @value等注解注入顺序 问题所在 先上代码 java方法 @Value("${mf.cashost}") public static S ...
- Android基础新手教程——1.10 反编译APK获代替码&资源
Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样 ...
- 【Java基础】4、java中的内部类
内部类的分类:常规内部类.静态内部类.私有内部类.局部内部类.匿名内部类. 实例1:常规内部类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...
- 【Java基础】11、java方法中只有值传递,没有引用传递
public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...
随机推荐
- About Sustainability
我不喜欢人们常说"紧张感", "危机感".这只会让人觉得疲惫,无非是自己拿鞭子抽着自己,最终会觉得难以继续.那么快乐到底从哪里来?成就感到底从哪里来呢? 我更喜 ...
- Huffman编码
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cstri ...
- Hdu OJ 5965 扫雷(递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5965 题目大意:中文题,自己读 解图思路:对于每一列都有三种情况--0, 1, 2. 如果第一列确定地 ...
- android xml特殊字符
@ 对应 @ : 对应 : 对应 空格 对应 空格 ! 对应 ! " 对应 " # 对应 # $ 对应 $ % 对应 % & 对应 & ' 对应 ´ ( 对应 ...
- Vue2.0 + Element-UI + WebAPI实践:简易个人记账系统
最近正在学习Vue2.0相关知识,正好近期饿了么桌面端组件Element-UI发布,便动手做了一款简易个人记账系统,以达到实践及巩固目的. 1.开发环境 Win10 + VS2015 + Sqlser ...
- IIS 7 的 500 內部錯誤
印象中這個有名的錯誤提示從 ASP 時代就已經存在 不是很明白微軟怎麼想的 你們所面對的客戶族群有為數不少的開發人員 除錯環境對開發者來說算是基本配備 為何不把這些相關設定做成「出廠預設值」? 都幾年 ...
- 第八章 springboot + mybatis + 多数据源(转载)
本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构 ...
- Robot Framework入门学习1 安装部署详解
安装注意: 目前Robot framework-ride不支持python3,安装时请下载python2.7版本. Robot Framework安装时出现了一点小问题,网上没有找到直接的介绍,现将安 ...
- C#数据结构选择
选择一个合适的数据结构会对程序的性能有着显著的提高 线性表和链表: 1.LinkedList<T>:适合于元素数组不固定,存在大量列表的头尾添加动作场合.其它可使用List<T> ...
- ibatis 参数错误,无效字符
--- The error occurred in EmptyMapping.xml. --- The error occurred while applying a parameter map. - ...