抓住“对象”迅速编出代码

技术与开发

学习内容:面向对象  学习进度:第十课  上手难度:★★★★★  考试类型:二级Delphi

类和对象是紧密联系在一起的,前面两期我们介绍了类的定义及其特性,本期我们来学习如何使用以及用好对象。

1.什么是对象

对象是类的实例,换句话说,是由类定义的数据类型的变量。当程序运行时,对象为它们的内部表达占用一些内存。对象都具有自己的数据值,而数据的结构则由类统一定义。同一个类的所有对象都可以按类的数据结构取得不同的具体的数据值,它们共享类的方法,可以调用类的方法对数据进行操作。

2.对象该怎么用

当类声明完成后,要具体应用,也就是生成对象,需要按下列步骤进行操作:

第一步,声明对象。一个对象在使用前,需要声明,也就是声明一个类的变量,可以将类作为一种数据类型来看待。

第二步,创建对象。调用类的构造函数进行一些初始化工作,比如按照类的结构来分配内存资源,完成对象的创建。

第三步,使用对象。类的实例,也就是对对象进行操作、使用,可以修改对象的属性或者调用对象的方法。

第四步,释放对象。使用完毕对象后需要释放对象,调用类的析构函数,删除创建的对象,同时释放相应的内存资源等。

3.如何用好对象

第一,考生需要了解在代码编辑器中的哪个位置来声明对象。一般是在关键字var的后面声明对象,比如:

var

Form1: TForm1;//声明一个TForm1类的对象Form1

benben1:TBenben; //声明一个TBenben类的对象benben1

第二,考生需要掌握什么是实例化。通过调用类构造器来创建类的实例——对象,这就是类的实例化。在Object Pascal中通过调用类的一个构造器来建立一个类的实例,构造器主要用来为类创建实例并为对象中的域分配内存进行初始化使得对象处在可以使用的状态。

注意当一个对象用构造器创建时,编译器将对对象的每一个域进行初始化,所有数字被赋值为0,所有指针为nil,所有字符串为空。比如:

constructor TBenben.Create(AOwner: TComponent); //定义构造函数在关键字implementation 的后面

begin

inherited Create(Owner); //先Create

self.Width:=185; //设置对象的宽度为185

self.Height:= 90; //设置对象的高度为90

end;

在窗体上添加按钮button1,双击此按钮,写入下面的代码。使用Create创建对象的时候,其参数有owner,self,nil等,其具体含义见下例:

procedure TForm1.Button1Click(Sender: TObject);

begin

//benben1:=TBenben.Create(owner);//跟self差不多的

//benben1:=TBenben.Create(self);//属于一个容器,不用自己释放,

benben1:=TBenben.Create(nil);//自己释放(不属于任何容器)

benben1.Parent:= Form1;//要使我们创建的Memo组件在窗体上显示出来,必须指定benben1的父类是TForm1

end;

第三,释放对象有4种方式,分别是free方法、destroy方法、freeAndNil方法、release方法。对象本身不存在的情况下可以使用free方法来释放对象,在free中有判断对象是否存在的操作。对象肯定存在的情况下才可以使用destroy方法来释放对象,因为destroy要根据对象中的头4个字节找到虚拟方法表Vmt的入口地址,从而找到destroy的入口地址,所以此时对象一定要存在。因此用free方法来释放对象要比用destroy方法安全。

需要把对象销毁并把对象的指针设为nil时,可以使用freeAndNil方法。销毁窗口时可以使用release方法,在窗口中处理事件需要一定时间,用这个方法能确保窗口事件处理完之后才销毁窗口。如Form1.Release。

小提示:在使用对象之前,必须先建立一个对象,并且在使用结束后及时销毁对象,以释放资源;两个对象引用赋值时,要确保出现的无名对象(指没有被引用的对象)能被释放;当创建一个组件时,建议设置一个宿主组件(即使用AOwner参数,通常是窗体),由AOwner来管理对象的销毁,那么就不必惦记着销毁该组件了。

读者反馈

读者 李海:类的方法是在一个对象里执行特定操作的过程或函数,那么它与普通过程和函数有没有区别?

小新解答:是有区别的。方法与普通过程和函数唯一不同的是:方法的操作范围只能是对象内部的数据或对象可以访问的数据。因此,在使用方法时必须指定该方法的对象名。例如设置Edit1输入框为当前焦点:Edit1.SetFocus;//获得焦点,这个方法指定的对象为Edit1。

下期开始我们将用模拟题来讲解知识点,敬请关注