群里我师傅给我的答案:
unit Unit4; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type
TForm4 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; /// <summary>
/// 我曾经容易犯的错误理解:
/// Tperson再全局静态内存中 肯定得有个实例 才能 调用 function啊
///
/// 知识点:
/// 类方法是不需要初始化实例的
/// 创建实例的时候
/// 不是的,class function 类似于全局函数,只是挂名在这个类下面
/// class function 是不能访问Self的
/// Self都没有,当然也不能访问成员变量了
/// class 是类的方面,没有实例,就没有self
/// </summary>
TPerson = class
//类常量得写在这里
const hehe1 = 'hehe1';
private
Fname: string;
class var Fname1: string;
procedure Setname(const Value: string);
class procedure Setname1(const Value: string); static;
public
/// <summary>
/// 实例方法
/// </summary>
function sayName(): string; /// <summary>
/// 类方法----class function 类似于全局函数
/// </summary>
class function sayName1(): string; /// <summary>
/// 实例变量
/// </summary>
var cde: string; /// <summary>
/// 类变量-----按理说那就是全局变量了
/// </summary>
class var cde1: string; /// <summary>
/// 实例常量
/// </summary>
const hehe = 'hehe'; /// <summary>
/// 类常量 ------ 全局常量了(但是不能写在这里,要写在上面,写在这里会报错)
/// </summary>
//class const hehe1 = 'hehe1'; /// <summary>
/// 实例属性
/// </summary>
property name: string read Fname write Setname; /// <summary>
/// 类属性
/// </summary>
class property name1: string read Fname1 write Setname1;
end; var
Form4: TForm4; implementation {$R *.dfm} procedure TForm4.Button1Click(Sender: TObject);
begin
//TPerson.cde := 'wokao';这句会报错,因为没有实例 无法访问实例的变量
TPerson.cde1 := 'wokao';
ShowMessage(TPerson.cde1);
ShowMessage(TPerson.hehe);//这句竟然也可以
ShowMessage(TPerson.hehe1);
//ShowMessage(TPerson.name);这句不可以
ShowMessage(TPerson.name1);
end; { TPerson } function TPerson.sayName: string;
begin
//实例方法即可以访问类属性也可以访问正常的属性
name := 'wokao';
name1 := 'wokao1';
end; class function TPerson.sayName1: string;
begin
//类方法只能访问类属性
name1 := 'wokao1';
//这里会报错,因为没有实例,所以不能访问实例的属性.
//name := 'wokao';
end; procedure TPerson.Setname(const Value: string);
begin
Fname := Value;
end; class procedure TPerson.Setname1(const Value: string);
begin
Fname1 := Value;
end; end.