數據類型:
數據類型確定了數據在內存中占用的存儲空間以及存儲方式。每個數據類型都有它的取值范圍,編譯器根據每個變量或常量的數據類型為其分配內存空間。
Java語言的數據類型可以分為兩類:一類是簡單數據類型(或基本數據類型),例如整數類型、浮點數類型、字符型類型和布爾類型等;另一種是引用類型,例如數組類型、類、接口等。
一、基本數據類型
8種基本數據類型,分別是字節型(byte)、短整型(short)、整型(int)、長整型(long)、字符型(char)、浮點型(float)、雙精度型(double)、布爾型(boolean)。
1.整數類型:
Java使用4種類型的整數:byet、short、int 和 long,都是有符號的整數。
(與有符號整數對應的是無符號整數,兩者的區別在於把二進制數轉換為十進制數的方式不一樣。有符號數把二進制的首位作為符號位,當首位數是0時,對應十進制的正整數;當首位是1時,對應十進制的負整數。無符號整數在進行進制轉換時,把二進制的所有位轉化為正整數。)
注意:Java不支持僅僅是正的無符號的整數。
(1)字節型(byte):最小的整數類型。有符號的8位類型,數的范圍是 -128~127。當從網絡或文件處理數據流的時候,字節類型的變量特別有用。
聲明字節變量: byte 變量名;
(2)短整型(short):有符號的16位類型,數的范圍是 -32768~32767。因為它被定義為高字節優先(稱為 big-endian格式),它可能是Java中使用的最好的類型。
聲明短整型變量: short 變量名;
(3)整型(int):最常用的整數類型。有符號的32位類型,數的范圍是 -2147 483 648~2147 483 647。int類型的變量通常被用來控制循環及作為數組的下標。
任何時候,如果整數表達式包含 byte、short、int及整型常量。在進行計算以前,所有表達式的類型被提升(自動轉換)到整型。
聲明整型變量: int 變量名;
(4)長整型(long):有符號的64位類型,它對於那些整型不足以保存所要求的數值時是有用的。長整型數的范圍是相當大的。
聲明長整型變量: long 變量名;
2.浮點型:
Java使用兩種類型的浮點數:float和double。double型的存儲空間是float型的兩倍,所以double型又稱為雙精度,而float型又稱為單精度。當數據或表達式的值有精度要求時,需要使用浮點型數據。
(1)單精度浮點型(float):專指占用32位存儲空間的單精度值(Single-Precision)。單精度在一些處理器上比雙精度更快而且只占用雙精度一般的空間,但是當值很大或很小的時候,它將變得不精確。當需要小數部分並且對精度的要求不高時,單精度浮點型的變量是有用的。
聲明單精度浮點型變量: float 變量名;
(2)雙精度浮點型(double):占用64位的存儲空間。所有超出人類經驗的數學函數,如sin()、cos()和sqrt()均返回雙精度的值。當需要保持多次返回迭代的計算的精確時,或在操作值很大的數字時,雙精度型是最好的選擇。
聲明雙精度浮點型變量: double 變量名;
3.字符型(char):
在計算機中,所有的數據在存儲和運算時都要使用二進制數表示(因為計算機用高電平和低電平表示1和0)。將字符映射為它的二進制形式的過程稱為編碼(Encoding)。
為了能夠實現互相通信而不造成混亂,就必須使用相同的編碼規則或編碼方式。當前使用最廣泛的兩種編碼方式是 統一碼(Unicode)和美國標准信息交換代碼(ASCII)碼。
在Java中,字符型數據用 char 關鍵字進行定義,采用Unicode碼代表字符,使用16位數據表示字符集。
4.布爾型(boolean):
Java中表示邏輯值的簡單類型。它的值只能是 true(真)或 false(假)這兩個值中的一個。它是所有的諸如 a<b 這樣的關系運算的返回類型。布爾類型對管理像 if、for這樣的控制語句的條件表達式也是必需的。
二、定義常量
在程序運行過程中,其值不能改變的量稱為常量。常量必須在同一條語句中聲明和賦值,final是聲明常量的Java關鍵字。
程序中常量名所有字母最好用大寫形式,詞與詞之間可以用下劃線隔開。
Java中常用的常量有布爾型常量、整型常量、浮點型常量、字符常量和字符串常量。
1.布爾型常量:
布爾型常量用於表示兩個邏輯狀態之一的值:true(真)或false(假)。不同於C/C++語言,Java語言中規定不可將布爾型看成整型值。
注意:在Java語言中,true常量的值不等於1,false常量的值不等於0,它們僅僅能被賦給已定義的布爾變量,或在布爾運算符表達式中使用。
2.整型常量:
任何一個整數的值就是一個整數常量。整型常量可以用來給整型變量賦值。整型常量有3種表示形式:
(1)十進制整型常量:如 1,25,-37等。
(2)八進制整型常量:在Java語言中,以0開頭的整型量表示八進制整型常量,如 010 表示十進制的 8 ,-015 表示十進制的 -13。
(3)十六進制整型常量:在Java語言中,以 0x 或 0X 開頭的整型常量表示十六進制整型常量,如 0x10 表示十進制的 16 , -0X15 表示十進制的 -21 。
在Java語言中,整形常量的默認類型為int值,用4個字節表示。當一個整型常量的值被賦給一個 byte 或 short 型的變量時,如果常量的值沒有超過對應類型的范圍時不會產生錯誤。所以,整型常量總是可以被賦給一個long型變量。但是,如果要表示一個long類型的常量,則要特別指明,即通過在常量的後面加一個大寫或小寫的 L 來做到,如 1234567L 等。
3.浮點型常量:
浮點型常量是可以帶有小數點的數值型常量。根據占用內存長度的不同,可以分為一般浮點常量和雙精度常量。如果要表示一般浮點常量,可以在數值後面加上f或F;如果要表示雙精度常量,可以在數值後面加上d和D。
注意:Java中的浮點型常量默認是雙精度。
默認的雙精度類型要占用64位存儲空間,而精確低些的浮點類型僅僅需要32位。
4.字符常量:
Java用 Unicode字符集來表示字符。Java的字符是16位值,可以被轉換為整數並可進行像加(+)或減(-)這樣的整數運算。
在Java語言中,有以下兩種形式的字符常量:
(1)普通字符:用單引號括起來的一個字符,如 'A'、'0'、'$'等。不能寫成'AB'或'12'。
注意:單引號只是界限符,字符常量只能是一個字符,不包括單引號。'a'和'A'表示不同的字符常量。
(2)轉義字符:以字符\ 開頭的字符序列。這是一種在屏幕上無法顯示的“控制字符”,在程序中也無法用一個一般形式的字符來表示,只能采用這樣的特殊形式表示。
5.字符串常量:
Java語言中用雙引號("")括起來的字符序列表示字符串。字符串可以包含轉義字符,標志字符串開始和結束的雙引號必須在同一行。
可以使用連接操作符(+)將兩個或多個字符串常量連接在一起組成一個新的字符串,例如 "Welcome"+"to China"的結果相當於"Welcome to China"。
注意:不能將 "ABC"錯寫為 'ABC'。單引號內只能包含一個字符,而雙引號內可以包含一個字符串。另外,'A'和"A"表示兩個不同的量,前者是一個字符常量,而後者是一個字符串常量。
在C/C++等大多數計算機語言中,字符串作為字符的數組被實現。然而,在Java中,字符串實際上是對象類型。
三、定義變量及其作用域
變量是Java程序的一個基本存儲單元,表示內存中的一小塊空間,用來存儲將在程序中用到的數據。在內存中可以有很多個這樣的小塊空間,為了加以區分,為它們起不同的名字,這個名字就叫變量名,通常簡稱為變量。被稱為變量是因為它們的值在程序執行中可以被改變。
變量名遵循標識符的定義規則,每個變量都有自己特定的類型,編譯器可以根據變量的數據類型為變量分配合適的存儲空間。
所有的變量都有一個作用域,定義變量的可見性與生存期。
1.定義變量:
在Java中,每個變量在使用之前必須先對其進行定義,即要遵循先定義後使用的原則。
定義變量的語法:
數據類型 變量名[ = 初始值][,變量名 [ = 初始值]…];
數據類型可以是Java的基本類型之一,也可以是類及接口類型的名字。
變量名是用於標識該變量的名字,可以指定一個等號和一個值來初始化變量。
初始化表達式必須產生與指定的變量類型一樣(或兼容)的變量。
聲明指定類型的多個變量時,使用逗號將各變量分開。
例子:
int count; //聲明 count為一個整型變量 double radius = 2.0; //聲明radius為一個double型變量,並賦初值為2.0 char ch = 'A'; //聲明ch為字符類型的變量,並賦初值為字符'A'
2.變量初始化:
變量通常都有初始值。在Java中,可以在定義變量的同時對其初始化,也允許在變量聲明時使用任何有效的表達式來動態的初始化變量。
初始化表達式可以使用任何有效的元素,包括方法調用、其他變量或字面量。
3.變量的作用域和生存期:
在Java語言中,每個變量都有一定的生存周期和有效范圍。變量的作用域就是變量的有效范圍,只有在這個范圍內,程序代碼才能訪問它。
與C語言一樣,Java用大括號將若干語句組成語句塊,變量的作用域都是定義它的語句所在的語句塊,一旦程序的執行離開了這個語句塊,變量就變得沒有意義,不能再使用了。
變量的生命周期是指從一個變量被創建並為其分配內存空間開始,到這個變量並銷毀並清除所占用的內存空間的過程。變量的作用域決定了變量的生命周期。
Java允許在任何程序塊定義變量。
按照作用域的不同,變量可以分為以下類型:
(1)成員變量:在類中聲明,它的作用域是整個類。
(2)局部變量:在一個方法的內部或者方法的一個代碼塊的內部聲明。如果在一個方法內部聲明,它的作用域就是整個方法;如果在一個方法的某個代碼塊的內部聲明,它的作用域就是這個代碼塊。
(3)方法參數:方法或者構造方法的參數,它的作用域是整個方法或者構造方法。
(4)異常處理參數:異常處理參數和方法參數很相似,差別在於前者是傳遞參數給異常處理代碼塊,而後者是傳遞參數給方法或者構造方法。異常處理參數是指 catch(Exception e)語句中的異常參數“e”,它的作用域是緊跟著catch(Exception e) 語句後的代碼塊。
(作為一個通用規則,在一個作用域中定義的變量對於該作用域外的程序是不可見(即訪問)的。因此,當在一個作用域中定義一個變量時,應將該變量局部化並且保護它不被非授權訪問和/或修改。實際上,作用域規則為封裝提供了基礎。)
作用域可以進行嵌套。例如:每次創建一個程序塊時,就創建了一個新的嵌套的作用域。這樣,外面的作用域包含內部的作用域。這意味著外部作用域定義的對象對於內部作用域中的程序是可見的。但是,反過來是錯誤的,內部作用域定義的對象對於外部是不可見的。
例子:
class Scope{ public static void main(String[] args){ int x; //定義局部變量x,在整個main()方法中有效 x = 10; if(x==10){ //開始一個新的作用域 int y = 20; //定義局部變量y,在當前語句塊中有效 System.out.println("x and y:"+x+" "+y); //x和y在這裡均為有效 x = y*2; } //y=100; //錯誤,超出了y的作用范圍 x=15; //正確,x在此處依然有效 System.out.println("x is"+x); } }
還有,變量在其作用域被創建,離開其作用域時被撤銷意味著一個變量一旦離開它的作用域,將不再保存它的值了。因此,一個變量的生存期就被限定在它的作用域中。如果一個變量定義包括一個初始化,那麼每次進入定義它的程序塊時,該變量都要被重新初始化。
盡管程序塊能被嵌套,不能將內部作用域聲明的變量與其外部作用域聲明的變量重名。這一點,Java不同於C和C++。