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 类与对象