塊的做用域:前端
塊(即複合語句)是指一對花括號括起來的若干條簡單的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;