Java中的基本資料型別與引用資料型別

計蒜未來發表於2021-01-21

一、基本資料型別

  • byte、short、int、long(整數型別)
  • float、double(浮點數型別)
  • char(字元型)
  • boolean(布林型別 )

Java資料大多數存放在堆疊中。

  • 棧區:存放區域性變數,物件宣告的引用等。

  • 堆區:存放new關鍵字建立的類(包含成員變數)和陣列等。

堆與棧的優缺點

  • 棧的優點:棧資料可以共享,存取速度比堆。   缺點是:存在棧中資料大小與生命週期是確定的。

  • 堆的優點:可以動態分配記憶體大小,生存期也不必事先告訴編譯器。缺點是:存取速度較

舉個例子,如下圖:

  • 編譯器會在棧中建立一個a的引用,然後在棧中查詢字面值為5的引用,將a指向5的地址,若沒有找到,就會開闢一個地址來

    存放字面值5,然後再將a指向該地址。定義int c=5;因為棧中存在字面值5,所有c會直接指向5的地址。令a=8,因為棧中

    沒有字面值為8的引用,所有會開闢一個地址存放8,a會重新指向8的地址,c的指向不受a影響,c的值不會改變。

二、引用資料型別

1. Class(類)

2. Interface(介面)

3. Array(陣列)

  • Java是物件導向語言,它為每一個基本資料型別都做了相應的包裝類(見上一個表格),也就是實現了基本型別變數到包裝類

    物件的轉換。引用型別一般通過new關鍵字來建立,(物件)它存放在記憶體的中,可以在執行時動態的分配記憶體大小。引用

    變數中存放的是變數內容的地址,它存放在記憶體的中。當引用型別變數不被使用時,Java內部的垃圾回收器GC會自動回收

1.程式碼示例-Class:

public class Demo {
	String Name;
	int Age;
	double Score;
	Demo(String Name,int Age,double Score){
        //定義帶三個引數的建構函式,進行初始化
		this.Name=Name;
		this.Age=Age;
		this.Score=Score;
	};
	public static void main(String[] args) {
		Demo d1=new Demo("小吳",20,98);
		Demo d2=new Demo("小天",19,80);
	}
  }

  • 引用本身是保留在中的,而引用所指的物件是存放在中的。

2.程式碼示例-Interface

interface Animal {//定義Animal介面
      public void eat();
      public void speak();
}
public class Dog implements Animal {//Dog類實現Animal介面 
      public void eat() {
            System.out.println("我喜歡吃骨頭!");
	}
      public void speak() {
            System.out.println("汪汪汪!");
	}
      public static void main(String[] args) {
            Dog d=new Dog();
            d.eat();
            d.speak();
	}
}
  • 編寫介面的方式和類很相似,但是它們屬於不同的概念。類描述物件的屬性和方法。介面則包含類要實現的方法。

  • 介面與類的區別:

  1. 介面不能用於例項化物件。

  2. 介面沒有構造方法。

  3. 介面中所有的方法必須是抽象方法。

  4. 介面不能包含成員變數,除了 static 和 final 變數。

  5. 介面需要被類實現。

  6. 介面支援多繼承。

3.程式碼示例-Array

public class Array {
      public static void main(String[] args) {
            int[] myList = new int[] {5,2,0,1,3,1,4};
      for(int list: myList) {
            System.out.print(list);
      }
      }
}
  • 在以上程式碼中,myList變數存放了陣列物件的引用,它存放到棧中,而陣列物件所佔的空間在堆上被分配(和上圖一樣)。

擴充1:

  • 方法的返回值型別為類名:返回該類的物件。

  • 方法的返回值型別為介面名:返回該介面的實現類的物件。

 public static Comparable findMax(Comparable[] arr) {
      int maxIndex=0;
      for(int i=1;i<arr.length;i++)
            if(arr[i].compareTo(arr[maxIndex])>0)
                  maxIndex=i;
      return arr[maxIndex];
 }
  • 上述程式碼中,傳遞引數為實現了Comparable介面的物件陣列,方法返回的是Comparable介面的實現類的物件。

  • 我們通常會使用Object、介面型別等方式來表示泛型,目的是支援程式碼重用。

擴充2:自動裝箱與拆箱

  • 自動裝箱:如果一個int型量被傳遞到需要一個Integer物件的地方,編譯器將在幕後插入一個對Integer構造方法的呼叫。

  • 自動裝箱:如果一個Integer物件被放到需要int型量的地方,則編譯器將在幕後插入一個對intValue方法的呼叫。

注:參考《資料結構與演算法分析Java語言描述》和 菜鳥教程

相關文章