Apex基础之Classes
类
Apex的Class与Java中的用法类似,Class是objects的模板,objects都是Class的实例,Apex中可以定义外部类和内部类,内部类不能嵌套,只能定义一层,如:
public class myOuterClass { // Additional myOuterClass code here class myInnerClass { // myInnerClass code here } }
上面的类定义中,需要注意:
1)外部类必须要指定其访问修饰符(access modifiers)
2)不用指定内部类的访问修饰符,默认访问权限是private
3)内部类中不能有static修饰的变量和方法
Apex类定义的模板如下:
private | public | global [virtual | abstract | with sharing | without sharing] class ClassName [implements InterfaceNameList] [extends ClassName] { // The body of the class }
Apex类的访问修饰符
1)private 指定了private访问权限的类只能在本地使用,只能在声明其定义的代码块中使用,内部类的默认访问权限是private,private只能与内部类的定义一起使用
2)public public的类在本application和namespace上可见
3)global global的类在任何地方都能被使用,被webService修饰符修饰的方法必须被global修饰,如果一个方法或者内部类被global修饰,那么包含其定义的Class必须也要被global修饰
4)with sharing 和without sharing修饰符是可选的,指定类的共享模式
5)virtual 当一个类被virtual修饰,表明其可以被继承和重写,如果一个类没有被virtual修饰,那么其方法就不能被override关键字重写
6)abstract 抽象类关键字,部分方法只提供方法声明,不提供定义,需要继承该类重写抽象方法
类变量
[public | private | protected | global] [final] [static] data_type variable_name [= value]
类方法
[public | private | protected | global] [override] [static] data_type method_name (input parameters) { // The body of the method }
方法参数的传递
对于原始数据类型,作为参数传递给方法时采用值传递的方式,即将实参的值复制并赋值给形参,当时实参形参并不指向相同的内存地址,所以对形参值改变,方法返回时并不能改变实参值;对于非原始数据类型的数据,如collections,采用引用传递,即实参形参引用相同的地址,对形参内存地址中值的改变也会改变实参内存地址中的值,但是如果形参指向了新的内存地址,那么实参对新地址存值的改变不会对实参值产生影响
构造方法
Apex类构造方法需要注意的是,下面两个构造方法属于不同的方法
public class Leads{ // A constructor with two arguments public Leads (String email, Boolean call) {} // Though this constructor has the same arguments as the // one above, they are in a different order, so this is legal public Leads (Boolean call, String email) {} }
类变量和类方法的访问权限
1)private 默认访问权限,只能在本类内部使用
2)protected 在本类的所有内部类中可见,在继承了本类的所有子类中可见,protected修饰符只能用来修饰类变量和类方法
3)public 在本application和namespace中可见,Apex中的public与Java中的不一样,Apex中的public只在当前application中可见,global应该与Java中的public范围相似
4)global 可以被外部应用使用,如果一个方法被global修饰,那么其类也要被global修饰
Initialization Code
Initialization Code是一个代码块,形如:
[static] { //code body }
Initialization Code先于构造函数被执行,静态代码块用来初始化一些静态成员变量,只在类加载是调用一次
Apex属性
Apex属性与C#中的属性用法一样,类似于Apex变量,但是属性可以在数据被赋值和被返回时进行额外的操作,如验证数据,更改其他变量的值,调用方法
Apex属性定义中包含get、set访问器的代码块,只实现了get访问器的属性是只读的,只实现了set访问器的属性是只写的,两个访问器都实现则属性可读可写,属性的定义形式如下:
public class BasicClass { // Property declaration access_modifier return_type property_name { get { //Get accessor code block } set { //Set accessor code block } } }
其中access_modifier是属性的访问权限,可以是private,protected,public,global,属性也可以被static,transient修饰,以实际例子说明:
public class BasicProperty { public integer prop { get { return prop; } set { prop = value; } } }
以下代码调用了上述类中的get、set访问器:
BasicProperty bp = new BasicProperty(); bp.prop = 5; // Calls set accessor System.assert(bp.prop == 5); // Calls get accessor
注意:
1)get访问器有返回值,并以return语句结束;2)不建议在get访问器中改变类状态;3)当给一个属性赋值时,调用set访问器,并将赋值的值传递给set访问器中一个与该属性相同属性的名为value的隐式变量;4)属性不能再接口中定义;5)Apex属性的依据来自C#,更多详情详见C#属性的介绍;
使用自动属性(Automatic Properties)
Apex属性的构造器并不一定需要实现代码,可以只通过制定get、set关键字定义自动属性,举例说明:
public class AutomaticProperty { public integer MyReadOnlyProp { get; } public double MyReadWriteProp { get; set; } public string MyWriteOnlyProp { set; } }
使用静态属性(Static Properties)
当一个属性的被static修饰,那么其访问器就只能对类中的静态成员进行操作
Apex属性访问器的访问权限
访问器的访问权限不能高于Apex属性本身的访问权限
继承
继承父类的子类继承了父类的所有方法和属性。此外,子类可以通过在方法定义中使用override关键字来覆盖父类中的虚拟方法(用virtual修饰),与Java一样,一个类只能=继承一个父类,但是可以实现多个接口;例如:
public virtual class Marker { public virtual void write() { System.debug('Writing some text.'); } public virtual Double discount() { return .05; } }
再创建一个实现上述类的子类:
// Extension for the Marker class public class YellowMarker extends Marker { public override void write() { System.debug('Writing some text using the yellow marker.'); } }