Cava 类与对象

简介

cava语言支持类的定义和对象的使用。主要支持面向对象编程中的以下概念:

  • 封装

  • 抽象

  • 对象

  • 实例

  • 方法

cava中面向对象模块的语法设计,与Java和C#语言基本一致。

示例

定义一个名为 Example 的类,在入口函数中创建相应的对象 example ,并访问其身上的成员 PI

class Example {  // <==
    double PI;
    Example() {
        PI = 3.1415926;
    }
    static int main() {
        Example example = new Example(); 
        double a = example.PI; //a的值为3.1415926
        return 0;
    }
}

功能介绍

类的定义

类的定义由 class 关键字开始,内部主要包含以下操作:

  • 定义成员变量:定义承载对象中数据的变量

  • 定义构造函数:对象创建完毕后负责对象数据的初始化

  • 定义成员函数:定义函数作为访问对象的方法

  • 定义类函数:定义类级别函数,被所有对象共享,并可以直接通过类名访问

class Example {        // 定义类Example
    public double PI;  // 定义成员变量
    Example() {        // 定义构造函数
        PI = 3.1415926;
    }
    double getPI() {   // 定义成员函数
        return PI;
    }
    static int main() {
        Example example = new Example();
        double a = example.getPI(); //a的值为3.1415926
        return 0;
    }
}

创建对象

当类定义完毕后,即可开始使用类来创建对象。创建对象主要包含以下三步:

  • 声明:声明一个变量,并指定变量对应的类型

  • 实例化:结合内置关键字 new 来产生一个新的对象

  • 初始化: new 关键字后紧跟的函数确定了对象创建后使用的构造函数,构造函数承担了对象数据的初始化任务

以下是一个例子,注意在 main 函数的第一行,我们使用刚刚定义的 Example 类型创建了一个对象,并将其保存在一个名为 example 的变量中。对象创建完毕后,可以使用 example 变量访问对象上的数据成员。

class Example {
    double PI;
    Example() {
        PI = 3.1415926;
    }
    static int main() {
        Example example = new Example(); 
        return 0;
    }
}

成员变量

以下例子中定义了一个名为 PI 、类型是 double 的成员变量:

class Example {
    double PI; // <==
    Example() {
        PI = 3.1415926;
    }
}

注意:暂不支持在成员变量定义时指定初始化值,成员变量初始化请在构造函数中完成。

class Example {
    double PI = 3.1415926; //目前不支持在定义成员变量时进行初始化
}

构造函数

在cava中,构造函数是一种特殊的成员函数。构造函数有以下两个要求:

  • 构造函数的名称必须和类名一致

  • 构造函数没有返回值,且不可以指定返回值

构造函数在对象创建后会自动被调用,执行构造函数内的指令完成对象数据的初始化。cava中支持定义多个构造函数,每次对象构造会根据 new 后语句的形式,选择相应构造函数进行初始化。在以下例子中,我们在入口函数 main 中构造了两个对象,其中第一个对象使用构造函数A初始化,初始化完毕后,成员 PI 的值为 3.1415926 ;第二个函数使用构造函数B初始化,初始化完毕后,成员 PI 的值为用户传入的 3.14

class Example {
    public double PI;
    Example() { // <== A
        this.PI = 3.1415926;
    }
    Example(double customPI) { // <== B
        this.PI = customPI;
    }
    double getPI() {
        return PI;
    }
    static int main() {
        Example example1 = new Example(); // 使用构造函数A进行初始化
        double a = example1.getPI();
        Example example2 = new Example(3.14); // 使用构造函数B进行初始化
        double b = example2.getPI()
        return 0;
    }
}

注:构造函数支持重载

成员函数

成员函数提供了对成员变量操作的封装,对象的使用者通过调用成员函数,来读取和修改对象的成员变量。在成员函数的定义中,可以直接访问成员变量。如果函数作用域内存在另一个同名变量,则通过该变量名访问时会优先使用函数作用域内的变量。此类情况可以通过在变量前添加 this 前缀,来限定使用成员变量。

class Example {
    public double PI;
    Example() {
        this.PI = 3.1415926;
    }
    void getPI() {
        return PI;
    }
    static int main() {
        Example example = new Example();
        double a = example.getPI();
        return 0;
    }
}

注:成员函数支持函数重载。在类中可以定义多个同名成员函数,编译器会在函数的调用处,根据调用参数的类型和个数选择出最匹配的函数,执行调用。

类函数

类函数是属于类的函数,且被所有该类的成员共享。类函数通过在函数定义中增加 static 修饰符创建,并可以直接通过类来访问,无需创建相应对象,而成员函数必须通过对象访问。

class Example {
    static double getPI() { // <==
        return 3.1415926;
    };
    static int main() {
        double a = Example.getPI();
        return 0;
    }
}

继承和多态

cava暂时不支持类的继承。