1. 程式人生 > >JavaSE之面向物件程式設計—類與物件下—— 1

JavaSE之面向物件程式設計—類與物件下—— 1

一、程式碼塊
在Java語言中我們總是感受到當遇到一個難的東西,就用一個大括號把它括起來,這樣被大括號括起來的程式碼塊就叫程式碼塊。程式碼塊一共有四種:普通程式碼塊、構造塊、靜態塊、同步程式碼塊。下面我們先介紹前三種程式碼塊。
1.普通程式碼塊
定義:普通程式碼塊就是在定義在方法中的程式碼塊,不管時什麼方法都可以。普通程式碼塊主要用於我們在一個類中,對於變數的命名重複了的解決方案。
舉個栗子:

//1.普通程式碼塊
public class Construction{
	public static void main(String[] args){
		int num=10;
		System.out.println(num);
		int num=100;
		System.out.println(num);
	}
}

在這裡插入圖片描述
對於以上這樣的程式碼段編譯時提示重複定義了,對於在同一個方法中的同一個變數我們只能定義一次,想要解決它就可以採用普通程式碼塊,如下:

//1.普通程式碼塊
public class Construction{
	public static void main(String[] args){
		{
		int num=10;
		System.out.println(num);
		}
		int num=100;
		System.out.println(num);
	}
}

在這裡插入圖片描述
通過一個大括號將有可能引起重複的程式碼段括起來,這樣的話就可以在同一個方法中使用同一個變量了。
2.構造塊
定義:定義在類中的方法塊並且不要加修飾符

//2.構造塊
class Person{
	{
	//定義在類中不加任何的修飾符
	System.out.println("這是Person的構造塊");
	}
	public Person(){//注意某個類的構造方法一定要在這個類裡.
		System.out.println("這是Person的構造方法");
	}
}

	public class Construction{
		public static void main(String[] args){
			new Person();//匿名物件:在建立某個類的一個物件的時候,就會呼叫它的構造方法,並且在呼叫構造方法之前要先執行構造塊
			new Person();//建立幾次物件就執行幾次構造塊,構造塊時和構造方法緊挨著的
		}
	}

在這裡插入圖片描述
從以上執行結果我們可以看出,構造塊的執行在構造方法之前,並且每建立一個物件就會執行一次。
3.靜態程式碼塊(very 重要哦)
定義:故名思意,靜態程式碼塊就是一段程式碼被static修飾了。我們根據程式碼塊的位置不同還對它進行了分類,分為在非主類中的靜態程式碼塊和在主類中的靜態程式碼塊。(非主類:一個類裡面不含有mian方法;主類:含有main方法的這個類)下面我們通過程式碼來看這兩種型別的程式碼塊:
(1)在非主類中的程式碼塊

//3.靜態程式碼塊
	//(1)在主類中的靜態程式碼塊
	class Person{
	 
	//以後在寫程式碼的時候就按照執行的順序來寫,這樣的話也有助於記住這個順序
    //靜態塊——》構造塊——》構造方法	
	 //靜態塊
	 static{
		 System.out.println("這是Person的靜態塊");
	 }
		 
	 //構造塊	 
	 //定義在類中不加任何的修飾符
	 {
	 System.out.println("這是Person的構造塊");
	 }
	 
	 //構造方法
	 public Person(){//注意某個類的構造方法一定要在這個類裡.
		 System.out.println("這是Person的構造方法");
	 }
	}

	 public class Construction{
		 public static void main(String[] args){
			 new Person();//匿名物件:在建立某個類的一個物件的時候,就會呼叫它的構造方法,並且在呼叫構造方法之前要先執行構造塊
			 new Person();//建立幾次物件就執行幾次構造塊,構造塊時和構造方法緊挨著的
		 }
	 }

在這裡插入圖片描述
從上面的結果我們可以看出,靜態塊是最先執行的。並且靜態塊只執行一次,不管你例項化多少個物件它都只執行一次。
(2)在主類中的程式碼塊

//3.靜態程式碼塊
	//(1)在主類中的靜態程式碼塊
	public class Construction{
		
	//以後在寫程式碼的時候就按照執行的順序來寫,這樣的話也有助於記住這個順序
    //靜態塊——》構造塊——》構造方法	
	 //靜態塊
	 static{
		 System.out.println("這是Construction的靜態塊");
	 }
		 
	 //構造塊	 
	 //定義在類中不加任何的修飾符
	 {
	 System.out.println("這是Construction的構造塊");
	 }
	 
	 //構造方法
	 public Construction(){//注意某個類的構造方法一定要在這個類裡.
		 System.out.println("這是Construction的構造方法");
	 }
		 public static void main(String[] args){
			 //new Construction();//匿名物件:在建立某個類的一個物件的時候,就會呼叫它的構造方法,並且在呼叫構造方法之前要先執行構造塊
			 //new Construction();//建立幾次物件就執行幾次構造塊,構造塊時和構造方法緊挨著的
			 //System.out.println("main");
		 }
	}

