思考!
在类中定义一个字段并给它赋值,
int a=1;
在这个类的构造函数值重新给它赋值
a =9;
那么最后这个a的值是什么呢?
这就涉及到构造函数的执行顺序了
要记住!!
创建类的实例时,构造函数的4个执行步骤
第一步:进入构造函数
第二步:如果有参数,就(给有参构造函数)传参,如果没有就不传
第三步:执行构造函数的初始化列表!!!给这个类中所有的成员开辟内存空间,给这个类中的所有字段赋初值,这时发生a=1,如果只是在类中定义 int a;而没有给a初始化,则编译器默认将 【 值类型=0,引用类型=null 】。至此,这个实例才真实存在了,这个类才真正有了意义,在此之前,没有这个类的实体。
要记住!!类永远都只是一张图纸,不创建实例,这个类就不存在。
在创建完实例对象,实例对象出生之后,我们才可以通过实例拿到这个类里面的所有 公有、非静态的成员。
第四步:进入构造函数的函数体。这时候就可以对这个类的字段或属性赋值,或者调用类中的方法。
重点!!!
构造函数的值会覆盖字段初始化后的值
`
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace myprogrom
{
class Program
{
int b=1;
public Program()
{
b = 9;
}
//构造函数的值会覆盖字段初始化后的值
//构造函数的值会覆盖字段初始化后的值
//构造函数的值会覆盖字段初始化后的值
static void Main(string[] args)
{
Program p1 = new Program();
Console.WriteLine(p1.b); // 输出 9
Console.WriteLine(Myprogram.a); //输出 2 //静态字段
Console.WriteLine(new Myprogram().aa); //输出 3 //可以直接用无名Myprogram的实例去访问这个类中的公有字段
}
}
class Myprogram
{
static public int a = 1;
public int aa=1;
static Myprogram()
{
a = 2; // !!静态构造函数只能操作 静态的字段、属性、方法
}
public Myprogram()
{
aa = 3;
}
}
}
`