附加修飾符:
static
類成員: 類成員由static關(guān)鍵字修飾
特點(diǎn):可以在未創(chuàng)建類的對(duì)象前就用類名直接調(diào)用類成員
類變量:由static關(guān)鍵字修飾的字段
特點(diǎn):
隸屬于類模板(共用)
直接使用類名.訪問
注意:無法使用對(duì)象引用.
類方法:
由static關(guān)鍵字修飾的方法
特點(diǎn):
隸屬于類模板
直接使用類名.訪問
注意:
無法使用對(duì)象引用.
方法中不能使用this、base
靜態(tài)構(gòu)造函數(shù):(必須無參數(shù))
static 類名(){}
用處:初始化static變量
特點(diǎn):
每個(gè)類中都有此方法
不可被直接調(diào)用
使用類時(shí)自動(dòng)執(zhí)行(new 對(duì)象時(shí),訪問類方法)
運(yùn)行期間只執(zhí)行一次
知識(shí)點(diǎn):
一個(gè)類中包含什么內(nèi)容?
答:字段? ? // Class c1 = new Class()? c1.字段
? ? 成員方法? // public void Method()
? ? 構(gòu)造? ? new
? ? 析構(gòu)? ? ~ 垃圾回收前自動(dòng)調(diào)起
? ? 靜態(tài)方法? public static void Test
? ? 靜態(tài)字段? public static int data2
? ? 靜態(tài)構(gòu)造? 使用類立即使用
? ? 成員屬性? new 對(duì)象
? ? 成員變量 標(biāo)記對(duì)象的狀態(tài)
? ? 類屬性? ? public static int Data2{} 類名.
靜態(tài)類:
由static修飾的類
特點(diǎn):
不能實(shí)例化(沒有對(duì)象)
共享,
使用方式:類名.訪問內(nèi)容
原則:
靜態(tài)類中的所有成員必須是靜態(tài)的
\b:退格
示例:
public static class StaticTestClass
{
? ? ? public static int n = 0;
? ? ? public static void Add()
? ? ? {
? ? ? ? ? n++;
? ? ? }
}
類的加載次序
如圖所示:

