课程章节介绍
同学们,我们来看一个在Apex编程中经常会遇到,但可能没仔细琢磨过的概念——,变量遮蔽,,也叫影子变量。
你可以这样想:就像在房间里,你关了大灯,只开了一盏台灯,台灯的光就把大灯的光“遮蔽”了。代码里也一样,当你在一个代码块里声明了一个和外部同名的变量,那么在这个内部范围内,你用的就是内部的这个变量,外部的那个暂时被“藏”起来了。
比如在Apex类里,你有个成员变量叫`s`,然后你写了一个方法,方法参数恰好也叫`s`。那在方法的身体里,你直接用`s`,指的是哪个?是参数,不是成员变量。那如果你需要访问被遮住的成员变量怎么办?就用`this.s`来显式地指代对象自己的那个`s`。这一点完全和Java一样,你经常会看到构造方法里写`this.s = s;`,就是这个作用,把参数的值赋给自己的成员。
这种遮蔽不仅发生在方法和局部变量上,在,父子类的继承,中也有。如果父类定义了一个成员变量,子类又定义了一个同名成员变量,那么子类的变量会遮蔽父类的那个。你用子类对象去访问时,默认拿到的是子类的变量。但父类的那个变量还在,只不过被遮住了,需要用特殊方式才能访问到。
同样,,静态变量,也可以被隐藏。假设父类定义了一个静态变量`S`,子类也可以再声明一个同名的静态变量`S`。这时候你在子类代码里直接写`S`,访问的是子类自己的静态变量。如果想用父类的那个,就得带上父类的名字,写成`ParentClass.S`。要记住,静态变量是属于类的,不是属于实例的。所以你不能通过类的实例去引用静态变量,那样会让代码含义不清。要么直接用变量名(在当前类上下文里),要么就用类名作为前缀,比如`MyClass.myStaticVar`。
简单总结一下:变量遮蔽是一个自然的语言作用域规则,帮你写出更清晰、更安全的代码。只要记得,当同名变量出现时,最近的那个优先级最高。要想拿到被遮住的,就得用`this`、`super`或类名来明确指出。这样,在写Apex的时候你就能准确控制你到底在用哪个变量了。
关键词
Apex
Salesforce
Developer Guide