1. 程式人生 > >Java中的基本資料型別與引用資料型別

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

**一、基本資料型別** * byte、short、int、long(整數型別) * float、double(浮點數型別) * char(字元型) * boolean(布林型別 ) ![](https://img2020.cnblogs.com/blog/2282070/202101/2282070-20210120002248865-1127605676.png) **Java資料大多數存放在堆疊中。** * 棧區:存放區域性變數,物件宣告的引用等。 * 堆區:存放**new關鍵字**建立的類(包含成員變數)和陣列等。 **堆與棧的優缺點** * 棧的優點:棧資料可以**共享**,存取速度比堆**快**。   缺點是:存在棧中**資料大小與生命週期是確定**的。 * 堆的優點:可以**動態分配記憶體大小**,生存期也不必事先告訴編譯器。缺點是:存取速度較**慢**。 **舉個栗子,如下圖:** ![](https://img2020.cnblogs.com/blog/2282070/202101/2282070-20210120003811085-115291603.png) * 編譯器會在棧中建立一個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); } } ``` ![](https://img2020.cnblogs.com/blog/2282070/202101/2282070-20210121002713816-1346635707.png) * 引用本身是保留在**棧**中的,而引用所指的物件是存放在**堆**中的。 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(i