# 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的實體 ---- ### 概念示意圖 ![](https://i.imgur.com/hslwJj2.png) ---- ### 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 - 所有在函數中宣告的變數都是區域變數 - 區域變數的生命週期,從宣告開始,直到其所在的{}區塊結束 ![](https://i.imgur.com/F03SOVm.png) ---- ### this Parameter - 若成員變數與函數內的區域名稱相同時,則需要使用this這個關鍵字 - this會代指當前的物件實體 ![](https://i.imgur.com/VJsCvDP.png) ---- ```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 ---- ![](https://i.imgur.com/qtPZXlu.png) ---- ![](https://i.imgur.com/QhzBiGr.png) ---- ### Overloading - Overloading允許多個函數都使用同一個名稱的 - 在java的規則上,若函數使用相同名稱,則函數的signature必須不同 - 函數的signature由函數名稱以及parameters構成 - 只要parameter的數量或者型別不同,就算是不同的signature ---- - ![](https://i.imgur.com/7iawc3W.png) ---- ### Constructors - Constructors是一個特殊的method - 他會在object被建立自動呼叫 - 他的名稱必須與class一致 - 沒有return type,連void都不能 - 可以被overload - 若一個class沒有撰寫constrcutor,compiler會自動幫你補一個沒有任何參數內容為空的constructor - 通常會用來初始化成員變數的初始值 ---- ### Static Methods - 使用static關鍵字 - static method可以在沒有物件實體的情況下呼叫 - 使用className去呼叫他 ![](https://i.imgur.com/K937g0G.png) ---- ![](https://i.imgur.com/f4l2KDd.png) ---- ### Static Variables - 使用static關鍵字 - static成員變數會再所有object之間共用 - 所有object會讀取/修改到同一個變數 ![](https://i.imgur.com/eKWpQbf.png) ---- ### Constant Variables - 使用final關鍵字 - 必須在宣告時給予初始值 - 宣告後就再也不可以修改他的值 ![](https://i.imgur.com/nITnnJb.png) --- ## Variables and Memory - 一台電腦的main memory可以被想成是一條很長的紙帶 - 紙帶上每一格可以儲存0或1,稱為位元(bit) - 每8個位元視為一個位元組(byte),記憶體位置以byte為單位 - 變數由在記憶體中連續的一至多個byte組成 - 變數的記憶體位置就是這些連續的記憶體之中的第一個byte的位置 ---- ![](https://i.imgur.com/J5i0RAE.png) ---- ### References - 若變數型別是原生的型別,則變數值直接存在該變數的記憶體上 - 若該變數是個物件,則變數的記憶體上只會存物件所在的記憶體位置編號 - 兩個不同的變數可以存相同的物件實體 ---- ![](https://i.imgur.com/Kwa1ZwH.png) ---- ![](https://i.imgur.com/Vx0lMzV.png) ---- ![](https://i.imgur.com/yQYErlW.png) ---- ![](https://i.imgur.com/5p8x4z2.png) ---- ### The Constant null - null 是一個特殊的常數可以被assign給任意class type的變數 - 不可以用null來存取/呼叫/修改class的成員 - 通常用來代表空值或者不存在 ---- ![](https://i.imgur.com/vX5NNAr.png)
{"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}]"}
    629 views