C#之面向物件最終篇
附加修飾符:
static
類成員: 類成員由static關鍵字修飾
特點:可以在未建立類的物件前就用類名直接呼叫類成員
類變數:由static關鍵字修飾的欄位
特點:
隸屬於類模板(共用)
直接使用類名.訪問
注意:無法使用物件引用.
類方法:
由static關鍵字修飾的方法
特點:
隸屬於類模板
直接使用類名.訪問
注意:
無法使用物件引用.
方法中不能使用this、base
靜態建構函式:(必須無引數)
static 類名(){}
用處:初始化static變數
特點:
每個類中都有此方法
不可被直接呼叫
使用類時自動執行(new 物件時,訪問類方法)
執行期間只執行一次
知識點:
一個類中包含什麼內容?
答:欄位 // Class c1 = new Class() c1.欄位
成員方法 // public void Method()
構造 new
析構 ~ 垃圾回收前自動調起
靜態方法 public static void Test
靜態欄位 public static int data2
靜態構造 使用類立即使用
成員屬性 new 物件
成員變數 標記物件的狀態
類屬性 public static int Data2{} 類名.
靜態類:
由static修飾的類
特點:
不能例項化(沒有物件)
共享,
使用方式:類名.訪問內容
原則:
靜態類中的所有成員必須是靜態的
\b:退格
public static class StaticTestClass
{
public static int n = 0;
public static void Add()
{
n++;
}
}
類的載入次序
如圖所示:

