C#类的构造方法this方法重载析构方法Word格式.docx
《C#类的构造方法this方法重载析构方法Word格式.docx》由会员分享,可在线阅读,更多相关《C#类的构造方法this方法重载析构方法Word格式.docx(14页珍藏版)》请在冰点文库上搜索。
![C#类的构造方法this方法重载析构方法Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/4986286a-69fc-41a3-8516-da8f454d14f0/4986286a-69fc-41a3-8516-da8f454d14f01.gif)
_M
/*观察字段成员如果不赋初值时,在创建对象的时候,ITPUB个人空间O.a__^_m_g
u"
B"
p
*编译器会按照类型默认的给变量一个初值,如年龄、姓名ITPUB个人空间_M_a_^_w'
Q
*我们可以在构造方法中,对未赋值的字段进行改变,如年龄ITPUB个人空间6S_m_f_f4a_V5d
*如果字段已经赋初值了,那么创建对象的时候,
_f#XG9s_n4S0
*就会使用初值,如果需要改变,就在构造方法中重新赋值即可,如性别*/
//定义一个年龄变量,不赋初值ITPUB个人空间_L0Q_E4d_e_u_M'
t$Q
intage;
ITPUB个人空间p"
Q9D_Q_{0f_B_?
//定义一个姓名变量,不赋初值ITPUB个人空间~"
t_n_?
_xJ9{_\0B'
n
stringname;
ITPUB个人空间mP_X9v_Oh%p
//定义一个性别变量,赋初值为男
^_M_t_o.u0
stringSex="
男"
;
//定义一个方法,读取类中字段成员,值的变化。
ITPUB个人空间9L_M-M_p@&
t_O7@['
u#`
voidSay()
'
[lU_F_i#f_Qd0
{
0N_f`2V_|)a_H0
Console.WriteLine("
我的年龄:
{0},我的名字:
{1},我的性别:
{2}"
age,name,Sex);
ITPUB个人空间_z.g0\e_O_L_}_C_v
}
2PE_c_d&
a;
Z1D-X1~0
/*1.以下方法都为Ren这个类的构造方法,他们因为参数不同,形成了方法的重载,
_?
dH_c_\_C7t_m0
*2.this关键字:
this关键字用来引用对象本身,已经是说,this.name指的是对象中的name字段,ITPUB个人空间a2J([2^_[_ws
*
而=name的这个name指的是方法中离它定义最近的name,这里值的是构造方法中传入的name参数
"
U_w"
x_^]
x.O0
*this关键字在例子结束后,还会具体的讲解。
*/
_Z;
L7u0~'
n6D_P+B_`0
ITPUB个人空间,o6r_K8g_u,X,r.C(|
//在无参的构造方法中,给性别重新赋值,年龄和姓名按照创建对象时默认的赋初值
$C_}&
^_Q#m#B_}:
F_q_R0
publicRen()
5M5Ny*t-i2C_H0
{ITPUB个人空间_@&
~0B_f_O8|9m_{
//改变性别的值ITPUB个人空间-jD%g_p*M_E
Sex="
女"
ITPUB个人空间6O_^9i#M_n,@1x9@
我刚出生!
还没有名字,年龄也从0岁开始!
);
ITPUB个人空间5k#_#w_z)D/S_T#p_j
//此时读取对象中的字段值的变化,应该性别改变,年龄和姓名都为默认值
8X]_I.S_f_]+g_x0
Say();
_y.P_M_D)D_~0
}ITPUB个人空间_T_yTFD)g(E_s7L
ITPUB个人空间_h_q3H#C_\3f
//创建一个带姓名参数的构造方法,将创建对象时传入的name参数赋给对象中的字段name值,这样say方法中的姓名也有了改变ITPUB个人空间6{_R*E_]_
//同时在这个构造方法中,给age字段自定义赋值。
ITPUB个人空间/H_O9P(e*|,T2}*}
publicRen(stringname)ITPUB个人空间/J8JO)J7\_|:
h1g_z_H
?
_R4Z_e_~;
D.fP7r0
this.name=name;
ITPUB个人空间+I3D"
K*v_G_@l_[0`
呦!
我使用双截棍,我有名字了!
,但是年龄呢?
我自己定,我就27岁了。
_p_A_F'
B_R3P'
G0
age=27;
AS1xu"
n_a_K0
5Z!
o_o!
s_f[&
n0
//创建一个带姓名参数、姓名的构造方法,将创建对象时传入的name参数赋给对象中的字段name值,ITPUB个人空间_fT(S_h%n$T_Y5m8@$[
//将创建对象时传入的age参数的值赋给对象中的字段age,这样say方法中的姓名、年邻都有了改变
q4A_~_?
_H!
w(z0
_](V"
m_]1uW6H_u0
publicRen(intage,stringname)ITPUB个人空间_~_x-T_\;
ek_H
{ITPUB个人空间8E_g;
A_l
W_t_R
this.age=age;
_~_Q_r_g_]5g_X_m-Xg0
this.name=name;
ITPUB个人空间9d7|_}_x_m_F@W4N_H
哦!
你给我起名字,告诉我多大了吧!
你说的算!
|_G)Q_m'
|0
ITPUB个人空间_c_tqi:
y-P$n_i
//定义静态的构造函数,我把她放在在最后,但是会第一个被调用。
ITPUB个人空间_l2O+G$~_C3@V
staticRen()
_r"
h/~8q)E9v$\#b%u0
o_L2x0F_U0
我是静态的构造函数,不能有参数及访问修饰符,并且创建对象时,我只执行一次,最先调用"
ITPUB个人空间_H9j2d_ZV_}
Console.WriteLine();
ITPUB个人空间
n_|H#Ix7u_{
_F'
b$@+YN;
}%x_Z_o!
5N0
ITPUB个人空间UFFw_j1D
_@_n_{!
x&
_Y"
~0
classProgramITPUB个人空间_S_k%e_R_}!
]_i+T_W1_4d
{ITPUB个人空间_X_B_k^*`_aj)G*B_S
staticvoidMain(string[]args)ITPUB个人空间6a_v,o7`_O2d_?
{ITPUB个人空间_K_}:
5K.{2F_W
//创建无参的对象boby,并且创建时会先调用静态的构造方法,再调用无参的构造方法
_m8}%L_T_b0
Renboby=newRen();
_c$p_yFC_v0
//创建有姓名参数的对象songer歌手
%RV_m_X_U5Ag0
Rensonger=newRen("
周杰伦"
ITPUB个人空间;
j6D!
}_|_U+C2`+_
//创建有年龄、姓名参数的对象manITPUB个人空间(V%]9t&
F_|*a+|5hY$n_Y
Renman=newRen(33,"
贝克汉姆"
Z#l_?
_m4P(A6R0
_r-b_dg{0b0
2@%x(g_p/G0}ITPUB个人空间_M_RX,D(w
运行结果:
我是静态的构造函数,不能有参数及访问修饰符,并且创建对象时,我只执行一次,最先调用
ITPUB个人空间_@_C_e_g)v.z
0,我的名字:
,我的性别:
女
ITPUB个人空间6Ybk_s_@!
\_`
27,我的名字:
周杰伦,我的性别:
男
ITPUB个人空间/rf$w_r[l_G:
i
33,我的名字:
贝克汉姆,我的性别:
通过上面的实例和注释,对照运行结果,同学们要熟练的运用和理解,因为我们现在还没有学习到继承,其实在一个类创建成对象的时候,创建时,编译器会先看这个类是否有父类,如果有父类,再继续找是否有父类的父类,我习惯叫爷爷类,如果有爷爷类,再看有没有太爷爷类,如果没有太爷爷类,就会先执行爷爷类的构造方法,再执行爸爸类的构造方法,最后才执行自己的构造方法,当然所有的构造方法的继承都是指实例构造函数,静态的构造函数是无法被继承的。
下面的实例就是一个构造方法的继承顺序,现在看不懂没有关系,只是想让大家了解创建对象的工作过程,这里提前讲一个知识点就是继承的语法如A是父类,B是子类,那么在定义B类的时候,语法是这样写的ClassB:
A,用“:
”来表明继承关系,在java中是用“extends”关键字,现在看看代码,理解一下结果:
构造方法在继承中的顺序
_A1k;
]a_{&
G_M0classClass1
可以看出,类在继承时,构造函数在实例化的过程中,是会被再次调用的。
ITPUB个人空间a"
A1K_`_y"
t
{ITPUB个人空间%H_]c2o2C_K'
d
staticvoidMain()ITPUB个人空间5}/y_z_E_^2f_d_B_K
(q-s8O5s_A_?
/g(e0
**********"
p!
v!
Tge;
}_|0
Aa=newA();
_x%s_o_q_t
ITPUB个人空间2E_q_QS_]^F8\_o`
Bb=newB();
{2s_n2M_[)t-x0
*****AC:
A*****"
ITPUB个人空间$T$n_I\_W!
Y(S)y_s
ACac=newAC();
_G#L__
F_H_M+j0
*****BC:
B*****"
ITPUB个人空间K3K9`P_^+E{@_s
BCbc=newBC();
A_T_n_F_W4s6\_m0
*****CC:
AC*****"
_R_h_a_|_]4D0
CCcc=newCC();
ITPUB个人空间_h|$a_?
1V_?
/d
*****CCC:
BC*****"
dg_r(`:
S(y;
CCCccc=newCCC();
_A_^_c/p)d8i;
iL!
V0
}ITPUB个人空间_B+n_s
F*@:
i/Y9S$M_v
}ITPUB个人空间_I_A_w)b_c_u_g_c_r/p
classAITPUB个人空间_P_f2@(V,GX
*l_b_J,nZ4R8T0
publicA()ITPUB个人空间_G0[#x:
m_K+M_qA%{
$G-B;
S3Z_l$K$o_k0
CallmethodA()"
~
u:
Z(^'
f_PU-B0
6J2h*B)N_P0
_X)?
-n9~_T,D_b;
o_q0
classBITPUB个人空间a_D&
|;
_6P
9p_Q_V+|~_B_]_y0
publicB()
R_L_~'
j%|0
{ITPUB个人空间.]|5q4j_L_E
CallmethodB()"
ITPUB个人空间_V_d_Pg2[4S0W_`/K9I
_j_^,u_U3V0
}ITPUB个人空间0L2{1`4d_L_L;
}5Z_B6g
classAC:
AITPUB个人空间ox2n`DXi9f_[6C
{ITPUB个人空间2Zo_~&
]J
publicAC()
9N.O}_l;
E_}0
_c&
[;
i[6p8o8|0
CallmethodAC()"
ITPUB个人空间+g/u_G_k_C_E_`@
I_~3i_P_e_G:
a'
M]0
}ITPUB个人空间_Nes+b8m2F_pq
classBC:
B
_uvSM_H1s0
{ITPUB个人空间"
d_N8I5r_g_^7__i
publicBC()
G_C_G_k_c_n0
{ITPUB个人空间+T0WJ4~-I_D,V5][U
CallmethodBC()"
ITPUB个人空间3X3s%jwT_T7I:
DG`
:
h1CO_h_V;
I_D_m_A0
y0{_R(q_h'
p_w0
classCC:
AC
_Wy$nm_N0
{ITPUB个人空间/P%e{_w_K:
d3z
publicCC()ITPUB个人空间+Z_|*D5C/B_D'
o
{ITPUB个人空间0B:
t_j7E)B
CallmethodCC()"
b_g9~_f_p_l_Nh7g4I0
_R_R&
[:
a7}_\"
J_D)M!
Q0
q_E#R"
n_BO2L_~_g_d_O0
classCCC:
BCITPUB个人空间_^3b0lC_a_C_`w_@%A
{ITPUB个人空间9e}h%N
N0A|
publicCCC()ITPUB个人空间2K_Kx_P5r(M
{ITPUB个人空间:
VM0__Am_S5P
CallmethodCCC()"
_v3b_O_^0R_`5O_}_u#L_v5D0
结果如下:
**********
)^;
}!
|6I"
X_M0CallmethodA()
3~_^*m_A6q_X_s_l*X0**********ITPUB个人空间/E_|_M_|0h9t
CallmethodB()ITPUB个人空间*q6a_R_E8a
A*****ITPUB个人空间_m_Ok_z4y9P
CallmethodA()
_T_s_p_G_]K0]_E:
h3u0CallmethodAC()
_Mw_q_e_zFW_m0*****BC:
B*****ITPUB个人空间4M_Pbt___a0y#L
CallmethodB()
v_s_c3X_k2u_{0CallmethodBC()
_i4g_A_Z_h_I+[w0*****CC:
AC*****ITPUB个人空间_k_[1gd9[-R_D_t_I
CallmethodA()ITPUB个人空间!
z*u_p_VS#f
CallmethodAC()
}_hi_D_e/q8|0CallmethodCC()ITPUB个人空间'
L_@_h4^h_r
H_cU&
r-?
BC*****ITPUB个人空间_~_x2I$r6pM_W
CallmethodB()ITPUB个人空间@&
i3FE_G_S
CallmethodBC()ITPUB个人空间p_Q,k_C2O_G_d
CallmethodCCC()
K_J/gS&
g:
M'
i_]3a0请按任意键继续...
虽然我没有写注释,但是相信同学们都应该能理解这个过程,构造器的继承我也会在类七中再继续深化讲解。
构造方法的出现使得我们开发人员可设置默认值、限制实例化以及编写更加灵活且便于阅读的代码。
下面我们来说说this关键字,this关键字最大的用途就是用来区分类级别的变量和局部变量,当一个位于方法内部的局部变量与类级别的变量名称相同的时候,因为有效区域不同,因为并不不会发生冲突,但是如此一来,在方法内部所访问的变量,一定是其中所定义的局部变量,而非类级别的同名变量,在这种情况下,我们就使用this关键字,比如第一个实例中,用this代表对象本身,this.name指的是类级别中定义的name字段.使用this虽然可以让我们分辨出不同级别的变量,但是最好还是起不同的名字来区分变量。
接下来我们来学习本节课最后一个知识点,析构方法。
析构方法
R_D_^_^
d4F_y)}-a5O0--------------------------------------------------------------------------------
析构方法也叫销毁方法,也有人称为析构器,类借助构造方法进行对象的初始化,借助析构方法进行对象的终止操作,析构方法也是使用类名相同的名称命名,用“~”修饰,当对象被系统终止并且回收时,析构方法执行,我们可以在析构方法中写方法,它会最后被执行,析构方法的语法书写如:
~ClassName(){},析构函数是不能有参的,并