1. 程式人生 > >Java面向對象(二):成員變量—OOP中的內存管理—構造函數

Java面向對象(二):成員變量—OOP中的內存管理—構造函數

生成 類名 存在 str jdk 項目 -a 系統 show

第一 成員變量

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中的內存管理—構造函數