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
,訪問會產生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 類與對象