您的位置:首页 > 编程语言 > C#

(教学思路 C#之类四)构造方法(静态构造方法、this、方法重载)、析构方法(修改新增)

2011-11-01 17:03 393 查看
今天这节课我们来学习类的构造方法和析构方法,同学们现在回忆一下在类一系列中,学习到创建一个类ClassName的实例,也就是对象ObjName时基本语法为:ClassName ObjName=new ClassName();我说过,new后面的ClasName()实际上指的是这个类的构造方法,而且我也说过,这个()中可以有参数,这个有参数,就是指构造方法可以有参数,那么什么是类的构造方法呢?

构造方法

构造方法又叫构造函数,也有人叫做构造器,其实就是对类进行初始化。构造方法是一种特殊的方法,在类实例创建之前执行,用来初始化对象,完成对象创建前所需的相关设定,构造方法允许将类实例初始为有效状态的特殊方法,这就是构造方法的定义,用通俗的话说,就是开车前的暖车工作,用洗衣机之前的接上电源的工作,参数可以有多个可以这样理解,洗衣机的插头有两头的、有三项的,在创建洗衣机对象的时候,要分清插头的种类,才能创建成功对象。

为什么说构造方法是特殊的方法呢?因为构造方法本身没有返回值,并且通常是public访问类型,方法的名称必须与类名相同,当我们没有明确的在类中定义构造方法的时候,例如我们以前所定义的类,都是没有定义构造方法的,这时系统会使用默认的构造方法,如创建ClassName类的默认构造方法,public ClassName(){}。默认的构造方法并没有进行任何类初始化行为,你可以自己定义构造方法,当然如果你有自定义构造方法,那么默认的构造方法就会失效了。也就是说,当我们在ClassName类中没有定义构造方法时,C#语言会生成一个空的构造方法ClassName(),当然这个空的方法是什么也没做,只是为了让我们定义的类能够在创建对象时顺利的实例化而已。

构造方法可以有两个,因为参数的不同区别开,这就构成了方法的重载,方法重载的最大的好处在与可以利用相同的名称来组织应用程序的方法成员,当一个复杂的类被创建的时候,对功能相同的方法最好采用相同的命名方式,用不同的参数来区别,比如,计算面积时,我们就可以把四边形面积的计算方法的名字起同一个,用参数来区别如正方形定义一个参数(一个边长),长方形定义三个参数(一个长,一个宽,另一个长方形的标志如0),梯形定义三个参数(一个底,一个高,另一个梯形的标志如1),通过第三个参数标志区别长方形和梯形不同的面积公式。方法的重载要注意的是,方法名相同,但是参数类型或个数必须要有所不同,方法重载的优点就是可以在不改变原方法的基础上,新增功能。

下面我们来看实例,通过实例我们来体会构造方法是如何在创建对象时初始化的。

namespace hello
{
//创建一个人类Ren
class Ren
{
//虽然我把析构方法写在最上面的,但是它是最后执行的方法。
~Ren()
{
Console.WriteLine("灭亡了");
}
/*观察字段成员如果不赋初值时,在创建对象的时候,
* 编译器会按照类型默认的给变量一个初值,如年龄、姓名
* 我们可以在构造方法中,对未赋值的字段进行改变,如年龄
* 如果字段已经赋初值了,那么创建对象的时候,
* 就会使用初值,如果需要改变,就在构造方法中重新赋值即可,如性别*/

//定义一个年龄变量,不赋初值
int age;
//定义一个姓名变量,不赋初值
string name;
//定义一个性别变量,赋初值为男
string Sex = "男";

//定义一个方法,读取类中字段成员,值的变化。
void Say()
{
Console.WriteLine("我的年龄:{0},我的名字:{1},我的性别:{2}", age, name,Sex );
}

/*1.以下方法都为Ren这个类的构造方法,他们因为参数不同,形成了方法的重载,
* 2.this关键字:this关键字用来引用对象本身,已经是说,this.name指的是对象中的name字段,
*   而=name的这个name指的是方法中离它定义最近的name,这里值的是构造方法中传入的name参数
* this关键字在例子结束后,还会具体的讲解。*/

//在无参的构造方法中,给性别重新赋值,年龄和姓名按照创建对象时默认的赋初值
public Ren()
{
//改变性别的值
Sex = "女";
Console.WriteLine("我刚出生!还没有名字,年龄也从0岁开始!");
//此时读取对象中的字段值的变化,应该性别改变,年龄和姓名都为默认值
Say();
}

//创建一个带姓名参数的构造方法,将创建对象时传入的name参数赋给对象中的字段name值,这样say方法中的姓名也有了改变
//同时在这个构造方法中,给age字段自定义赋值。
public Ren( string name )
{
this. name =name ;
Console.WriteLine("呦!我使用双截棍,我有名字了!,但是年龄呢?,我自己定,我就27岁了。");
age = 27;
Say();
}

//创建一个带姓名参数、姓名的构造方法,将创建对象时传入的name参数赋给对象中的字段name值,
//将创建对象时传入的age参数的值赋给对象中的字段age,这样say方法中的姓名、年邻都有了改变

public Ren(int age, string name)
{
this.age = age;
this.name = name;
Console.WriteLine("哦!你给我起名字,告诉我多大了吧!你说的算!");
Say();
}

//定义静态的构造函数,我把她放在在最后,但是会第一个被调用。
static Ren()
{
Console.WriteLine("我是静态的构造函数,不能有参数及访问修饰符,并且创建对象时,我只执行一次,最先调用");
Console.WriteLine();
}

}
class Program
{
static void Main(string[] args)
{
//创建无参的对象boby,并且创建时会先调用静态的构造方法,再调用无参的构造方法
Ren boby = new Ren();
Console.WriteLine();

//创建有姓名参数的对象songer歌手
Ren songer = new Ren("周杰伦");
Console.WriteLine();

//创建有年龄、姓名参数的对象man
Ren man = new Ren(33,"贝克汉姆");
Console.WriteLine();
}

}
}


结果如下:

我是静态的构造函数,不能有参数及访问修饰符,并且创建对象时,我只执行一次,最先调用

我刚出生!还没有名字,年龄也从0岁开始!
我的年龄:0,我的名字:,我的性别:女

呦!我使用双截棍,我有名字了!,但是年龄呢?,我自己定,我就27岁了。
我的年龄:27,我的名字:周杰伦,我的性别:男

哦!你给我起名字,告诉我多大了吧!你说的算!
我的年龄:33,我的名字:贝克汉姆,我的性别:男

灭亡了
灭亡了
灭亡了
请按任意键继续. . .

因为析构方法比较好理解,看这个实例同学们就能明白他的用法,析构函数的继承顺序是按照从派生程度最大到最小的顺序调用的,也就是与构造方法继承顺序相反,先结束子类的析构方法,再结束爸爸类的,再结束爷爷类的,这点也比较好理解,可以把构造方法和析构方法看出一对开始和结束的标记,内部的开始标记最先结束,最外部的开始标记,最后结束。

本节课我们就学到这里,下节课我们来学习类的六大分类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