在這裡插入圖片描述
從主類中的程式碼塊我們可以看出,靜態塊先於主方法執行。
需要注意的幾點:
(1)對於非主類和主類中的靜態塊的main方法中為空靜態塊是否執行:

// //(1)在非主類的靜態塊
	 class Person{
	 
	// //以後在寫程式碼的時候就按照執行的順序來寫,這樣的話也有助於記住這個順序
    // //靜態塊——》構造塊——》構造方法	
	 // //靜態塊
	  static{
		  System.out.println("這是Person的靜態塊");
	  }
		 
	 // //構造塊	 
	 // //定義在類中不加任何的修飾符
	  {
	  System.out.println("這是Person的構造塊");
	  }
	 
	 // //構造方法
	  public Person(){//注意某個類的構造方法一定要在這個類裡.
		  System.out.println("這是Person的構造方法");
	  }
	}

	  public class Construction{
		  public static void main(String[] args){
			  //new Person();//匿名物件:在建立某個類的一個物件的時候,就會呼叫它的構造方法,並且在呼叫構造方法之前要先執行構造塊
			  //new Person();//建立幾次物件就執行幾次構造塊,構造塊時和構造方法緊挨著的
		  }
	  }

從上面的執行程式碼我們可以看出在非主類的靜態塊中如果主方法什麼都沒寫,它就不會執行靜態塊。

在這裡插入圖片描述

//(2)在主類中的靜態程式碼塊
	public class Construction{
		
	//以後在寫程式碼的時候就按照執行的順序來寫,這樣的話也有助於記住這個順序
    //靜態塊——》構造塊——》構造方法	
	 //靜態塊
	 static{
		 System.out.println("這是Construction的靜態塊");
	 }
		 
	 //構造塊	 
	 //定義在類中不加任何的修飾符
	 {
	 System.out.println("這是Construction的構造塊");
	 }
	 
	 //構造方法
	 public Construction(){//注意某個類的構造方法一定要在這個類裡.
		 System.out.println("這是Construction的構造方法");
	 }
		 public static void main(String[] args){
			 //new Construction();//匿名物件:在建立某個類的一個物件的時候,就會呼叫它的構造方法,並且在呼叫構造方法之前要先執行構造塊
			 //new Construction();//建立幾次物件就執行幾次構造塊,構造塊時和構造方法緊挨著的
			 //System.out.println("這是main方法");
		 }
	}

在這裡插入圖片描述
就算main方法中沒有任何執行語句,為空,靜態塊依然會執行。

(2)為什麼靜態塊只執行一次並且為什麼它比main方法還要先執行,以及為什麼會出現上面的main為空在主類和非主類的靜態程式碼塊的執行結果不同
首先,靜態塊是在位元組碼載入JVM之前執行的,它是屬於類的;JVM在找到類之前先找到它的.class檔案,在找這個檔案的過程中,只要看到了靜態塊中含有需要執行的語句就將它載入進去,這樣的話記憶體中已經存放了一份了,後面將不再對它進行單獨的執行,所以就只執行一次;對於靜態塊中沒有執行語句的時候它不會將靜態塊載入進去。由於它在找到類之前就已經載入進去了,所以自然會比main方法先執行(簡而言之,就是靜態塊對應的類中必須得有要執行的語句才會載入靜態塊)。對於上面出現的兩種情況,是因為如果是非靜態類的話,那個編譯的類名就不是含有靜態塊的那個類,所以如果你的主類裡面什麼都不寫那麼就不會載入靜態塊,自然執行結果也沒有。而主類中之所以可以載入靜態塊是因為拿的編譯的檔名就是含有靜態塊的類名,所以當JVM尋找這個類名的時候自然就載入了在這個類中的靜態塊。
(3)靜態塊為空的時候

// //(2)在主類中的靜態程式碼塊
	 public class Construction{
		
	// //以後在寫程式碼的時候就按照執行的順序來寫,這樣的話也有助於記住這個順序
    // //靜態塊——》構造塊——》構造方法	
	 // //靜態塊
	  static{
		  //System.out.println("這是Construction的靜態塊");
	  }
		 
	 // //構造塊	 
	 // //定義在類中不加任何的修飾符
	  {
	  System.out.println("這是Construction的構造塊");
	  }
	 
	 // //構造方法
	  public Construction(){//注意某個類的構造方法一定要在這個類裡.
		  System.out.println("這是Construction的構造方法");
	  }
		  public static void main(String[] args){
			 // //new Construction();//匿名物件:在建立某個類的一個物件的時候,就會呼叫它的構造方法,並且在呼叫構造方法之前要先執行構造塊
			 // //new Construction();//建立幾次物件就執行幾次構造塊,構造塊時和構造方法緊挨著的
			 System.out.println("這是main方法");
	   }
	 }
	

在這裡插入圖片描述
這個是當靜態塊為空的時候即是沒有執行語句的時候JVM就不會載入靜態塊