Chinar 堅持將簡單的生活方式,帶給世人! (擁有更好的閱讀體驗 —— 高分辨率用戶請根據需求調整網頁縮放比例) |
助力快速理解 構造函數的用法、詳解 為新手節省寶貴的時間,避免采坑! |
1
Constructor —— 構造函數
Constructor 構造函數,基本用法是在類對象聲明的時候完成初始化工作
我們以 C# 為例:來簡單了解一下構造函數的聲明方式
class Chinar
{
private int a = 1;
private int b = 1;
private string c = "Chinar";
private object d = 666;
//構造函數用來完成 —— 初始化工作
public Chinar() //聲明一個名稱與類名一樣的函數,就是構造函數(可以傳你所需要的參數,寫你所需的方法)
{
//每個類,本身默認有一個。如果我們不寫明這個 public Chinar()函數,系統僅調用系統默認的。
//自定義構造 public Chinar()函數后,系統只會調用自定義的 Chinar()
}
//這是一個多參數的構造函數
public Chinar(int a, int b, string c, object d)
{
}
}
2
Fu —— 測試類:Fu
如何用構造函數完成初始化工作
用下面兩個例子完全說明
類:Fu 中有多個構造函數,在聲明類對象時,如果調用構造函數,會對其內部私有變量進行初始化操作
/// <summary>
/// 測試構造函數——需要被構造類 Fu
/// </summary>
class Fu
{
private int x;//一個簡單的私有字段
/// <summary>
/// 構造函數
/// </summary>
public Fu()
{
Console.WriteLine("會先調用這里:這是父類");
}
/// <summary>
/// 父類中的有參構造方法
/// </summary>
/// <param name="x"></param>
public Fu(int x)
{
this.x = x;
Console.WriteLine("x賦值完成");
}
/// <summary>
/// 父類構造C函數
/// </summary>
/// <param name="x"></param>
/// <param name="b"></param>
/// <param name="c"></param>
public Fu(int x, int b, string c)
{
this.x = x;
Console.WriteLine("x賦值完成" + x + b + c);
}
/// <summary>
/// 具有7個參數的構造函數
/// </summary>
/// <param name="a"></param>
/// <param name="a1"></param>
/// <param name="a2"></param>
/// <param name="a3"></param>
/// <param name="a4"></param>
/// <param name="a6"></param>
/// <param name="a5"></param>
public Fu(int a, int a1, int a2, int a3, int a4, int a6, int a5)
{
Console.WriteLine("最長參數構造運行");
Console.WriteLine(a + "|" + a1 + "|" + a2 + "|" + a3 + "|" + a4 + "|" + a5 + "|" + a6 + "|"); //在函數中讓傳入參數對Fu類對象進行初始化
//例如有如下多個私有字段,在類對象初始化的時候,對其變量初始化。用構造函數最為簡單
this.a = a; //傳入參數,在對象實例化后,對其私有變量進行賦值操作
this.a1 = a;
this.a2 = a;
this.a3 = a;
this.a4 = a;
this.a5 = a;
this.a6 = a;
}
private int a;
private int a1;
private int a2;
private int a3;
private int a4;
private int a5;
private int a6;
}
3
Derived —— 派生類繼承自:Fu
書寫這個派生類,是為了讓新手明白在復雜情況下 base 的具體作用及用法
類: Derived 繼承 Fu 類
base :具體作用
當我們沒有在子類構造函數中 寫上 base(),默認會先調用父類中無參的構造函數,再調用子類
當在有參構造函數后寫上base時,只調用子類構造函數中有參的構造函數,隱藏父類無參構造函數
/// <summary>
/// 派生類繼承父類
/// </summary>
class Derived : Fu
{
/// <summary>
/// 會先調用父類的構造函數,然后再調用子類這邊的有參構造函數
/// </summary>
public Derived() //: base() //重新構造 :調用父類中無參的構造函數
{
Console.WriteLine("這是派生類-無參-構造函數");
}
private int y;
/// <summary>
/// 構造函數
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// 當我們沒有在子類構造函數中 寫上 base(),默認會先調用父類中無參的構造函數
/// 當在有參構造函數后寫上base時,只調用子類構造函數中有參的構造函數,隱藏父類無參構造函數
public Derived(int x, int y) /*: base(x)*/
{
this.y = y;
Console.WriteLine("這是y賦值完成");
}
/// <summary>
/// 多參數
/// </summary>
/// <param name="x"></param>
/// <param name="a"></param>
public Derived(int x, string a) : base(x, x, x, x, x, x, x) //這里寫了 base 會先調用父類,再調用當前子類進行構造
{
y = x;
Console.WriteLine(a + "第三方法");
}
4
Initialize Constructor —— 初始化,調用構造
實例化類對象,並調用不同構造函數,去構造初始化對象
系統會根據參數的不同,進行不同的構造函數,從而達到初始化效果
/// <summary>
/// 程序
/// </summary>
class Program
{
/// <summary>
/// 主入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Derived d = new Derived();
Console.WriteLine("-----------------------以上為無參構造------------------------------------------");
Derived d1 = new Derived(1, 2);
Console.WriteLine("-----------------------以上為2個參數構造---------------------------------------");
Derived d2 = new Derived(1, "1");
Console.WriteLine("-----------------------以上為2個參數構造,6個私變量----------------------------");
//先調用有參的構造函數一旦被調用,無參的構造函數都不會被調用了
//先執行父類的構造函數,才執行子類的
Console.ReadLine();
}
}
輸出結果:
會先調用這里:這是父類
這是派生類-無參-構造函數
-----------------------以上為無參構造------------------------------------------
會先調用這里:這是父類
這是y賦值完成
-----------------------以上為2個參數構造---------------------------------------
最長參數構造運行
1|1|1|1|1|1|1|
1第三方法
-----------------------以上為2個參數構造,6個私變量----------------------------
支持
May Be —— 搞開發,總有一天要做的事!
Chinar 提供一站式教程,閉眼式創建! 為新手節省寶貴時間,避免采坑! |
先點擊領取 —— 阿里全產品優惠券 (享受最低優惠)
1 —— 雲服務器超全購買流程 (新手必備!)
2 —— 阿里ECS雲服務器自定義配置 - 購買教程(新手必備!)
3—— Windows 服務器配置、運行、建站一條龍 !
4 —— Linux 服務器配置、運行、建站一條龍 !

技術交流群:806091680 ! Chinar 歡迎你的加入
本博客為非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究
對於需要復制、轉載、鏈接和傳播博客文章或內容的,請及時和本博主進行聯系,留言,Email: ichinar@icloud.com
對於經本博主明確授權和許可使用文章及內容的,使用時請注明文章或內容出處並注明網址