Java面向對象(二):成員變量—OOP中的內存管理—構造函數
第一節 成員變量
1.1成員變量與局部變量
成員變量:聲明在類下面,方法外面;作用於整個類中;
局部變量:聲明在方法下面,作用於方法下面。
1.2 成員變量默認值
成員變量的默認值和數組的默認值一樣:
整數類型:0
浮點類型:0.0
字符類型:\u0000
布爾類型:false
字符串類型:null
1.3 成員變量和局部變量的區別
1.從聲明的位置: 局部變量聲明在方法中,成員變量聲明在類下面。
2.從默認值方面: 局部變量沒有默認值,成員變量有默認值。
3.從生命周期來說: 局部變量隨著方法的調用而開辟存儲空間,方法調用結束。
釋放存儲空間,成員變量隨著對象的消失而消失。
4.從存儲位置方面: 局部變量存儲在棧內存,成員變量存儲在堆內存 。
第二節 面向對象中JVM內存管理
2.1 類文件名
類文件是以.java為後綴的代碼文件,在每個類文件中最多只允許出現一個public類,
當有public類的時候類文件的名稱必須和public類的名稱相同,若不存在public,
則類文件的名稱可以為任意的名稱(以數字開頭的名稱是不允許的)。
2.2 棧內存、堆內存與方法區
JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method) 。
2.2.1堆區:
1.存儲的是對象和成員變量,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2.JVM只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
2.2.2棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
2.2.3方法區:
1.又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。
2.3 創建對象過程中內存中各類數據的執行情況
運行類過程:方法區找到方法--堆中實例化對象--調用棧(指向堆中實例)(有誤??????)
之前筆記存疑,確定後更新 待補充.........................
總結:
棧內存:基本的數據類型、對象的引用;
堆內存:一切new出來的對象,成員變量;
方法區:class文件、static變量、方法;
第三節 構造函數
3.1 構造函數
1、意義:對成員變量(類)初始化;
2、分類:無參構造函數 有參構造函數
3.3 this關鍵字
在java中的作用:
1、代表本身(本類) this.成員變量
2、可以調用本類相關的構造函數
無參調有參:this(參數列表);
有參調無參:this();
備註:
1、this關鍵字在調用自身的構造函數時,必須放在構造函數的第一行,否則報錯;
2、無參調有參,有參調無參只能存一,不能同時存在;
例程:Dog.java
3.3 構造函數的特點
1.沒有返回值(不用寫void)。
2.方法名必須和類名一致。
無參構造函數:
語法:
public 類名(){
方法體
}
有參構造函數:
語法:
public 類名(參數列表){
方法體
}
例程:Dog.java
1 package gouzao_this; 2 3 public class Dog { 4 5 String kind; 6 String name; 7 int age; 8 9 //無參構造函數 10 public Dog() { 11 //無參調有參,this調用自身的構造函數必須放在第一行否則會報錯 12 //this("大黃","土狗",9); 13 14 //有參與無參之間的相互調用只能存在一個不能同時都存在 15 kind = "erha"; 16 name = "shagou"; 17 age = 3; 18 System.out.println("無參調用"); 19 } 20 21 //有參構造函數 22 public Dog(String name,String kind,int age) { 23 // this(); //有參調無參 24 25 //this 關鍵字調用類本身 26 this.name = name; 27 this.kind = kind; 28 this.age = age; 29 System.out.println("有參調用"); 30 } 31 32 public void show() { 33 System.out.println("這是條叫"+name+"的"+kind+"今年"+age+"歲"); 34 } 35 36 }View Code
例程:測試Dog類:
1 package gouzao_this; 2 3 public class TextDog { 4 5 public static void main(String[] args) { 6 7 Dog dog1 = new Dog(); //調用無參構造函數 8 Dog dog2 = new Dog("大黃","土狗",4); 9 dog1.show(); 10 dog2.show(); 11 } 12 13 }View Code
思考:
1.構造函數中能否有retrun關鍵字?
可以,只用寫 return; 作為結束符;
2.有參構造函數中參數列表能否自行控制數量(數量能否不和成員變量一致)?
可以,想初始化幾個變量就初始化幾個變量
3. 有參構造函數和無參構造函數能夠獨立存在?
可以,但是最好都把它寫在類中。
備註:
1、構造函數在創建對象函數時執行,即對象的創建是對類的構造函數的調用;
2、若沒有創建構造函數時,系統會默認添加一個無參構造函數,new對象時會自動調用無參構造函數;
3、當添加了有參構造函數時,系統此時不會默認添加一個無參構造函數,需手動添加無參構造函數;若不添加無參構造函數,不能夠創建無參對象;
練習:用面向對象的思想實現之前的雙色球隨機數組,要求生成隨機數的最大值可以任意改變。
參考代碼:
1 package gouzao_this; 2 3 import java.util.Arrays; 4 import java.util.Random; 5 6 public class DoubleColerBall { 7 8 public void getNum(int redBallNum,int blueBallNum) { 9 10 int[] redBall = new int[6]; 11 int index =0; 12 int temp = 0; 13 int blueBN = 0; 14 15 Random r = new Random(); 16 // 生成紅色球的隨機數 17 redBall[index++] = r.nextInt(redBallNum)+1; 18 19 loop: while(true) { 20 21 temp = r.nextInt(redBallNum)+1; 22 for(int t=0; t<redBall.length;t++) { 23 24 if(redBall[t]==temp) { 25 26 continue loop; 27 28 } 29 } //for 循環 30 31 redBall[index++] = temp; 32 if (index==6) { 33 34 break; 35 } 36 37 } 38 39 40 // 藍色球隨機數 41 blueBallNum = r.nextInt(blueBallNum)+1; 42 43 int[] Ball = Arrays.copyOf(redBall, redBall.length+1); 44 45 Ball[Ball.length-1]=blueBallNum; 46 47 System.out.println("生成的數組為:"+Arrays.toString(Ball)); 48 49 } 50 51 }View Code
1 package gouzao_this; 2 /** 3 * 4 * @項目名稱:OOPDay02m 5 * @模塊功能:用面向對象的思想方法實現雙色球, 6 * 要求生成隨機數的最大值可以任意改變。 7 * @模塊版本: 8 * @JDKVersions:JDK 8.0 9 * @author: Kanekiyi 10 */ 11 public class TextDoubleCB { 12 13 public static void main(String[] args) { 14 15 DoubleColerBall DCB1 = new DoubleColerBall(); 16 // 輸入紅球藍球生成的數字最大數 17 DCB1.getNum(37,18); 18 } 19 20 }View Code
Java面向對象(二):成員變量—OOP中的內存管理—構造函數