一、理解面向對象編程
1.C#,是純面向對象編程。
所謂面向對象編程,我個人理解是,我們只用對象去實現我們的功能,這樣可以很容易達到重復利用。過去用C編程時,我們要用重復的代碼,首先考慮到肯定是聲明一個函數來封裝,使用時再調用即可。但是我想重復使用一類代碼(比如創建一個窗體的代碼),我們用面向過程的方式去歸這一類代碼比較困難,而且調用起來也不靈活,於是出現了 ”類“ 這個玩意,對應的便是面向對象編程。
2.C#,創建對象變量。
格式:類名 對象名;
是不是看起來像在C語言中聲明一個變量。沒錯,格式是一模一樣。而且在面向對象編程語言中(C#、java等),萬物皆對象。你聲明一個變量,比如:sting str;,”str“也是對象。我們聲明對象變量就用類名去聲明就好了。上面我們聲明了一個可以放對象的變量,但是它里面啥也沒有,可以理解為創建了一個可以放該類型的空盒子。其實它的默認值是”null“,就是沒有分配內存。
假設有一個類叫“服裝”,然后我想聲明一個盒子(對象變量)叫“褲子1號”,具體操作就是 :“ 服裝 褲子1號;”
3.C#,創建對象(實例化)。
格式:new 類的構造函數();
先縷清幾個詞語:
對象:名詞,就是從抽象類中造出來實物。比如”服裝“,這個名詞比較抽象,沒有具體的說明是這件上衣還是那條褲子。那么我們就要把它具體化,”new 服裝類構造函數()“,這里得到的是一個”衣服“的具體對象,於是對象就創出來了,可以存到變量里,也可以直接創建出來被引用。
對象變量:名詞,就是類似普通變量,存放相應對象的變量。
實例化:動詞,創建對象的過程叫做實例化。
在C#中”new“關鍵字功能很多,下面會詳細一起談。最常用功能的就是實例化。
4.C#,為對象變量賦值。
格式:對象變量名 = 對象;
和變量賦值一模一樣,就是把對象賦給對象變量。
比如: 褲子1號 = new 服裝();
上面的“褲子一號”是提前聲明了的,也可以連在一起:服裝 褲子 = new 服裝();聲明對象變量的同時,實例化並賦值。
5.C#,構造函數。
創建對象時調用的方法。它的名字是和類名一樣的。默認構造函數是不帶參數的,也沒有其他邏輯內容,並且隱藏起來的,就是你創建一個類時,不會顯示構造函數。
可以顯式重寫構造函數,在里面實現一些邏輯,這些邏輯都是在創建對象時實現的。
還可以重載構造函數,即聲明帶參數的構造函數,比如聲明一個服裝的構造函數,有一個參數,參數類型為sting,用來定義這個服裝的面料。
使用這個構造函數例子如下:
服裝 睡衣 = new 服裝(string 純棉);
服裝 外套 = new 服裝(string 羽絨);
如果還想使用無參構造函數,必須聲明一個無參構造函數,因為匿名那個已經被重寫了,所以只能重載一個無參構造函數。
6.C#,析構函數。
析構函數,用來回收對象的,即釋放對象所占的內存。正常情況下,我們不需主動調用析構函數,因為C#有垃圾自動回收功能,但是不能小瞧這個功能,正所謂存在即合理,我這里就先不談它,留下15個坑,到時候有空專門寫一遍文章淺談它的妙處。
坑坑坑坑坑
坑坑坑坑坑
坑坑坑坑坑
二、new 的用法總結
1.創建對象
如 Animal cat = new Animal();
new出的對象也可以直接引用
如 聲明了一個函數 void Eat(Animal myAnimal),它的參數是Animal類型,調用是可以這樣子Eat(new Animal);
2.也用於為值類型調用默認的構造函數
例:int num= new int();
num 初始化為 0,它是 int 類型的默認值。該語句的效果等同於:int myInt = 0;
3.new 修飾符式隱藏從基類繼承的成員
本人比較懶,下面代碼隨便網上找了一些粘貼:
public class MyClass
{
public int x; public void Invoke() {} }
在派生類中用 Invoke 名稱聲明成員會隱藏基類中的 Invoke 方法,即:
public class MyDerivedC : MyClass
{
new public void Invoke() {} }
通過繼承隱藏名稱采用下列形式之一:
1.引入類或結構中的常數、指定、屬性或類型隱藏具有相同名稱的所有基類成員。
2.引入類或結構中的方法隱藏基類中具有相同名稱的屬性、字段和類型。同時也隱藏具有相同簽名的所有基類方法。
3.引入類或結構中的索引器將隱藏具有相同名稱的所有基類索引器。
4.在同一成員上同時使用 new 和 override 是錯誤的。
注意:在不隱藏繼承成員的聲明中使用 new 修飾符將生成警告。
示例
在該例中,基類 MyBaseC 和派生類 MyDerivedC 使用相同的字段名 x,從而隱藏了繼承字段的值。該例說明了 new 修飾符的使用。同時也說明了如何使用完全限定名訪問基類的隱藏成員。
using System;
public class MyBaseC { public static int x = 55; public static int y = 22; }
public class MyDerivedC : MyBaseC { new public static int x = 100; // Name hiding
public static void Main() { // Display the overlapping value of x: Console.WriteLine(x); // Access the hidden value of x: Console.WriteLine(MyBaseC.x); // Display the unhidden member y: Console.WriteLine(y); } }
輸出
100
55
22
如果移除 new 修飾符,程序將繼續編譯和運行,但您會收到以下警告:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
如果嵌套類型正在隱藏另一種類型,如下例所示,也可以使用 new 修飾符修改此嵌套類型。
示例
在該例中,嵌套類 MyClass 隱藏了基類中具有相同名稱的類。該例不僅說明了如何使用完全限定名訪問隱藏類成員,同時也說明了如何使用 new 修飾符消除警告消息。
using System;
public class MyBaseC { public class MyClass { public int x = 200; public int y; } } public class MyDerivedC : MyBaseC { new public class MyClass // nested type hiding the base type members { public int x = 100; public int y; public int z; } public static void Main() { // Creating object from the overlapping class: MyClass S1 = new MyClass(); // Creating object from the hidden class: MyBaseC.MyClass S2 = new MyBaseC.MyClass(); Console.WriteLine(S1.x); Console.WriteLine(S2.x); } }
輸出
100
200
雖然已經找不到這位前輩總結隱藏用法的連接,但是還是很感謝他!