块的做用域:前端
块(即复合语句)是指一对花括号括起来的若干条简单的java语句。块肯定了变量的做用域。一个块能够嵌套在另外一个块中。可是,在嵌套的两个块中声明同名的变量时应注意,块中变量申明在块外变量以后,会报错(如本例),反之不会(如普通代码块的例子)。java
public class BlockMain { public static void main(String[] args) { int k; { int k; //此处在嵌套块中申明了相同变量,出错 int n; } } }
java中的代码块分为普通代码块,构造代码块,静态代码块,同步代码块。bootstrap
1.普通代码块sass
在方法或语句中出现的{}就称为普通代码块。普通代码块和通常的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
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关键字的代码块{}称为构造代码块。构造代码块在建立对象时被调用,每次建立对象都会被调用,而且构造代码块的执行次序优先于类构造函数,以下例代码所示:this
public class CBlock { public CBlock()//构造函数 { i=300;//构造函数中初始化 } public int i=100;//显示初始化变量 {//构造代码块 i=200;//构造代码块中初始化变量 } }
从如下几点理解以上代码:spa
总之,调用构造器初始化数据域的步骤为:code
3.静态代码块htm
可使用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反汇编出的字节码命令
因为选项参数之间组合较多,所以其余选项参数再也不一一截图赘述,仅在下面使用文字进行说明:
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;