类
Apex的Class与Java中的用法类似,Class是objects的模板,objects都是Class的实例,Apex中可以定义外部类和内部类,内部类不能嵌套,只能定义一层,如:
public classmyOuterClass {//Additional myOuterClass code here
classmyInnerClass {//myInnerClass code here
}
}
上面的类定义中,需要注意:
1)外部类必须要指定其访问修饰符(access modifiers)
2)不用指定内部类的访问修饰符,默认访问权限是private
3)内部类中不能有static修饰的变量和方法
Apex类定义的模板如下:
private | public |global
[virtual| abstract | with sharing |without sharing]class ClassName [implements InterfaceNameList] [extendsClassName]
{//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 classLeads{//A constructor with two arguments
publicLeads (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
publicLeads (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 classBasicClass {//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 classBasicProperty {publicinteger prop {
get {returnprop; }
set { prop=value; }
}
}
以下代码调用了上述类中的get、set访问器:
BasicProperty bp = newBasicProperty();
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 classAutomaticProperty {publicinteger MyReadOnlyProp { get; }public doubleMyReadWriteProp { get; set; }publicstring MyWriteOnlyProp { set; }
}
使用静态属性(Static Properties)
当一个属性的被static修饰,那么其访问器就只能对类中的静态成员进行操作
Apex属性访问器的访问权限
访问器的访问权限不能高于Apex属性本身的访问权限
继承
继承父类的子类继承了父类的所有方法和属性。此外,子类可以通过在方法定义中使用override关键字来覆盖父类中的虚拟方法(用virtual修饰),与Java一样,一个类只能=继承一个父类,但是可以实现多个接口;例如:
public virtual classMarker {public virtual voidwrite() {
System.debug(‘Writing some text.‘);
}publicvirtual Double discount() {return .05;
}
}
再创建一个实现上述类的子类:
//Extension for the Marker class
public class YellowMarker extendsMarker {public override voidwrite() {
System.debug(‘Writing some text using the yellow marker.‘);
}
}