一.多類的載入次序
1.優先載入Main所在的類
2.執行Main方法
3.執行過程中使用到哪個類 載入哪個類
二.單個類的載入次序
1.載入類中的靜態變數 靜態方法
2.執行靜態構造為靜態變數進行初期化
3.當產生物件new物件時 分配成員變數和成員方法到物件中
注意:
非靜態的可以呼叫靜態和非靜態
靜態的只能呼叫靜態的
抽象(abstract)
抽象的意義:
描述抽象的概念,規定必須實現的方法的統一介面
抽象類:
用abstract關鍵字來修飾的類
abstract class AbstractClass
{
}
特點:
必須被繼承才可使用
不能被直接例項化
和密封類(sealed類)正好相反
抽象方法:
用abstract來修飾的方法
abstract returnType AbstractMethod ( [paramlist] );
特點:
必須被重寫(override)
只有方法頭,沒有方法體.
抽象方法必須在抽象類中.
規定:
1.抽象類中不一定包含抽象方法.
2.有抽象方法的類必定是抽象類.
3.抽象方法只是宣告,沒有方法的實現.
4.構造方法、類方法不能宣告為抽象方法.
5.子類必須實現抽象方法,除非子類也是抽象類.
6.抽象類中不一定全是抽象方法 可以有一部分具體實現.
密封(sealed) 被sealed修飾的類被稱為密封類
sealed class SealedClass { }
特性:密封類不能被繼承 被sealed修飾的方法被稱為密封方法
sealed override returnType SealedMethod([paramList]) { }
特性: 密封方法會重寫基類中的方法 密封方法無法被重寫
注意:必須始終與override一起使用
被sealed修飾的屬性被稱為密封屬性
sealed override returnType Property { set { } get { } }
特性: 密封屬性會覆蓋基類中的屬性 密封屬性無法被覆蓋
注意:必須始終與override一起使用
const&readonly
const :
定義的是靜態常量
宣告的同時賦值
執行期間不能改變它的值
屬於編譯時常量
不能用new初始化
const一般修飾值型別和String
readonly :
是隻讀變數
屬於執行時變數
可以在類constructor裡改變它的值
不能作用於區域性變數
初始化時機:
1.宣告的同時賦值
2.靜態變數的話 在靜態構造中初始化
3.非靜態變數的話 在非靜態構造中初始化
介面和索引器
什麼是介面:
在構建類的過程中,經常會遇到一種特殊的情況,在描述某個類的各個方法時,
對每個方法我們只能給出其功能實現的要求(原形宣告)但不能給出具體的功能實現(函式定義體)。
因為我們所處理的問題只是一個泛泛的功能說明,並沒有針對某一具體型別的問題來說明。
例:
動物吃:什麼動物吃?怎麼吃?吃什麼?只是個概念而已
動物睡覺:站?躺?坐?睜眼?閉眼?只是個概念而已
介面:
一組只有成員方法宣告沒有方法體的方法集。
介面中可寫的內容:
方法、屬性、索引器、事件
介面的作用:
提供了完全的抽象
規定類應具有的形式
介面中的方法在多個實現介面的類中表現出多型性
便於設計、管理、協作專案
介面的定義:
要點:類似於類的定義格式,只是以 interface作為定義符。
格式:
[訪問修飾符] interface 介面名
{
返回值型別 方法名([引數列表]);(只有宣告而無方法體)
}
或:
// 多繼承模式:
[訪問修飾符] interface 派生的介面名 : 父介面名列表
{
返回值型別 方法名([引數列表]);(只有宣告而無方法體)
}
注意事項:
介面中宣告的方法都是預設public的 不能自定義訪問級別
示例:
public interface Dispaly
{
? void ViewImage();
}
//實現介面
語法:
// 一個類可以實現多個介面
class 類名 : 介面1,介面2,介面3,......(,分割)
{
???? // 所有介面定義方法的實現
}
// 一個介面可以被多個類實現:
class 類1 : 介面1
{
� // 介面定義方法的實現
}
class 類2 : 介面1
{
// 介面定義方法的實現
}
class 類3 : 介面1
{
// 介面定義方法的實現
}
class 類4 : 介面1
{
// 介面定義方法的實現
}
虛擬函式:由Virtual修飾的函式.
實現原則:
實現的方法必須與介面中的原型定義保持一致
必須實現介面中的所有成員方法
實現方式:隱式實現、顯式實現
隱式實現:
interface Animal
{
void Eat();
}
class Cat : Animal
{
// 隱式實現在類中無法辨識該方法是那個介面的
public void Eat()
{
}
}
顯式實現:
interface Animal
{
void Sleep();
}
class Dog : Animal
{
// 顯式實現在類中明確方法是那個介面的,所有方法都是私有的
void Animal.Eat()
{
}
}
顯式\隱式的選擇:
若實現的所有方法均無重名,使用隱式
若實現的所有方法中出現重名,使用顯式
介面中的方法在實現類中呈現多型性:
介面回撥:介面引用=實現類物件
含義:
介面也是引用資料型別,可以指向任意實現了該介面的類例項
作用:
統一管理實現類物件
訪問顯式實現的方法
注意:
顯式實現的方法只能用介面回撥來呼叫到
無法用實現類引用呼叫到
示例:
public interface IHello
{
void Bellow();
}
// 顯式介面實現
public class Speak : IHello
{
void IHello.Bellow()
{
Console.WriteLine("Hello");
}
}
class MainClass
{
public static void Main (string[] args)
{
Speak speak = new Speak();
//speak.Bellow() error
(speak as IHello).Bellow();// 不安全
//原因:有可能出現空指標異常
IHello ih = speak as IHello;
if (ih != null)
{
ih.Bellow();//安全
}
}
}
抽象類和介面的區別:
1.介面用interface來定義,而不是class
2.介面不能建立例項,抽象類可以間接例項化(通過子類)
3.抽象的程度:介面完全抽象 抽象類部分抽象
4.介面採用多重繼承機制,類採用單一的繼承機制
索引器:
[訪問修飾符] 返回值型別 this[任意資料型別 index]{set{} get{}}
實質:方法的變異品種
作用:訪問方法從物件.方法名(引數)=>物件[引數]
自定義索引器 VS 陣列索引器:
(1)索引器的索引值(Index)型別不受限制
(2)索引器允許過載
(3)索引器不是一個變數
索引器 VS 屬性
(1)屬性以名稱來標識,索引器以函式形式標識
(2)索引器可以被過載,屬性不可以
(3)索引器不能宣告為static,屬性可以
要宣告類或結構上的索引器,請使用 this 關鍵字:
// Indexer declaration
// 最少有一個引數
public 資料型別 this[形參1,形參2......]
{
// get and set accessors
get
{
}
set
{
// 使用隱參value接收實際引數
}
}
介面中宣告索引器的方法:
資料型別 this [【引數列表】最少有一個引數]{set;get;}