Java基礎教程(5)--變數

来源:https://www.cnblogs.com/maconn/archive/2018/10/10/9763751.html
-Advertisement-
Play Games

經過上一篇教程的學習,我們知道對象將它的狀態存在域中。然而,Java中也使用了“變數”這個術語。在這一篇教程中,我們將會討論它們之間的關係,以及變數命名的規則和慣例,基本數據類型以及它們的預設值和字面量。 ...


一.變數

1.變數的定義

  正如上一篇教程《Java基礎教程(4)--面向對象概念》中介紹的那樣,對象將它的狀態存在域中。但是你可能仍然有一些疑問,例如:命名一個域的規則和慣例是什麼?除了int還有其他的類型嗎?域在聲明的時候必須初始化嗎?如果域沒有顯示地初始化會被賦予一個預設值嗎?在本文中我們將一一討論這些問題,但是在開始之前,需要對幾個概念進行介紹。在Java中,“域”和“變數”術語都會使用,對於初學者來說這可能有一點困惑,因為它們看起來好像說的是同一個東西。
  Java語言定義了以下幾種類型的變數:

  • 實例變數(非靜態域):從技術層面來說,對象將它們各自的狀態存在“非靜態域”中,也就是沒有使用static關鍵字修飾的域。非靜態域也被稱為實例變數,因為對於類的每個實例(換句話說,就是每個對象)來說,它們的值都是獨立的。例如,每個自行車的當前速度相對於其他自行車來說都是獨立的。
  • 類變數(靜態域):類變數是使用static關鍵字修飾的域。這告訴編譯器無論這個類有多少個實例,這個變數只有一個副本。對於一種特定的自行車來說,它的齒輪數可以被標記為static,因為這個值適用於它的每一個實例。代碼static int numGears = 6;將會創建一個靜態域。此外,可以使用關鍵字final來修飾這個域來保證它的值不會改變。
  • 局部變數:類似於對象在域中存儲其狀態,方法通常會將其臨時狀態存儲在局部變數中。聲明局部變數的語法與聲明域類似(例如,int count = 0;)。沒有特殊的關鍵字將變數標記為局部變數,這完全取決於聲明變數的位置——它位於方法的兩個大括弧之間。因此,局部變數只對聲明它們的方法可見,對於類的其他部分來說它們是不可見的。
  • 參數:你已經在HelloWorld的main方法和Bicycle類中看到過參數的應用。回想一下main方法的簽名——public static void main(String[] args)。這裡,args變數是方法的參數。需要記住的是參數屬於“變數”而不是“域”。這也適用於其他接受參數的結構(例如構造函數和異常處理),我們將陸續在後面的教程中見到它們。

  在理解了這幾個概念後,相信你對變數和域的關係有了進一步的認識。變數分為實例變數、類變數、局部變數和參數,而只有實例變數和類變數屬於域的概念。你也可能偶爾也會看到“成員”一詞,類的域,方法和嵌套類型統稱為其成員。

2.命名

  變數名是標識符的一種,它滿足標識符的規則。標識符用來給程式中需要自定義名稱的某個實體命名,例如變數、方法、類、參數等。所有的標識符都需要滿足以下的規則或慣例:

  • 標識符必須是由字母、數字、下劃線(_)、美元符號($)等Java允許作為標識符中一部分的字元組成。可以使用Character.isJavaIdentifierPart()來檢測一個字元是否被允許作為Java標識符的一部分。
  • 標識符不能以數字或其他不允許作為出現在標識符起始位置的字元開頭。可以使用Character.isJavaIdentifierStart()來檢測一個字元是否被允許作為Java標識符的第一個字元。
  • 標識符不能是關鍵字、null、true或false。
  • 標識符不限制長度。
  • 標識符應該儘可能地表達出它的作用或意義以提高程式的可讀性。建議使用駝峰法(第一個單詞首字母小寫,其餘單詞首字母大寫)來為設計標識符。如果是常量(使用final修飾的變數),那麼規則稍有變化,將每個字母大寫並用下劃線(_)分隔每個單詞。

  上面提到了關鍵字。關鍵字是編程語言中事先定義的,有特別意義的單詞。下麵是Java中的關鍵字:

  其中,const和goto關鍵字雖然已經不再使用,但是它們還是被保留了下來。true、false和null雖然被很多人誤認為是關鍵字,但實際上它們只是字面量而已
  

