本文主要介紹了Java中基本的數據類型,以及如何在程序中正確的使用。
計算機處理數據,變量被用來存儲處理的數據,之所以叫做變量因為你可以改變存儲的值。更確切的說,一個變量指向著一塊存儲特定類型值的地址,換句話說,一個變量有名稱、類型和值。一個變量有一個名稱,例如radius、area、age和height,每個變量的名稱都是唯一的,這邊可以方便我們設置和獲取變量的值。
一個變量有一種類型,下面是Java類型的列子:
變量存儲特定類型的值,編程中要特別注意變量類型,舉例:一個int變量存儲整數123,但是不能存儲浮點數12.34,同樣也不能存儲文本"Hello"。
早期的編程語言中引入了類型的概念來解釋二進制01數據,類型定義了數據的結構、大小、范圍以及針對該類型的一系列操作。
需要唯一的標識來命名變量,Java遵循以下標識的命名方式:
使用駝峰給變量命名:theFontSize、roomNumber、xMax、yMin、xTopLeft和thisIsAVeryLongVariableName, 可以參考下面的建議:
你需要定義變量的名稱和類型才能在程序中使用變量,你可以使用下面的其中一種語法:
// 定義特定類型的變量, type identifier
int option;
// 定義多個同類型變量,變量之間用逗號分隔,type identifier1, identifier2, ..., identifierN
double sum, difference, product, quotient;
// 定義變量並初始化, type identifier = initialValue
int magicNumber = 88;
// 定義多個同類型變量並初始化, type identifier1 = initValue1, ..., identifierN = initValueN
String greetingMsg = "Hi!", quitMsg = "Bye!";
注意:
常量的命名規范:使用大寫的單詞,多個單詞使用下劃線連接,例如:MIN_VALUE,MAX_SIZE。
常量是不可變的,使用關鍵字final進行聲明,常量聲明後需要初始化
final double PI = 3.1415926;
表達式是由運算符和操作數組合而成,通過計算可以輸出單個類型的值,例如
1 + 2 * 3 // 計算得到7
int sum, number;
sum + number // 計算得到一個int值
double principal, interestRate;
principal * (1 + interestRate) // 計算得到一個double值
指派一個右操作數賦值給左操作數,例如:x=1。
計算表達式的值並賦值給左操作數,例如:x=(y + z) / 2。
賦值語句的語法:
// 直接賦值, variable = literalValue
number = 88;
// 計算表達式之後賦值, variable = expression
number = number + 1; // 計算表達式number+1,最後將結果賦值給number
8 = number; // 錯誤的使用
number + 1 = sum; // 錯誤的使用
在Java中有兩種類型:基本類型 (int、double等)和引用類型 (類和數組)。
內建的基本類型
基本類型內建在程序語言中,從上面的圖中我們可以看出Java有8種基本類型。
有4種有符號的整型:8位byte,16位short,32位int,64位long。
32位單精度類型float,float近似的取值范圍±1.4023p846×10^-45到±3.40282347×10^38。
64位雙精度類型double, double近似的取值范圍±4.p4065645841246544×10^-324到±1.7p76p313486231570×10^308。
char表示單個字符,例如p;0p;,p;Ap;,p;ap;,在Java中,char采用16位Unicode(UCS-2格式)來支持國際化(i18n)。
Java中引入了二進制的布爾類型,它只能包含true和false兩個值。
例子:下面的程序用來輸出打印基本類型的最大值、最小值和比特長度。
/*
* 輸出基本類型的最大值、最小值和比特長度
*/
public class PrimitiveTypesMinMax {
public static void main(String[] args) {
// int (32位有符號整型)
System.out.println("int(min) = " + Integer.MIN_VALUE);
System.out.println("int(max) = " + Integer.MAX_VALUE);
System.out.println("int(bit-length) = " + Integer.SIZE);
// byte (8位有符號整型)
System.out.println("byte(min) = " + Byte.MIN_VALUE);
System.out.println("byte(max) = " + Byte.MAX_VALUE);
System.out.println("byte(bit-length)=" + Byte.SIZE);
// short (16位有符號整型)
System.out.println("short(min) = " + Short.MIN_VALUE);
System.out.println("short(max) = " + Short.MAX_VALUE);
System.out.println("short(bit-length) = " + Short.SIZE);
// long (64位有符號整型)
System.out.println("long(min) = " + Long.MIN_VALUE);
System.out.println("long(max) = " + Long.MAX_VALUE);
System.out.println("long(bit-length) = " + Long.SIZE);
// char (16位字符或者16位無符號整型)
System.out.println("char(min) = " + (int)Character.MIN_VALUE);
System.out.println("char(max) = " + (int)Character.MAX_VALUE);
System.out.println("char(bit-length) = " + Character.SIZE);
// float (32位浮點數)
System.out.println("float(min) = " + Float.MIN_VALUE);
System.out.println("float(max) = " + Float.MAX_VALUE);
System.out.println("float(bit-length) = " + Float.SIZE);
// double (64位浮點數)
System.out.println("double(min) = " + Double.MIN_VALUE);
System.out.println("double(max) = " + Double.MAX_VALUE);
System.out.println("double(bit-length) = " + Double.SIZE);
}
}
int(min) = -2147483648
int(max) = 2147483647
int(bit-length) = 32
byte(min) = -128
byte(max) = 127
byte(bit-length)=8
short(min) = -32768
short(max) = 32767
short(bit-length) = 16
long(min) = -9223372036854775808
long(max) = 9223372036854775807
long(bit-length) = 64
char(min) = 0
char(max) = 65535
char(bit-length) = 16
float(min) = 1.4E-45
float(max) = 3.4028235E38
float(bit-length) = 32
double(min) = 4.9E-324
double(max) = 1.7976931348623157E308
double(bit-length) = 64
String不是基本類型,是另外一種常用的類型,它表示文本內容,在Java中字符串使用雙引號。
String message = "Hello, world!"; // 字符串使用雙引號
char gender = 'm'; // 字符使用單引號
為變量選擇數據類型
開發中需要設計合適的變量類型,多數時我們不難選擇,你可以用int來存儲整型,用float來存儲有小數的數值,用String來存儲文本,用char來存儲單個字符和用boolean來存儲二元結果。
經驗法則
由於int類型非常精確、運行效率高,因此常被用作計數和索引。
盡可能的使用int類型。
數據表示
值得注意的是char '1'與int 1、byte 1、short 1、float 1.0、double 1.0、String "1"是不相同的,它們在計算機的內存中有著不同的精度和說明,舉例說明:
byte 1表示00000001
short 1表示00000000 00000001
int 1表示00000000 00000000 00000000 00000001
long 1表示00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
float 1.0表示0 01111111 0000000 00000000 00000000
double 1.0表示0 01111111111 0000 00000000 00000000 00000000 00000000 00000000 00000000
char '1'表示00000000 00110001
String "1"表示復雜的對象
下面我們來看一個變量名稱和類型的例子:
Paul買了一台abc品牌的筆記本電腦,3.2GHZ高速處理器、4GB內存、500GB硬盤、15英寸顯示器,總價為$1650.45,在現場從服務計劃A、B、C中選擇了B計劃,定義涉及的相關變量和類型。
String name = "Paul";
String brand = "abc";
double processorSpeedInGHz = 3.2; // 或者 float
double ramSizeInGB = 4; // 或者 float
int harddiskSizeInGB = 500; // 或者 short
int monitorInInch = 15; // 或者 byte
double price = 1650.45;
char servicePlan = 'B';
boolean onSiteService = true;
假設你正在為學校開發一款收集學生信息的軟件,學生的信息包括年齡、地址、電話、性別、生日、身高、體重、年級、入學時間等,每個學生被分配一個8位數字標識,下面來使用變量定義它們吧。
編程中使用的文字、字面值都是特定的常量,例如123,-456,3.14,-1.2e3,'a',"Hello", 可以用做賦值或表達式。
Integer(int,long,short,byte)字面值
// 整數默認的都被視作int類型,例如123和-456,在Java中32位的int取值范圍從-2,147,483,628(-2^31)到2,147,483,627(2^31-1)
int number = -123;
int sum = 1234567890; // 這個值在int取值范圍內
int bigSum = 8234567890; // 錯誤: 這個值超出了int取值范圍
// int字面值沒有特殊說明都表示10進制,以0開頭的數字表示8進制,以'0x'開頭的數字表示16進制。
int number = 1234; // 10進制1234
int number = 01234; // 8進制1234, 10進制668
int number = 0x1abc; // 16進制1ABC, 10進制6844
// 從JDK1.7開始,你可以使用'0b'或者'0B'為前綴來表示二進制,你也可以使用下劃線_對數字進行分組來提高可讀性,但是開頭和結尾必須使用數字。
int number1 = 0b01010000101000101101000010100010;
int number2 = 0b0101_0000_1010_0010_1101_0000_1010_0010;
int number3 = 2_123_456;
// long字面值用數字加上後綴'L'或'l'來表示
long bigNumber = 1234567890123L;
long sum = 123; // int類型123會被自動轉換成long類型123L
// byte和short字面值不需要添加後綴,你可以直接使用整數初始化
byte smallNumber = 12345; // 錯誤: 超出了byte取值范圍
byte smallNumber = 123;
short midSizeNumber = -12345;
// 有小數點的數值例如55.66和-33.44默認的被視作double類型,同樣你可以用科學計數法表示,例如1.2e3,-5.5E-6, 大寫E小寫e表示10的指數,你可以用數字加上後綴'd'或'D'表示。
float average = 55.66; // 錯誤! 右操作是double類型, 需要後綴'f'來表示
float average = 55.66f;
字符字面值和轉義序列
// 字符嵌入在單引號裡面表示char類型,char類型使用16位的Unicode編碼,算術運算上等同於16位無符號整型
char letter = 'a'; // 等同於97
char anotherLetter = 98; // 等同於'b'
System.out.println(letter); // 輸出'a'
System.out.println(anotherLetter); // 輸出'b'代替數字
anotherLetter += 2; // 100或'd'
System.out.println(anotherLetter); // 輸出'd'
非打印的控制字符通常被稱為轉義序列,通常以反斜線\開始,下面是常用的轉義序列:
說明:
String字面值
長度不定的字符串嵌入在雙引號裡面表示字符串字面值,例如"Hello, world!","The sum is: ",舉例說明:
String directionMsg = "Turn Right";
String greetingMsg = "Hello";
String statusMsg = ""; // 空字符串
// 字符串字面值可能包含轉義序列,在字符串你裡面,你需要使用 \"來表示雙引號,單引號不需要轉義,舉例說明:
System.out.println("Use \\\" to place\n a \" within\ta\tstring");
Use \" to place
a " within a string
練習:編寫程序打印輸出下面的字符。
'__'
(oo)
+========\/
/ || %%% ||
* ||-----||
"" ""
boolean字面值
// boolean字面值緊包含兩個值:true和false
boolean done = true;
boolean gameOver = false;
字面值的例子
public class LiteralTest {
public static void main(String[] args) {
String name = "Tan Ah Teck"; // String使用雙引號
char gender = 'm'; // char使用單引號
boolean isMarried = true; // true或者false
byte numChildren = 8; // byte取值范圍[-127, 128]
short yearOfBirth = 1945; // short取值范圍[-32767, 32768]
int salary = 88000;
long netAsset = 8234567890L;
double weight = 88.88;
float gpa = 3.88f;
// 輸出
System.out.println("Name is " + name);
System.out.println("Gender is " + gender);
System.out.println("Is married is " + isMarried);
System.out.println("Number of children is " + numChildren);
System.out.println("Year of birth is " + yearOfBirth);
System.out.println("Salary is " + salary);
System.out.println("Net Asset is " + netAsset);
System.out.println("Weight is " + weight);
System.out.println("GPA is " + gpa);
}
}
Name is Tan Ah Teck
Gender is m
Is married is true
Number of children is 8
Year of birth is 1945
Salary is 88000
Net Asset is 1234567890
Weight is 88.88
Height is 188.8