變量與常量有什么區別?


在程序執行過程中,其值不能被改變的量稱為常量,其值能被改變的量稱為變量。變量與常量在編寫程序中需要經常使用,本節將詳細介紹變量與常量的使用方法。

   標識符

  標識符(identifier)用於命名變量、常量、方法、類、包等實體。

  標識符命名規則:

  標識符是由字母、數字、下划線“_”、美元符號“$”組成的字符序列。

  標識符必須以字母、下划線“_”、美元符號“$”開頭,不能以數字開頭。

  標識符不能是關鍵字和保留字。

  標識符不能包含空格。

  例如,$6,name,Class,java,_pwd都是合法的標識符,而2a,class,c++,hello world,a@都是非法的標識符,不符合標識符命名規則。Java編譯器會檢測出非法標識符並報錯。

   變量的定義

  變量的使用是程序設計中一個十分重要的環節,定義變量就是告訴編譯器這個變量的數據類型,這樣編譯器才知道需要配置多少內存空間給它,以及它能存放什么樣的數據。在程序運行過程中,空間內的值是變化的,這個內存空間就稱為變量。為了便於操作,給這個空間取個名字,稱為變量名。變量的命名必須是合法的標識符。內存空間內的值就是變量值,在聲明變量時可以是沒有賦值,也可以是直接賦給初值。

  聲明變量的語法格式如下:

  數據類型 變量名;

  如需聲明多個相同類型變量時,可使用下面的語法格式:

  數據類型 變量名1,變量名2,…,變量名n;

  接下來,通過具體的代碼學習變量的定義,具體示例如下:

  int n,q=1; // 定義了二個int類型的變量,為q賦初值為1

  double x, y, z; // 定義了三個double類型的變量

  對於變量的命名並不是任意的,應遵循以下4條規則:

  (1)變量名必須是一個有效的標識符。

  (2)變量名不可以使用Java關鍵字。

  (3)變量名不能重復。

  (4)應選擇較有意義的單詞作為變量名。

   變量的類型轉換

  Java的數據類型在定義時就已經明確了,但程序中有時需要進行數據類型的轉換,Java允許用戶有限度地進行數據類型轉換。數據類型轉換方式分為自動類型轉換和強制類型轉換兩種。

   1.自動類型轉換

  自動類型轉換也稱隱式類型轉換,指兩種數據類型轉換過程中不需要顯式地進行聲明。Java會在下列的條件成立時,自動做數據類型的轉換:

  (1)轉換的兩種數據類型彼此兼容。

  (2)目標數據類型的取值范圍比原類型大。

  類型轉換只限該行語句,並不會影響原先定義的變量類型,而且自動類型轉換可以保持游戲數據的精確度,不會因為轉換而丟失數據內容。

  Java支持自動類型轉換的類型,如圖所示。

1

  圖2.1 自動數據類型轉換圖

  自動類型轉換示例說明如下:

  byte b = 97; // 聲明byte型變量值為97

  char c = b; // 錯誤,byte類型不能自動類型轉換為char類型

  float f = b; // 正確,byte類型能自動類型轉換為float類型

  double d = 'c'; // 正確,char類型能自動類型轉換為doublewww.sangpi.com類型

  在Java中,任何基本類型的值和字符串進行鏈接運算“+”時,基本類型的值將自動類型轉換為字符串類型,字符串用String類表示,是引用類型。具體示例如下:

  String s = 97; // 錯誤,不能直接將基本類型賦值給字符串

  String str = 97 + ""; // 正確,基本類型的值自動轉換為字符串,""代表空字符串

   2.強制類型轉換

  強制類型轉換也稱為顯式轉換,指兩種數據類型轉換過程中需要顯式地進行聲明。當轉換的兩種數據類型彼此不兼容,或者目標數據類型的取值范圍小於原類型時,而無法進行自動類型轉換,此時就需要進行強制類型轉換,如例2-1所示。

  例2-1 TestTypeCast.java

  1 public class TestTypeCast {

  2 public static void main(String[] args) {

  3 int n = 128;

  4 byte b = n;

  5 System.out.println(b);

  6 }

  7 }

  程序的運行結果如圖所示。

2

  
 出現了編譯錯誤,提示第4行代碼類型不兼容,出現這樣錯誤的原因是將int轉換到byte時,int類型的取值范圍大於byte類型的取值范圍,轉換會導致精度損失,也就是用1個字節的變量來存儲4個字節的變量值。

  對第4行代碼進行強制類型轉換,修改為下面的代碼:

  byte b = (byte) n;

  程序的運行結果如圖所示。

