第五週 學習筆記
院會活動開始準備工作,學習間間斷斷,效果很不好。進度也有所拖慢。
面向物件
面向物件(OOP,Object-Oriented programming)不是取代面向過程的。OOA(面向物件設計)、OOD(面向物件架構)
程式碼從上往下執行,這就叫面向過程。面向過程處理比較麻煩時可以用面向物件。
類、物件。“人”是類,“張三”是“人”這個類的物件。類是抽象的,物件是具體的。按鈕就是類,某個按鈕就是物件。物件可以叫做類的例項(Instance)。類就像int,物件就像10。
比如唐中科不是人,是某個人。
類是對一些有共同地方的一堆東西的抽象表達。
比如上圖,按鈕們是一類,每一個是物件,他們有些差異。
欄位Field(和某個物件相關的變數),欄位就是類的狀態(不同的物件可能不一樣的狀態就是欄位)。人這個類有姓名、年齡、身高等欄位。類不佔記憶體,物件才佔記憶體。欄位描述物件特點的資料。眼睛的個數不能做為欄位,因為所有人的眼睛個數都一樣,沒有差異性。
方法Method(函式),方法就是類能夠執行的動作,比如問好、吃飯、立正稍細、一個人長高、減肥等。
類的繼承,類之間可以有繼承關係,比如“電腦”類可以從“電器”類繼承,這樣的好處是“電腦”類只需要定義自己特有的欄位、方法就可以,也就是隻要定義記憶體大小、CPU型號這些欄位或者彈出光碟機等方法就可以。父類(Parent)、基類(Base,基業,祖宗十八代傳下來的)。電腦類是電器類的子類(ChildClass)。重用。父類有的子類都有。
Eg:描述人類的特徵,你會說直立行走啥的,也不用描述人是有碳水化合物啊,基因啊啥的了,因為人是動物,所以動物的特徵你並不需要描述了。
面向物件的三個特性:封裝、繼承、多型。一級比一級難。
定義類
lass person
{
}
就像定義一個列舉一樣
如下,定義我這個 人類 的特比的狀態,或者說是欄位:
然後定義我這個類有哪些方法,比如說問好:
void sayhello() 類似定義函式的返回值 名字 引數
我也可以:
返回一個身高,就像一個函式。
注意:類的定義裡面只能寫欄位的定義和方法的定義,不能直接寫其他程式碼,這是個易錯點。
也不能在綠色處寫什麼int i=i+5
但在賦值的時候可以寫:
賦值程式碼會在物件建立的時候執行
//這也不是在宣告變數,這是在宣告欄位。
//
class Program
{
static void Main(string[] args)
{
person p1 = new person();//創建出一個人類//定義person類變數p1,指向建立的person類的物件
p1.gender = true;
p1.height = 180;
p1.name = "亞當";
p1.sayhelllo();
Console.ReadKey();
}
}
//這裡和在main中寫string name =“ff”;bool gender;是不一樣的,不是一行一行執行程式碼,這裡是在宣告類的欄位。
// class person
{
public string name;
//這也不是在宣告變數,這是在宣告欄位
public bool gender;
public int height;
public void sayhelllo()
{
Console.WriteLine("你好啊");
}
}
一個小問題,瞭解即可↓
成員訪問級別:
欄位、方法、屬性(後面講)都可以叫做類的成員Member,它們都需要定義訪問級別。訪問級別的用處在於控制成員在哪些地方可以被訪問,這樣達到面向物件中“封裝”的目的。程式中不要“攝魂大法”,否則程式碼會非常亂。
幾個訪問級別:public(任何地方都可以訪問);private(預設級別。只能由本類中的成員訪問)。還有internal、protected兩個級別。
注意:永遠不要把欄位public
欄位一般都是private
欄位開頭小寫?????
//呼叫者只能通過方法來請求物件改變他的狀態,是否改變
//改變多少是類自己決定的。這是為什麼欄位不能public的原因???
物件的引用
Eg1:i1=3;i2=i1;i1++;//i2是3;
Eg2:p1=new Person();p1.i=3;p2=p1;p1.i++;//p2.i是4;
int、decimal、bool、byte、enum等基礎型別(值型別)是傳遞拷貝;物件(引用型別)則是傳遞引用。因為基礎型別不怎麼佔記憶體,而物件則比較佔記憶體;
函式間傳遞物件;
為物件變數重新賦值。p2=p1是讓p2指向p1指向的物件;
P1=new persion ………………p2=new peision
P2.heiight=190後,p1指向的物件也變成190。
從而顯示:
190
190
改了p1和p2此時的共同指向物件為3000後,打印出:
190
190
3000
//函式間傳遞普通的類的物件也是引用傳遞
//P1不知向任何的物件,如果p1之前指向過物件,則切斷p1和物件間的關係.
//p1=null後即他不在指向任何物件,所以無法修改“指向物件的height屬性”,然後你讓p1指向的物件變為60,那當然是報錯了。
//編譯的錯誤和執行的錯誤。
//以後如果碰到NullReferenceException,先看變數是不是指向了物件。
依然輸出a,b
//除非用ref,才是真正把s1變數傳進來,否則你這樣依然是指向s1所指的值。
//Swapstring和dotit的區別Swapstring是想要修改變數的指向
//Dotit是修改變數指向的物件的狀態。