一、面向對象的核心概念
(一)抽象——面向對象的根基
講到抽象,不得不涉及到現代科學技術的基礎——數學。
數學是一門抽象的科學,面對着紛繁復雜的世間萬物,數學不理會各種事物的獨特特性,而只抽取它們在數量上的特性,深刻揭示了“世間萬物”在數量上表現出的共同規律,抽象正是數學的本質特征。
數學的一個分支——離散數學是計算機科學的根基之一,因此,計算機科學從誕生之日起,就與數學有着密不可分的聯系,抽象思維也是計算機科學的主要思維方法之一。
在使用面向對象的方法設計一個軟件系統時,首先就要區分出現實世界中的事物所屬的類型,分析它們擁有哪些性質與功能,再將它們抽象為在計算機虛擬世界中才有意義的實體——類,在程序運行時,由類創建出對象,用對象之間的相互合作關系來模擬真實世界中事物的相互關聯。
在從真實世界到計算機虛擬世界的轉換過程中,抽象起了關鍵的作用。
(二)面向對象的三大基本特性
1.封裝
封裝的類=數據+對此數據所進行的操作(即算法)
通俗的說,封裝就是:包起外界不必需要知道的東西,只向外界展露可供展示的東西。
2.繼承
真實世界中,事物之間有着一種派生關系,比如“食品”這一大類中包括“水果”這一子類,而“蘋果”又包含在“水果”這一子類中。
在計算機世界中,以面向對象的觀點不僅將上述事物抽象為類,而且將事物之間的派生關系也一並模擬出來,這種關系稱為“繼承”。
在面向對象軟件系統中,繼承除了模擬現實世界中事物關系這一作用,還是一個“重用已有代碼而又不破壞已有代碼”的方法。
3.多態
在代碼中本應使用某一具體子類的地方使用較為抽象的基類對象,這種方法所帶來的好處是多態的代碼具有“變色龍”的特性,即在不同的條件下,同樣代碼可以完成不同的功能。
二、類與對象
(一)類是面向對象編程的基本單元。
(二)字段即變量,方法即函數。
函數分為變量函數(字段的保護),行為函數。
實例方法:對象可以調用,類不能調用。
方法的重載:1.同名2.參數類型不同或個數不同
(三)傳值與傳址
傳值引用:整形變量,浮點型變量,結構體,日期時間(存儲在棧空間)
傳址引用:字符串,數組,類。(存儲在堆空間)
例題:小狗——類的傳址引用
class dog { public string name; public void bark() { Console.WriteLine("汪汪,我的名字叫"+name); } } static void Main(string[] args) { dog a = new dog(); dog b = new dog(); a.name = "旺財"; b.name = "守家"; a.bark(); b.bark(); //將a的引用地址復制給c,a和c將同時控制同一個對象; //c將對象屬性改變后,a指向的也是一個改變后的對象。 dog c = a; c.name = "大黃"; a.bark(); //將b的引用地址復制給a和c,a、b、c、控制同一個對象; //a、b原來指向的對象沒有地址指向它,無法被調用,稱為垃圾。 a = b; c = b; a.bark(); b.bark(); c.bark();
例題:用oop解決泳池問題
//創建圓的類 class circle { public double r; public double getLength() { double l = 2 * 3.14 * r; return l; } public double getArea() { double s = 3.14 * r * r; return s; } } //求游泳池的周長和廣場面積 static void Main(string[] args) { circle small = new circle(); circle big = new circle(); Console.Write("請輸入小圓半徑"); small.r=Convert.ToInt32(Console.ReadLine()); Console.Write("請輸入大圓半徑"); big.r = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("泳池周長:"+small.getLength()); Console.WriteLine("廣場面積:"+(big.getArea()-small.getArea())); }
例題:狗咬狗——方法的重載
class dog { public string name; public int HP = 100; public void bark() { Console.WriteLine("汪汪,我的名字叫" + name); } public void bite(dog op) { Console.WriteLine(name + "開始攻擊" + op.name); op.HP -= 10; Console.WriteLine(name + "的血量:" + HP + "\n" + op.name + "的血量:" + op.HP); } } class people { public string name; public void attackDog(dog op) { op.HP -= 10; Console.WriteLine(name+"開始打狗\n"+op.name+"的血量:"+op.HP); } public void attackDog(dog op, int blood) { op.HP -= blood; Console.WriteLine(name+"開始打狗\n"+op.name+"的血量:"+op.HP); } } static void Main(string[] args) { //狗咬狗 dog a = new dog(); dog b = new dog(); a.name = "旺財"; b.name = "守家"; a.bite(b); b.bite(a); //人打狗,函數的重載 people h = new people(); h.name = "秋香"; h.attackDog(a); h.attackDog(a,15); }
例題:opp的字段保護——學生信息
class student { /*通過設置private,在本類之外無法直接操作該類的字段, 必須通過調用該類的函數(稱為變量函數)來訪問,起到保護字段的作用*/ public string name; private int height; private int weight; public void setHeight(int a) { if (a > 0 && a < 1000) { height = a; } else { Console.WriteLine("身高輸入不正確"); } } public int getHeight() { return height; } public void setWeight(int a) { if (a > 0 && a <= 1000) { weight = a; } else { Console.WriteLine("體重輸入不正確"); } } public int getWeight() { return weight; } public void speak() { Console.WriteLine("我叫"+name+";體重:"+weight+"千克。身高:"+height+"cm"); } } static void Main(string[] args) { student a = new student(); a.name = "王小明"; a.setHeight(170); a.setWeight(80); a.speak(); }