3

  

  當試圖強制把取值范圍大的類型轉換為取值范圍小的類型時,將會引起溢出,從而導致數據丟失。圖2.10中運行結果為-128,出現這種現象的原因是,int類型占4個字節,byte類型占1個字節,將int類型變量強制轉換為byte類型時,Java會將int類型變量的3個高位字節截斷,直接丟棄,變量值發生了改變,如圖所示。

4

  圖2.4 強制轉換過程

   變量的作用域

  變量的作用域是指它的作用范圍,只有在這個范圍內,程序代碼才能訪問它。變量聲明在程序中的位置決定了變量的作用域。變量一定會聲明在一對大括號中,該大括號所包含的代碼區域就是這個變量的作用域,下面通過一個示例來分析變量的作用域。如例2-2所示

  例2-2 TestScope.java

  1 public class TestScope {

  2 public static void main(String[] args) {

  3 int x = 100; // 定義變量x

  4 {

  5 int y = 200; // 定義變量y

  6 }

  7 System.out.println(y); // 訪問變量y

  8 }

  9 }

  程序的運行結果如圖所示。

5

  圖2.12出現了編譯錯誤,提示“找不到符號”。報錯的原因在於,定義的變量y超出了作用域。將第7行代碼放置在第5行代碼之后,再次編譯程序不再報錯,程序的運行結果如圖所示。

6

  
   常量

  常量就是一個固定的值,是不能被改變的數據。Java程序中使用的直接量稱為常量,是在程序中通過源代碼直接給出的值,在程序執行過程中都不會改變,也稱最終量。

   1.整型常量

  整型常量是整數類型的數據,可分為二進制、八進制、十進制和十六進制4種,具體表示如下:

  二進制:由數字0和1組成,用0b或0B開頭的字面值,如0b110、0B110。

  八進制:由數字[0, 7]范圍內的整數組成,用0開頭的字面值,如0110。

  十進制:由數字[0, 9]范圍內的整數組成的字面值,如110。

  十六進制:由數字[0, 9]和字符[A, F]范圍內組成,用0x或0X開頭的字面值,如0x12、0XAbA。

   2.浮點數常量

  浮點數就是實數,包含有小數點,可以用標准小數形式和科學計數法形式兩種方式表示,具體表示如下:

  標准小數:由整數部分、小數點和小數部分構成,如1.5、2.2。

  科學計數法:由一個標准式加上一個以10為底的冪構成,兩者間用e或E隔開,如1.2e+6、5E-8。

  在Java中,分為float單精度浮點數和double雙精度浮點數兩種類型,單精度浮點數以f或F結尾,雙精度浮點數以d或D結尾。不加后綴會默認為double雙精度浮點數。

   3.字符常量

  字符常量有三種形式,具體表示如下:

  用單引號括起來的字符。如'a'、'0'。

  轉義字符。如'\n'、'\t'、'\0'。

  用Unicode值表示的字符,格式是'\uXXXX',其中XXXX代表一個十六進制的整數。如'\u0000'。

   4.字符串常量

  字符串常量就是用雙引號括起來的字符序列。如"歡迎學習Java"、"A"。

   5.布爾常量

  布爾常量就是布爾類型的兩個值true和false,用於表示真和假。

   6.null常量

  null常量只有一個值null,表示對象引用為空。

   多學一招:轉義字符

  Java定義了一種特殊的標記來表示特殊字符,這種標記稱為轉義序列,轉義序列由()后面加上一個字符或者一些數字位組成。如\t表示Tab字符的轉義符,\u000A表示換行符\n。轉義序列中的序列號作為一個整體翻譯,而不是分開翻譯。一個轉義序列被當做一個字符。

   常用的轉義序列如下:

  \b,退格鍵,Unicode碼為\u0008。

  \t,Tab鍵,Unicode碼為\u0009。

  \n,換行符,Unicode碼為\u000A。

  \r,回車符,Unicode碼為\u000D。

  反斜杠\被稱為轉義字符,它是一個特殊字符。有特殊意義的字符,無法直接表示,需要用轉義序列來表示。

  \',單引號字符,Java中單引號表示字符的開始和結束,直接寫單引號字符('),編譯器會匹配前兩個是一對,會報錯,所以需要使用轉義字符\'。

  \",雙引號字符,Java中雙引號表示字符串的開始和結束,要顯示雙引號需要使用轉義字符\",如"歡迎學習\"Java\""。

  \,反斜杠字符,Java中的反斜杠是轉義字符,要顯示反斜杠,需要使用轉義字符\。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM