Java數組的聲明與創建


今天在刷Java題的時候,寫慣了C++發現忘記了Java數組的操作,遂把以前寫的文章發出來溫習一下。

首先,數組有幾種創建方式?

Java程序中的數組必須先進行初始化才可以使用,所謂初始化,就是為數組對象的元素分配內存空間,並為每個數組元素指定初始值,而在Java中,數組是靜態的,數組一旦初始化,長度便已經確定,不能再隨意更改。

聲明數組變量

首先必須聲明數組變量,才能在程序中使用數組。下面是聲明數組變量的語法:

dataType[] arrayRefVar;   // 首選的方法
 
或
 
dataType arrayRefVar[];  // 效果相同,但不是首選方法 c++沿用

但是以上只是聲明了數組,並不能直接使用,因為沒有為其分配內存空間,此時必須初始化。

例如以下代碼在Java8中就會報錯

public class test{
	public static void main(String[] arg) {	
 		int[] a;
		a[0]= 1;
		System.out.println(a[0]);
	}
}
// 系統將報錯 局部變量 a 可能尚未初始化
// 進一步加入我個人的理解,聲明的數組沒有確定大小,沒有辦法分配內存空間,所有必須初始化
// 但是以下代碼在Java中是禁止的
public class test{
	public static void main(String[] arg) {	
 		int[10] a;
		a[0]= 1;
		System.out.println(a[0]);
	}
}
// 系統將報錯 標記“10”上有語法錯誤,刪除此標記
// 不能像c++這樣初始化數組

所以,我們擁有兩種初始化數組的方式

  1. 靜態初始化:由程序猿自己確定每個數組元素的初始值,而數組的長度則由系統自己決定,例如:
int[] a = {1,2,3,4,5};
System.out.println(a.length);
// 第二行代碼可以看出,數組擁有類的性質,可以用dot訪問其變量
// 第一行代碼靜態初始化了數組整型數組a,賦予其固定的長度,系統可以為其分配空間
  1. 動態初始化:初始化時由程序猿確定數組的長度,而沒一個數組元素的值,則由系統來分配初始值,例如:
int[] b=new int[5];
System.out.println(b[0]);
// 很明顯,數組就是類

數組一定要初始化嗎?所謂的對數組初始化究竟是對什么初始化?是數組變量本身嗎?

答案看上去肯定是一定要,但是我在實踐中發現卻是不一定需要,要想搞清楚這個問題,我們需要理解數組變量數組對象的區別。而在認識他們之前需要先了解Java的數據類型。Java的數據類型分為兩種,基本數據類型引用數據類型

基本數據類型有八種:byte,short,int,long,float,double,boolean,char。只需要知道基本數據類型變量包含一個值,這個值的類型與變量相對應。

引用數據類型:引用型變量的值與基本類型變量不同,變量值是指向內存空間的引用(地址)。所指向的內存中保存着變量所表示的一個值或一組值。這和C++中的指針很相似,事實上Java語言中的引用實際上就是指針,是指向一個對象的內存地址。Java所說的不支持指針只是不支持指針的計算,但是指針類型被保留了下來,並稱為引用類型。聲明引用數據類型后,不可以直接使用,還需要實例化在堆內存中開辟內存空間。

數組變量是一個引用類型的變量,數組變量是指向堆內存當中的數組對象,並不是數組本身。當改變一個數組變量所引用的數組,就可以造成數組長度可變的假象。實際上數組對象本身的長度本沒有變化,只是數組變量指向了一個新的數組對象。

所以對於數組變量來說,他並不需要初始化,我們常說的初始化其實是初始化數組對象而非數組變量,有時候我們不進行初始化,而讓數組變量指向一個有效的數組對象,數組也可以使用,例如:

int[] a = {0,1,2,3,4};
int[] b;	
b = a;	
System.out.println(b[1]);
// 輸出結果為 1
b[1] = 99;	
System.out.println(a[1]);
// 輸出結果為 99
我自己的理解是,Java的數組就是一個對象。初始化數組的最好辦法就是new一個。
  • 數組的增強循環(也可用於其他集合)

    Java增強循環語句如下:

    for(聲明語句:表達式){
      // 代碼
    }
    // 冒號可以理解為"in"
    

    聲明語句:聲明新的局部變量,該變量的類型必須和數組元素的類型匹配。其作用域限定在循環語句塊,其值與此時數組元素的值相等(而不是數組的下標!!)。

    表達式: 表達式是要訪問的數組名,或者是返回值為數組的方法。

    實例

    public class Test {
       public static void main(String args[]){
          int [] numbers = {10, 20, 30, 40, 50};
     
          for(int x : numbers ){
             System.out.print( x );
             System.out.print(",");
          }
          System.out.print("\n");
          String [] names ={"James", "Larry", "Tom", "Lacy"};
          for( String name : names ) {
             System.out.print( name );
             System.out.print(",");
          }
       }
    }
    

    輸出結果

    10,20,30,40,50,
    James,Larry,Tom,Lacy,
    

    我們回頭理解其執行順序:

    1. 創建名為x的integer變量
    2. 將numbers的第一個元素賦值給x
    3. 執行大括號內的代碼
    4. 賦值給下一個元素x
    5. 重復執行至所有的元素都被運行

Java的變量類型

  • Java中有三種變量類型
    • 類變量:獨立於方法之外的變量,用static修飾
    • 實例變量:獨立於方法之外的變量,不過沒有static修飾
      • 類的每個對象特定的變量也是實例對象(顧名思義)
    • 局部變量:類的方法中的變量
public class variable{
    static int a = 0; // 類變量
    
    String str = "Java is easy to learn."; // 實例變量 實例變量聲明在類內而不是方法中
    
    public void method{
        int b = 1; // 局部變量 局部變量是聲明在方法中的
        // 局部變量在使用前必須初始化
        int x; 
        int z = x + 1; // 這就是錯誤的代碼,無法編譯
    }
}

聲明與初始化變量類型

  • 實例變量永遠會有默認值。如果沒有明確的賦值給實例變量,或者沒有調用setter,實例變量仍有默認值。
    • integers 0
    • floating points 0.0
    • Booleans false
    • references null
  • 局部變量沒有默認值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM