<style>
img{border:1px solid gray;}
#sp{color:#CC0000;}
#imp{color:#CC0000;
font-style:bold;
background-color:#FFFFBB;}
#imp2{color:#5500FF;
font-style:bold;
background-color:#FFFFBB;}
#tit{color:white;
font-style:bold;
</style>
# CH07-物件(2020/06/11)
+ 所見即物件
+ 特徵:用變數來代表物件的特徵、屬性
+ 行為(功能)
+ <font id="sp">類別是物件的資料型態(type),一個物件是由某類別產生的一個實體 (instance)</font>
+ <font id="sp">先設計類別、再有物件</font>
+ 使用物件一律透過【<font id="sp"><b>.</b></font>】這個符號
+ 類別(class)可做為資料類型
## 物件參考變數
+ 宣告方式:<物件名稱> <變數名稱>
```java=1
Pen myPen = new Pen();
```
## 變數
### 區域變數(又稱:方法變數)
+ 宣告在方法內
+ JAVA<font id="sp">不會提供</font>初始值
+ 可先宣告在給值,如:
(O)int i = 10;
(O)int i; i=10;
### 實體變數(又稱:成員變數、屬性變數)
+ 宣告在方法之外、類別之內,且<font id="sp">無static修飾子</font>(有static的稱為類別變數、靜態變數)
+ JAVA會提供初始值
+ 若要給初始值,需在宣告的同時一起給值,不能先宣告後給值,如:
(O)double price = 1.5;
(X)double price; price = 1.5;
```java=1
public class Pen {
//實體變數,需透過物件參考變數進行操作
String brand;
double price;
//方法成員,需透過物件參考變數進行呼叫
public void showInfo() {
//區域變數
int i = 10;
System.out.println("牌子為:" + brand);
System.out.println("價格為:" + price);
}
}
```
### Java變數整理.xlsx
| 宣告| 初始值| 存取| 生命週期(scope)|
|-------- | -------- | -------- |-------- |
|區域變數(方法變數)| 宣告在方法裡面, 或是流程控制的區域裡面| 沒有預設初始值, 存取之前, 程式設計師要主動給予初始值| 只能在自己所宣告的區域內使用, 不能跨區直接使用| 如同名稱, 跟著自己所屬的區域或方法, 執行時存活, 當該區域或方法執行完畢, 此變數即被釋放|
實體變數| 宣告在方法外, 類別裡面, 而且沒有static關鍵字| 宣告後, Java會自動給予預設初始值, 根據資料型別有不同的初始值| <font color="red">只要在同個類別裡</font>, 可以跨不同方法使用(該方法不可以有static關鍵字), 透過物件參考變數存取| 如同名稱, 跟著所屬的物件實體創建而存在, 只要該物件實體還在, 此實體變數就會隨著物件存活著, 直到該物件消失才結束|
### 實體變數的預設初始值
|JAVA語言的資料型別(2大類)|變數型態|初始值|
|------ |------ | ------ |
|基本資料型別-1|byte|0|
|基本資料型別-2|short|0|
|基本資料型別-3|int|0|
|基本資料型別-4|long|0L|
|基本資料型別-5|float|0.0F|
|基本資料型別-6|double|0.0(D)|
|基本資料型別-7|boolean|<font id="sp">false</font>|
|基本資料型別-8|char|‘\u0000’|
|類別資料型別|類別型態|<font id="sp">null(空值)</font>|
### 實體變數、區域變數的差別
+ 參考pen.java、testPen.java
+ 顯示結果:
+ 第1次:
區域變數為:1
實體變數為:1
+ 第2次:
區域變數為:1
實體變數為:2
+ 因為myPen這個實體還存在,所以實體變數會持續+1
``` java=1
public class Pen {
//實體變數(又稱: 成員變數 , 屬性變數),需透過物件參考變數進行操作
String brand;
double price;
int cnt;
public void showInfo2() {
int i = 0;
System.out.println("區域變數為:" + ++i);
System.out.println("實體變數為:" + ++cnt);
}
}
public class PenTest {
public static void main(String[] args) {
Pen myPen = new Pen();
myPen.showInfo2(); //第1次執行時為1 1
myPen.showInfo2(); //第2次執行時為1 2
}
}
```