一.多類的加載次序
1.優(yōu)先加載Main所在的類
2.執(zhí)行Main方法
3.執(zhí)行過程中使用到哪個(gè)類 加載哪個(gè)類
二.單個(gè)類的加載次序
1.加載類中的靜態(tài)變量 靜態(tài)方法
2.執(zhí)行靜態(tài)構(gòu)造為靜態(tài)變量進(jìn)行初期化
3.當(dāng)產(chǎn)生對(duì)象new對(duì)象時(shí) 分配成員變量和成員方法到對(duì)象中
注意:
非靜態(tài)的可以調(diào)用靜態(tài)和非靜態(tài)
靜態(tài)的只能調(diào)用靜態(tài)的
抽象(abstract)
抽象的意義:
描述抽象的概念,規(guī)定必須實(shí)現(xiàn)的方法的統(tǒng)一接口
抽象類:
用abstract關(guān)鍵字來修飾的類
abstract class AbstractClass
{
}
特點(diǎn):
必須被繼承才可使用
不能被直接實(shí)例化
和密封類(sealed類)正好相反
抽象方法:
用abstract來修飾的方法
abstract returnType AbstractMethod ( [paramlist] );
特點(diǎn):
必須被重寫(override)
只有方法頭,沒有方法體.
抽象方法必須在抽象類中.
規(guī)定:
1.抽象類中不一定包含抽象方法.
2.有抽象方法的類必定是抽象類.
3.抽象方法只是聲明,沒有方法的實(shí)現(xiàn).
4.構(gòu)造方法、類方法不能聲明為抽象方法.
5.子類必須實(shí)現(xiàn)抽象方法,除非子類也是抽象類.
6.抽象類中不一定全是抽象方法 可以有一部分具體實(shí)現(xiàn).
密封(sealed) 被sealed修飾的類被稱為密封類
sealed class SealedClass { }
特性:密封類不能被繼承 被sealed修飾的方法被稱為密封方法
sealed override returnType SealedMethod([paramList]) { }
特性: 密封方法會(huì)重寫基類中的方法 密封方法無法被重寫
注意:必須始終與override一起使用
被sealed修飾的屬性被稱為密封屬性
sealed override returnType Property { set? { } get { } }
特性: 密封屬性會(huì)覆蓋基類中的屬性 密封屬性無法被覆蓋
注意:必須始終與override一起使用
const&readonly
const :
定義的是靜態(tài)常量
聲明的同時(shí)賦值
運(yùn)行期間不能改變它的值
屬于編譯時(shí)常量
不能用new初始化
const一般修飾值類型和String
readonly :
是只讀變量
屬于運(yùn)行時(shí)變量
可以在類constructor里改變它的值
不能作用于局部變量
初始化時(shí)機(jī):
1.聲明的同時(shí)賦值
2.靜態(tài)變量的話 在靜態(tài)構(gòu)造中初始化
3.非靜態(tài)變量的話 在非靜態(tài)構(gòu)造中初始化
接口和索引器
什么是接口:
在構(gòu)建類的過程中,經(jīng)常會(huì)遇到一種特殊的情況,在描述某個(gè)類的各個(gè)方法時(shí),
對(duì)每個(gè)方法我們只能給出其功能實(shí)現(xiàn)的要求(原形聲明)但不能給出具體的功能實(shí)現(xiàn)(函數(shù)定義體)。
因?yàn)槲覀兯幚淼膯栴}只是一個(gè)泛泛的功能說明,并沒有針對(duì)某一具體類型的問題來說明。
例:
動(dòng)物吃:什么動(dòng)物吃?怎么吃?吃什么?只是個(gè)概念而已
動(dòng)物睡覺:站?躺?坐?睜眼?閉眼?只是個(gè)概念而已
接口:
一組只有成員方法聲明沒有方法體的方法集。
接口中可寫的內(nèi)容:
方法、屬性、索引器、事件
接口的作用:
提供了完全的抽象
規(guī)定類應(yīng)具有的形式
接口中的方法在多個(gè)實(shí)現(xiàn)接口的類中表現(xiàn)出多態(tài)性
便于設(shè)計(jì)、管理、協(xié)作項(xiàng)目
接口的定義:
要點(diǎn):類似于類的定義格式,只是以 interface作為定義符。
格式:
[訪問修飾符] interface 接口名
{
? ? 返回值類型 方法名([參數(shù)列表]);(只有聲明而無方法體)
}
或:
// 多繼承模式:
[訪問修飾符] interface 派生的接口名 : 父接口名列表
{
? ? 返回值類型 方法名([參數(shù)列表]);(只有聲明而無方法體)
}
注意事項(xiàng):
接口中聲明的方法都是默認(rèn)public的 不能自定義訪問級(jí)別
示例:
public interface Dispaly
{
? void ViewImage();
}
//實(shí)現(xiàn)接口
語法:
// 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
class 類名 : 接口1,接口2,接口3,......(,分割)
{
???? // 所有接口定義方法的實(shí)現(xiàn)
}
// 一個(gè)接口可以被多個(gè)類實(shí)現(xiàn):
class 類1 : 接口1
{
?? // 接口定義方法的實(shí)現(xiàn)
}
class 類2 : 接口1
{
? // 接口定義方法的實(shí)現(xiàn)
}
class 類3 : 接口1
{
// 接口定義方法的實(shí)現(xiàn)
}
class 類4 : 接口1
{
? // 接口定義方法的實(shí)現(xiàn)
}
虛函數(shù):由Virtual修飾的函數(shù).
實(shí)現(xiàn)原則:
實(shí)現(xiàn)的方法必須與接口中的原型定義保持一致
必須實(shí)現(xiàn)接口中的所有成員方法
實(shí)現(xiàn)方式:隱式實(shí)現(xiàn)、顯式實(shí)現(xiàn)
隱式實(shí)現(xiàn):
interface Animal
{
? void Eat();
}
class Cat : Animal
{
? ? // 隱式實(shí)現(xiàn)在類中無法辨識(shí)該方法是那個(gè)接口的
? ? public void Eat()
? ? {
? ? }
}
顯式實(shí)現(xiàn):
interface Animal
{
void Sleep();
}
class Dog : Animal
{
// 顯式實(shí)現(xiàn)在類中明確方法是那個(gè)接口的,所有方法都是私有的
void Animal.Eat()
{
}
}
顯式\隱式的選擇:
若實(shí)現(xiàn)的所有方法均無重名,使用隱式
若實(shí)現(xiàn)的所有方法中出現(xiàn)重名,使用顯式
接口中的方法在實(shí)現(xiàn)類中呈現(xiàn)多態(tài)性:
接口回調(diào):接口引用=實(shí)現(xiàn)類對(duì)象
含義:
接口也是引用數(shù)據(jù)類型,可以指向任意實(shí)現(xiàn)了該接口的類實(shí)例
作用:
統(tǒng)一管理實(shí)現(xiàn)類對(duì)象
訪問顯式實(shí)現(xiàn)的方法
注意:
顯式實(shí)現(xiàn)的方法只能用接口回調(diào)來調(diào)用到
無法用實(shí)現(xiàn)類引用調(diào)用到
示例:
public interface IHello
{
void Bellow();
}
// 顯式接口實(shí)現(xiàn)
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();// 不安全
? ? ? //原因:有可能出現(xiàn)空指針異常
IHello ih = speak as IHello;
if (ih != null)
{
ih.Bellow();//安全
}
}
}
抽象類和接口的區(qū)別:
1.接口用interface來定義,而不是class
2.接口不能創(chuàng)建實(shí)例,抽象類可以間接實(shí)例化(通過子類)
3.抽象的程度:接口完全抽象 抽象類部分抽象
4.接口采用多重繼承機(jī)制,類采用單一的繼承機(jī)制
索引器:
[訪問修飾符] 返回值類型 this[任意數(shù)據(jù)類型 index]{set{} get{}}
實(shí)質(zhì):方法的變異品種
作用:訪問方法從對(duì)象.方法名(參數(shù))=>對(duì)象[參數(shù)]
自定義索引器 VS 數(shù)組索引器:
(1)索引器的索引值(Index)類型不受限制
(2)索引器允許重載
(3)索引器不是一個(gè)變量
索引器 VS 屬性
(1)屬性以名稱來標(biāo)識(shí),索引器以函數(shù)形式標(biāo)識(shí)
(2)索引器可以被重載,屬性不可以
(3)索引器不能聲明為static,屬性可以
要聲明類或結(jié)構(gòu)上的索引器,請(qǐng)使用 this 關(guān)鍵字:
// Indexer declaration
// 最少有一個(gè)參數(shù)
public 數(shù)據(jù)類型 this[形參1,形參2......]
{
? // get and set accessors
get
{
}
set
{
// 使用隱參value接收實(shí)際參數(shù)
}
}
接口中聲明索引器的方法:
數(shù)據(jù)類型 this [【參數(shù)列表】最少有一個(gè)參數(shù)]{set;get;}