二.基本數據類型

1.八種基本數據類型

  Java是一門靜態語言,這意味著所有的變數在使用前必須先進行聲明。考慮以下代碼:

int gear = 6;

  上面的代碼聲明瞭一個名為gear的變數,它是整數類型,並且有一個初始值1。變數的類型決定了它所能存儲的數據的類型。除int之外,Java編程語言還支持其他七種基本數據類型。Java中的八種原始數據類型是:

  • byte:byte數據類型是8位有符號整數。它的最小值為-128(-27),最大值為127(27-1)。
  • short:short數據類型是16位有符號整數。它的最小值為-32768(-215),最大值為32767(215-1)。
  • int:int數據類型是32位有符號整數。它的最小值為-231,最大值為231-1。
  • long:long數據類型是64位有符號整數。它的最小值為-263,最大值為263-1。
  • float:float數據類型是單精度32位IEEE754浮點數(如果對浮點數的概念不瞭解,可以簡單地將它理解為小數)。它的有效位數為6~7位,不要使用它去存儲對精度要求較高的數據。
  • double:double數據類型是雙精度64位IEEE754浮點數。它的有效位數為15位。在保存浮點數時,絕大部分情況下都應該使用double類型。
  • boolean:boolean數據類型只有兩個可能的值:true和false。它一般用來表示條件的真或假。在Java中,boolean數據類型不能與其他數據類型進行相互轉換。
  • char:char數據類型是單個16位Unicode字元。它的最小值為'\u0000',最大值為'\uffff'。

char類型擴展

  要想弄清楚char類型,就必須瞭解Unicode編碼機制。Unicode打破了傳統字元編碼機制的限制。在Unicode出現之前,已經有許多不同的標準:美國的ASCII、西歐語言中的ISO8859-1、俄羅斯的KOI-8、我國的GB2312等。這樣就產生了下麵兩個問題:一是對於任意給定的編碼值,在不同的編碼方案下有可能對應不同的字母;二是採用大字元集的語言其編碼長度可能不同。例如,有些常用的字元採用單位元組編碼,而另一些字元則需要兩個或更多位元組。
  設計Unicode編碼的目的就是要解決這些問題。在20世紀80年代開始啟動設計工作時,人們認為兩個位元組的代碼寬度足以對世界上各種語言的所有字元進行編碼,並有足夠的空間留給未來擴展。在1991年發佈了Unicode 1.0,當時僅占用65536個代碼值中不到一半的部分。在設計Java時決定採用16位的字元集,這樣會比使用8位字元集的程式設計語言有很大的改進。
  十分遺憾,經過一段時間,不可避免的事情發生了。由於增加了大量的漢語、日語和韓語中的文字,Unicode字元超過了65536個,16位的char類型已經不能滿足描述所有Unicode字元的需要了。
  從JavaSE 5.0開始,碼點(code point)是指與一個編碼表中的某個字元對應的代碼值。在Unicode標準中,碼點採用十六進位書寫,並加上首碼U+,例如U+0041就是拉丁字母A的碼點。Unicode的碼點可以分成17個平面。第一個代碼級別稱為基本多語言平面,碼點從U+0000到U+FFFF;其餘的16個平面碼點從U+10000到U+10FFFF,其中包括一些輔助字元(supplementary character)。
  下麵來介紹UTF-16。UTF-16是Unicode碼的一種編碼格式。也就是說,Unicode決定了每個字元所對應的編碼的值,而UTF-16是Unicode編碼的一種書寫格式,與其類似的還有UTF-8和UTF-32。雖然這些格式的表現形式不盡相同,但他們表示的編碼是一致的,那就是Unicode編碼。UTF-16採用不同長度的編碼表示所有Unicode碼點。在Unicode中,特定長度的比特序列稱為代碼單元。例如,UTF-8的一個代碼單元的長度為8。UTF-16中16位表示一個代碼單元。UTF-16編碼的規則如下:

  1. U+0000到U+D7FF以及U+E000到U+FFFF(基本多語言平面)
    這個區間稱為基本多語言平面,包含了最常見的字元。每個字元對應的碼點使用一個代碼單元就可以表示。
  2. U+D800到U+DFFF(代理區)
    因為除基本多語言平面外,其他16個平面的碼點無法用2個位元組表示,所以Unicode標準規定,基本多語言平面內的U+D800到U+DFFF的碼點不對應於任何字元,稱為代理區。因此,UTF-16利用保留下來的0xD800-0xDFFF區段的碼位來對輔助平面的字元的碼位進行編碼。
  3. U+10000到U+10FFFF(輔助平面)
    輔助平面中的碼點都大於U+FFFF,無法用16位來表示,因此採用一對連續的代碼單元來進行編碼。具體步驟如下:
      a.碼點減去0x10000,得到的結果範圍在0x00000到0xFFFFF,使用二進位表示為yyyy yyyy yyxx xxxx xxxx;
      b.高10位的值(範圍為0x000到0x3FF),加上0xD800,得到的結果範圍在0xD800到0xDBFF,稱為高位代理,作為第一個代碼單元;
      c.低10位的值(範圍也是0x000到0x3FF),加上0xDC00,得到的結果範圍在0xDC00到0xDFFF,稱為地位代理,作為第二個代碼單元;
      d.最終的UTF-16編碼用二進位表示就是:1101 10yy yyyy yyyy 1101 11xx xxxx xxxx。

  在Java中,char類型描述了UTF-16編碼中的一個代碼單元。建議不要在程式中使用char類型,除非確實需要處理UTF-16代碼單元。

