Cava 类型和变量定义

cava中支持以下两种类型的类型定义。

变量定义

cava中支持以下两种类型的类型定义

  • 局部变量

  • 类的成员变量

注:cava中不支持类变量,定义类变量会引发编译错误,具体见Cava 修饰符

局部变量

数值类型变量

  • 定义一个 int类型的局部变量 a,并赋值为 10

class Example {
    // ...
    int test() {
        int a; // <==
        a = 10;
        return a + 1;
    }
    // ...
}
  • 直接使用初始值 10定义局部变量 a

class Example {
    // ...
    int test() {
        int a = 10; // <==
        return a + 1;
    }
    // ...
}

对象变量

对象变量定义后需要使用 new语句创建相应的对象。否则变量的内容为 null,访问会产生空指针异常。

class Example {
    public double PI;
    Example(double customPI) {
        this.PI = customPI;
    }
    static int main() {
        Example a = new Example(3.1415926); // <==
        return 0;
    }
}

数组类型变量

  • 定义具有 10个元素的 int类型数组 a,并依次初始化为 [0..9]

class Example {
    // ...
    int test() {
        int[] a = new int[10]; 
        for (int i = 0; i < a.length; ++i) {
            a[i] = i; 
        }
        return a[0];
    }
    // ...
}
  • 使用初始化列表,定义 int类型的数组,并初始化为 [0..9]。注意:数组的长度由编译器自动推导。

class Example {
    // ...
    int test() {
        int[] a = new int[]{0,1,2,3,4,5,6,7,8,9}; 
        return a[0];
    }
    // ...
}
  • 创建对象数组。注意:对象数组创建完毕后,还需要为数组中的元素依次创建对象。

class Example {
    public double PI;
    Example(double customPI) {
        this.PI = customPI;
    }
    static int main() {
        Example[] a = new Example[10]; // 创建对象数组
        for (int i = 0; i < a.length; ++i) {
            a[i] = new Example(3.1415926); // 初始化数组中的每个对象
        }
        return 0;
    }
}

类的成员变量

类的成员变量的定义和使用见Cava 类与对象

内置类型

cava中内置了以下常见类型,供直接使用(括号内为类型的实际内存大小):

  • booelan(1字节)

  • byte(1字节)

  • char(2字节)

  • short(2字节)

  • int(4字节)

  • long(8字节)

  • float(4字节)

  • double(8字节)

值得一提的是,char类型在内部使用2个字节的编码,与Java的utf16编码格式基本一致,采用定长的2个字节,而不是可变长的utf16。

在类型间进行转换

和大部分语言一样,内置的数值类型存在一定的可转换关系,在合适的情况下,编译器会插入代码完成数值类型之间的转换。

兼容类型自动转换

当源类型和目标类型之间存在如下关系时:

  • 目标类型数值表示范围包含源类型的数值表示范围(主要针对整数类型)

  • 源类型转换为目标类型后,数值精度不会丢失(主要针对浮点类型)

称为转换是安全的。例如, short类型到 int类型的转换、 float类型到 double类型的转换都是安全的。编译器会自动插入代码完成此类转换:

float a = 3.14f;
double b = a;

short c = -1;
int d = c;

cava中各种类型之间的类型转换规则与其它常见编程语言(Java、C++)一致。

类型强制转换

某些数值类型在转换时存在精度丢失或者表示范围不匹配的问题,这种情况下编译器会进行检查并提示错误,例如:

double a = ...;
float b = a; // error,存在丢失数值精度风险

由于此类转换一般是不安全的,所以编译器禁止代码自动进行此类转换。如果用户明确掌握类型间转换存在的风险,可以在代码中显式使用强制类型转换,避免编译器报错。

float a = 3.14f;
int b = (int)a; // 小数部分会被丢弃,仅保留整数部分,实现取整效果

自定义类型

cava中支持类的定义和对象的使用,具体用法见Cava 类与对象