虛擬內存總體劃分為五大區域:棧區(堆棧),堆區(托管堆),常量,靜態(靜態初始化,靜態未初始化),代碼區
* 棧區:有計算機虛擬內存自動進行釋放管理,棧區的存儲方式為先進后出。用于分配值類型。棧由操作系統進行管理,不受GC(垃圾回收機制)管理。當值類型不在作用域,? ?其所在的內存空間自動釋放,棧的執行效率最高。
堆區:用于分配小對象實例(85000),所謂小對象就是小于85000字節的實力對象。? GC堆分三代垃圾管理進行管理,當操作時(垃圾回收的時候),垃圾收集器會對GC堆進行壓縮回收。原理有點類似于ios中的autorelease(自動釋放池)
?大對象堆(large object heap):大對象就是指大小超過85000個字節的實力對象,大部分分配在LOH上,不受GC管理,不會被壓縮,只有在完全GC回收時才會被回收
ps:棧的分配是高位-->低位進行擴展
? ? ? ?堆的分配是低位-->高位進行擴展
值類型參數與引用參數的本質,值參數是對棧中數據進行拷貝,拷貝出來的數據相當于之前數據的副本,引用類型是對棧中數據地址的引用,當值參數為某對象引用時,可以改變該對象的某些值,但是不能將值變成新對象的地址
面向對象之封裝
封裝特性:
為什么要封裝?
?屬性存在的目的:其實就是巍峨保護類的內部結構不被破壞,達到封裝性。
?屬性的語法格式:
?訪問修飾符public(必須) +對應字段的數據類型+字段名稱(首字母必須大寫 )
?{
?}
?屬性本身就是一種特殊的方法,他沒有返回值,是因為屬性內部提供了可以訪問該屬性的
?ref參數:將值類型引用改變為地址引用
?值類型作為參數傳遞的時候,傳遞的不是本身,而是副本,如果要修改本身的值就需要修改為引用傳遞
?string 雖然本身是引用類型,但是作為參數傳遞的時候默認是值傳遞,而不是引用傳遞。?如果想改變原來的字符串,這個時候就要將值類型改為引用傳遞,加上ref關鍵字。?如果你不想改變原來的字符串,就直接傳遞字符串
? object本身就是引用類型,它和字符串不一樣,它默認就是引用傳遞,也就是傳遞的是地址。
?數組作為參數傳遞時也是引用傳遞.
out參數:輸出到的意思,其實就是保存一個數值在其中
面向對象之繼承
繼承:
繼承使用條件:當你設計類的時候,發現有字段重復。
具有相同特征不同行為的可以抽取出來,單獨稱為一個類,這個類供派生類使用。
簡稱:基類。
在現實生活中繼承的關系有很多
?1.兒子繼承父親
?2.黃燜雞米飯
3....
在程序中使用關鍵符號:表示繼承
格式:(:+類)
?這個類是要繼承的類
繼承關系中的特點:
?1.子類可以繼承父類中的公有字段
?2.子類可以繼承父類中的公有屬性
?3.子類可以繼承父類中的公有函數
?4.父類不能擁有子類的字段/方法/屬性/索引器
?5.在C#中不支持多重繼承,也就是一個類只能繼承一個類,如果你向支持多繼承,那么請使用interface
?繼承關系中的構造函數
?1.在繼承關系中首先會調用父類的構造函數,然后再調用子類的構造函數
?2.在繼承關系中,子類初始化對象時,先調用父類的構造函數,然后再看子類構造函數有沒有顯式(:base()關鍵字)通知編譯器指定調用父類的哪個構造函數,如果沒有,那么默認去調用父類的無參數構造函數.此時如果父類重寫了帶有參數的構造函數,程序編譯不通過,那么解決的辦法就是給父類添加無參數構造函數或者在子類構造函數中聲明指定調用的哪個父類的構造函數
public class Boss
{
public string name;
public string jineng;
public Boss ()
{
Console.WriteLine ("父類構造方法被調用");
}
public Boss(string name,string jineng){
this.name = name;
Console.WriteLine (name);
Console.WriteLine ("父類構造方法被調用2");
}
}
class Boss_x:Boss
{
public Boss_x(string name,string jineng):base(name,jineng)//將參數傳遞給指定父類構造方法
{
Console.WriteLine ("子類構造方法被調用");
}
public Boss_x()
{
}
public static void Main()
{
Boss_x b = new Boss_x ();//當執行這段代碼時,調用父類無參數的構造方法
Boss_x b1 = new Boss_x("das","a");//當這段代碼執行時,調用父類有參數的構造方法
}
}