2.預設值

  在聲明一個域時,如果不對它賦值,編譯器將賦予它一個預設值。下麵是這8種基本數據類型的預設值:

  局部變數則略有不同,編譯器永遠不會為未初始化的局部變數分配預設值。如果沒有初始化局部變數,請保證在使用它之前為其賦值。訪問未初始化的局部變數將導致編譯時錯誤。

3.字面量

  你可能已經註意到在初始化基本數據類型的變數時不使用new關鍵字。基本數據類型是語言中內置的特殊數據類型,它們不是從類創建的對象。字面量(literal)是用於表達源代碼中一個固定值的表示方法。如下所示,可以將字面量分配給基本數據類型的變數:

boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;

(1)整型字面量

  整型字面量預設為int類型。可以在整數後面加上尾碼L或l來表示long類型字面量。可以使用首碼0x來表示十六進位,0來表示八進位,0b來表示二進位:

// The number 26, in decimal
int decVal = 26;
// The number 26, in hexadecimal
int hexVal = 0x1a;
// The number 26, in octal
int octVal = 032;
// The number 26, in binary
int binVal = 0b11010;

(2)浮點型字面量

  浮點型字面量預設為double類型(也可以加上D或d,不過一般省略)。可以在浮點數後面加上尾碼F或f來表示float類型字面量。
  可以使用科學計數法來表示浮點數字面量。例如,1.2345*104可以表示為1.2345E4,1.2345*10-4可以表示為1.2345E-4。E後面的數字表示10的指數,也可以使用小寫字母e。也可以使用十六進位表示浮點數。例如,3.875=(11.111)2=(3.e)16=(3e)16*2-4,那麼3.875可以表示成0x3.ep0或0x3ep-4(因為e和十六進位的15重覆,所以這裡使用p表示指數)。註意,尾數採用十六進位,指數採用十進位。指數的基數是2,而不是10。

