# GDSC OOP課程 Week 3
---
## Class Definitions
- 你過去可能學過String或者Scanner這些的,他們在java裡都是class
- 今天這門課要教你的是如何寫自己的class
----
### A Class Is a Type
- class是一種自己定義的型別
- 你可以用class去宣告一個變數,我們將它稱為object
----
### The Contents of a Class Definition
- class的內容包含成員變數與函數
- 通常我們將成員變數稱為屬性(property),函數則稱為方法(method)
- 屬性和方法統稱為class的成員(member)
- 物件是class的實體
----
### 概念示意圖

----
### Example of Class
```java
public class Duck {
public boolean canfly = false;
public void quack(){
System.out.println("Quack!!");
}
}
```
----
### The new Operator
- Object需要用class來宣告
- ex: className classVar;
- Object被創立時必須使用new運算子
- ex: new className();
- 通常因此習慣上,他們在宣告時會被寫成
- ex: className classVar = new className();
----
```java
public class Farm {
public static voidm ain(String[] args) {
Duckduck = new Duck();
}
}
```
----
### Instance Variables and Methods
- class的成員變數可以直接定義在class中
- ex: public String instanceVar;
- 當一個物件要存取他的成員時,可以用"."運算子
- ex: objectName.instanceVar;
----
```java
public class Farm {
public static void main(String[] args) {
Duckduck = newDuck();
boolean canTheDuckFly = duck.canfly;
if(canTheDuckFly == true){
System.out.println("The duck can fly");
}
duck.quack();
}
}
```
----
### Local Variables
- 所有在函數中宣告的變數都是區域變數
- 區域變數的生命週期,從宣告開始,直到其所在的{}區塊結束

----
### this Parameter
- 若成員變數與函數內的區域名稱相同時,則需要使用this這個關鍵字
- this會代指當前的物件實體

----
```java
public class Duck {
public boolean canfly = false;
public Duck(booleancanfly){
this.canfly = canfly;
}
public void quack(){
System.out.println("Quack!!");
}
public String eat(String food){
String message = "Thank you! The " + food + " is good!";
retur nmessage;
}
public void swim(intdistance){
distance = distance -1;
System.out.println("The distance of my swimming is "+ distance);
}
}
```
----
```java
public class Farm {
public static void main(String[] args) {
Duck duck = newDuck(true);
boolean canTheDuckFly = duck.canfly;
if(canTheDuckFly == true){
System.out.println("The duck can fly");
}
duck.quack();
String food = "Hamburger";
String message = duck.eat(food);
System.out.println(message);
intexpectedDistance = 10;
duck.swim(expectedDistance);
System.out.println("The expected distance is "+ expectedDistance);
}
}
```
----
題目(改自2022NCPC初賽):
有 $N$ 台飛機,塔台知道每一台飛機的id, xy座標以及高度。
塔台要避免飛機碰撞。
因此請你撰寫一隻程式,將平面座標距離小於等於 $distance$ 的飛機編號列出。
輸入說明:
第一航有兩個整數 $N$, $distance$
接下來有 $N$ 行,每一行分別有飛機的 $id, x, y, h$。
輸出說明:
每一行輸出兩個 $id$ ,代表距離過近塔台給予警告,兩個 $id$間用一個空白相隔。
---
# Encapsulation
----
### public and private Modifiers
- public的成員代表對於該成員的存取和修改沒有任何限制
- private的成員代表該成員不能在class以外的地方被存取
- 在良好的coding習慣中,所有成員變數都應該是private
- 多數的method應該是public,並且提供對成員變數的操作
- 若method為private通常代表他只是一個helper function
----

----

----
### Overloading
- Overloading允許多個函數都使用同一個名稱的
- 在java的規則上,若函數使用相同名稱,則函數的signature必須不同
- 函數的signature由函數名稱以及parameters構成
- 只要parameter的數量或者型別不同,就算是不同的signature
----
- 
----
### Constructors
- Constructors是一個特殊的method
- 他會在object被建立自動呼叫
- 他的名稱必須與class一致
- 沒有return type,連void都不能
- 可以被overload
- 若一個class沒有撰寫constrcutor,compiler會自動幫你補一個沒有任何參數內容為空的constructor
- 通常會用來初始化成員變數的初始值
----
### Static Methods
- 使用static關鍵字
- static method可以在沒有物件實體的情況下呼叫
- 使用className去呼叫他

----

----
### Static Variables
- 使用static關鍵字
- static成員變數會再所有object之間共用
- 所有object會讀取/修改到同一個變數

----
### Constant Variables
- 使用final關鍵字
- 必須在宣告時給予初始值
- 宣告後就再也不可以修改他的值

---
## Variables and Memory
- 一台電腦的main memory可以被想成是一條很長的紙帶
- 紙帶上每一格可以儲存0或1,稱為位元(bit)
- 每8個位元視為一個位元組(byte),記憶體位置以byte為單位
- 變數由在記憶體中連續的一至多個byte組成
- 變數的記憶體位置就是這些連續的記憶體之中的第一個byte的位置
----

----
### References
- 若變數型別是原生的型別,則變數值直接存在該變數的記憶體上
- 若該變數是個物件,則變數的記憶體上只會存物件所在的記憶體位置編號
- 兩個不同的變數可以存相同的物件實體
----

----

----

----

----
### The Constant null
- null 是一個特殊的常數可以被assign給任意class type的變數
- 不可以用null來存取/呼叫/修改class的成員
- 通常用來代表空值或者不存在
----

{"metaMigratedAt":"2023-06-17T11:06:15.093Z","metaMigratedFrom":"Content","title":"GDSC OOP課程 Week 3","breaks":true,"contributors":"[{\"id\":\"fce77d18-d79a-4633-9bad-3728ba4c91db\",\"add\":5425,\"del\":747}]"}