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.');
  }
}

 

posted on 2017-10-26 10:16  乄清雅轩灬  阅读(882)  评论(0编辑  收藏  举报

导航