(3)字元型字面量

  char類型的字面量值要用單引號括起來。例如,'B'是編碼值為66所對應的字元常量。它與"B"不同,"B"是一個包含字元B的字元串。char類型的值可以表示為十六進位值,但需要加上首碼\u,其範圍從\u0000~\uFFFF。例如,\u03C0表示圓周率符號π。
  除了轉義序列\u外,還有一些用於表示特殊字元的轉義序列,如下表:

  所有這些轉義序列都可以出現在字元字面量或字元串中。例如'\u2018'或"Hello\n"。轉義序列\u還可以出現在字元字面量或字元串之外,而其他轉義序列就不可以。例如

public static void main(String\u005B\u005D args)

就完全符合語法,\u005B和\u005D是[和]的編碼。但要註意的是,轉義序列\u會在編譯代碼前得到處理。例如,"\u0022+\u0022"並不是一個由雙引號包圍加號組成的字元串。實際上,\u0022會在編譯代碼之前替換為",這個字元串會變成""+"",也就是一個空串。更隱蔽的,一定要註意註釋中的\u,註釋

// Unicode \u000A is a new line

會產生一個語法錯誤,因為\u000A會被替換成換行符,也就是說,上面的註釋會變成下麵這樣:

// Unicode 
is a new line

類似地,下麵的註釋也會產生語法錯誤:

// Look inside c:\users

因為\u後面並沒有跟著一個十六進位數。

(4)在數字字面量中使用下劃線

  在JavaSE7及之後的版本中,任意個數的下劃線(_)可以出現在數字字面量中的任意兩個數字之間。這個功能可以提高數字字面量的可讀性,類似於使用逗號或空格等標點符號將每三個數字分為一組的形式。

long creditCardNumber = 1234_5678_9012_3456L; 
long socialSecurityNumber = 999_99_9999L; 
float pi = 3.14_15F; 
long hexBytes = 0xFF_EC_DE_5E; 
long hexWords = 0xCAFE_BABE; 
long maxLong = 0x7fff_ffff_ffff_ffffL; 
byte nybbles = 0b0010_0101; 
long bytes = 0b11010010_01101001_10010100_10010010;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Comparable介面 這個介面顧名思義就是用於排序的,如果要對某些對象進行排序,那麼該對象所在的類必須實現 Comparabld介面。Comparable介面只有一個方法CompareTo(),這個方法可以看做是指定的排序規則。 內置類已經實現了CompareTo方法,例如long 小於返回 ...
  • 關於出現 idclass mapping 運行錯誤 @IdClass 註釋通常用於定義包含複合鍵id的Class。即多個屬性的關鍵複合。 @IdClass(CountrylanguageEntityPK.class) 則CountrylanguageEntityPK如下所示: 使用註解 @IdCla ...
  • 題目: Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would sta ...
  • 8、redis集群怎麼做 1、Redis集群提供了以下兩個好處1、將數據自動切分(split)到多個節點2、當集群中的某一個節點故障時,redis還可以繼續處理客戶端的請求。2、集群的方案: redis-cluster集群,採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接 ...
  • 主要內容來自中文版的同名教程 "Go語言之旅" 其目的為總結要點 包,函數和變數 包 import 語法,多個用括弧換行擴起,包之間不需要間隔符,用引號引起 go import ( "fmt" "math/rand" ) // 官方認為分組導入比多個導入更好 // 用 引用包內對象,僅有首字母大寫的 ...
  • 引言 - 一切才剛剛開始 structc 是 C 結構基礎庫. 簡單有態度. structc - https://github.com/wangzhione/structc 之前推過幾次 structc, 沒什麼效果. 這次乘著最近加班不多, 來詳細解說哈 structc 的思考初衷. 0.0 整體 ...
  • 示例: 什麼是對象  《JAVA編程思想》對於對象的定義是:將問題空間中的元素以及它們在方案空間的表示物稱作“對象”。  1. 問題空間:實際解決的問題模型;  2. 方案空間: 電腦(機器模型)。  實際的問題在電腦(機器模型)中的表示稱為對象。在上面示 ...
  • [TOC] Dubbo入門 Editor:SimpleWu Dubbo是 阿裡巴巴公司開源的一個高性能優秀的服務框架使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。 背景 隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...