假设有如下类声明:
try
TMyObj = class
public
procedure SayHello;
end;
SayHello实现如下:
procedure TMyObj.SayHello;
begin
end;
下面的代码会不会引发错误,请说明原因:
var
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
MyObj.Free;
MyObj.SayHello;
end;
try
TMyObj = class
public
procedure SayHello;
end;
SayHello实现如下:
procedure TMyObj.SayHello;
begin
end;
下面的代码会不会引发错误,请说明原因:
var
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
MyObj.Free;
MyObj.SayHello;
end;
解决方案 »
- UDP传输问题
- Teechart和fastreport安装问题
- 菜鸟提问:如何单击dbgrid中的一行后返回一个参数给sql语句,并将搜索结果返回给edit?
- 求一SQL语句 存在就修改,不存在就写入
- 如何设置,使得程序窗口随显示器不同而自动变化
- 谁会写生成收藏夹菜单的代码?
- 关于线程与主程序之前怎样传送数据对象
- 各位高手过来,给分了.....200分问一个问题!!!
- 如何判断image字段类型是不是为空
- 难道没有人会?关于session.AddStandardAlias('bc',getcurrentdir,'paradox')??????
- 求助使Tchart的Y轴显示2个不同的区间
- 一篇博文,敬请关注一次
静态方法在编译期已经能计算出内存地址,直接call 地址就OK了。
TMyObj = class
public
procedure SayHello;
end;procedure TMyObj.SayHello;
begin
showmessage('ok');
end;procedure TForm1.Button1Click(Sender: TObject);
var
MyObj: TMyObj;
begin
MyObj.SayHello;
end;测试环境D7+xp3是不会报错,很难理解
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyObj = class
public
aa :string;
procedure SayHello;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
MyObj.Free;
myobj.aa := '11111111';
MyObj.SayHello; end;{ TMyObj }procedure TMyObj.SayHello;
begin
showmessage(aa);
end;end.
把代码 改成这样就会能看出来了。free 比没有对对象的实例 进行赋值为空的freeandnil(MyObj);
MyObj.SayHello编译后被翻译成TMyObj.SayHello,和实例是否被创建是没有任何关系的。
SayHello又不是Virtual方法,又不占用实例空间,不创建实例访问很正常。
OO的本质实现是让每个类实例独享数据域,而共享其方法区。
方法区分静态方法(Delphi默认)与虚方法。
静态方法通过call 进程相对地址的形式来调用。
虚方法是放在一个VMT表中,访问虚方法需要查表!
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
MyObj.Free;
MyObj.SayHello;
end;
我发现真接调用类中的方法也不会出错,如果你要使用静态方法那就不要创建实例
如果创建、后又放掉那内存就是空的了,当然会错
var
MyObj: TMyObj;
begin
MyObj.SayHello;
end;
MyObj: TMyObj;
begin
MyObj.SayHello;
end;
只要SayHello中没有引用类的成员,就不会报错
实例只要定义,不需创建,其实就类似于类方法(class method)