數據類型
在聲明變量或常量時會用到數據類型,在前面已經用到一些數據類型,例如 int、double 和 String 等。Java 語言的數據類型分為:八種基本類型和三種引用類型(數組, class, interface)。
整數類型
- 整型分為 long、int、short 和 byte 四種類型
- 默認為int, byte、short、int和 long ,它們之間的區別僅僅是寬度和范圍的不同。
- 默認使用 int 就夠了, 除非預期會出現大于該數值的情況使用 long 類型。
- 若存在 int 轉 long 類型的情況, 建議添加后綴 L, 而不是使用易和數字 1 混淆的小寫字母 l。
- Java中整數都是有符號。
short 的范圍 2字節 -32,768 到 32,767
int 4字節 -2,147,483,648 到 2,147,483,647
long 8字節 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
為方便查看數值類型的最大和最小值, Java 提供了對應了靜態成員變量. Integer.MAX_VALUE(2147483647 21億4748萬) 和 Integer.MIN_VALUE(-2147483648)
整數的存儲格式
正數和負數
– 將最高位作為符號位:0表示正數,1表示負數
– 有符號格式、無符號格式的區分
采用定長存儲
- 8 位(1字節): 無符號表示 0 ~ 255 也可以表示為00000000~11111111
- 16 位(2字節):無符號表示 0 ~ 65535
- 32 位(4字節):無符號表示 0~4294967295 最大值約為 42 億
編寫程序時應根據所處理數據可能的取值范圍合理地選擇存儲位數
負數的二進制表示就是對應的正數的補碼表示。負整數為什么要采用這種奇怪的表示形式呢?原因是,只有這種形式,計算機才能實現正確的加減法。
理解了二進制加減法,我們就能理解為什么正數的運算結果可能出現負數了。當計算結果超出表示范圍的時候,最高位往往是1,然后就會被看作負數。比如,127+1。計算結果超出了byte的表示范圍,會被看作-128。
實型(小數類型 / 浮點型)
存儲格式
浮點格式采用 階碼 + 尾碼 的方式。
- 浮點型常量后面加后綴修飾, Float 類型以 F/f 結尾,double 類型以 D/d 結尾。
- 如果浮點常量不帶后綴,則默認為雙精度常量
二進制中為表示小數,也采用類似的科學表示法,形如m× (2^e)。m稱為尾數,e稱為指數。指數可以為正,也可以為負,負的指數表示那些接近0的比較小的數。在二進制中,單獨表示尾數部分和指數部分,另外還有一個符號位表示正負。幾乎所有的硬件和編程語言表示小數的二進制格式都是一樣的。這種格式是一個標準,叫做IEEE 754標準,它定義了兩種格式:一種是32位的,對應于 Java 的 foat;另一種是64位的,對應于 Java的double。
32 位格式中,1 位表示符號,23 位表示尾數,8 位表示指數。64 位格式中,1位表示符號,52 位表示尾數,11 位表示指數。在兩種格式中,除了表示正常的數,標準還規定了一些特殊的二進制形式表示一些特殊的值,比如負無窮、正無窮、0、NaN(非數值,比如0乘以無窮大)。IEEE 754 標準有一些復雜的細節,初次看上去難以理解,對于日常應用也不常用。
1、Float:比特數為32,數值范圍為 -3.4E+38 ~ 3.4E+38
2、Double:比特數為64,數值范圍為 -1.7E-308~1.7E+308
// 三者都是一回事
double d = 1.23; // 浮點型常量默認為 double 類型
double d = 1.23d;
double d = 1.23D;
無論是使用 float 還是 double,進行運算時都會出現一些非常令人困惑的現象,比如0.1f * 0.1的結果看上去應該是0.01,但實際上,屏幕輸出卻是0.010000001,后面多了個1。
二進制是類似的,但二進制只能表示那些可以表述為 2 的多少次方和的數。為什么計算機中不能用我們熟悉的十進制呢?在最底層,計算機使用的電子元器件只能表示兩個狀態,通常是低壓和高壓,對應 0和1,使用二進制容易基于這些電子元器件構建硬件設備和進行運算。如果非要使用十進制,則這些硬件就會復雜很多,并且效率低下。
計算不精確,怎么辦呢?大部分情況下,我們不需要那么高的精度,可以四舍五入,或者在輸出的時候只保留固定個數的小數位。如果真的需要比較高的精度,一種方法是將小數轉化為整數進行運算,運算結束后再轉化為小數;另一種方法是使用十進制的數據類型,這個并沒有統一的規范。在Java中是BigDecimal,運算更準確,但效率比較低。
數字表示方式
進制數字表示
Java中對整型數據的表示有以下三種形式:
- 二進制:數據以0b
或0B
開頭(jdk 1.7新增)。
- 八進制:數據以0
開頭,例如:054
,012
- 十六進制:數據以0x
或0X
開頭,例如:0x11
,0xAD00
二進制寫起來太長,為了簡化寫法,可以將 4 個二進制位簡化為一個0~15的數, 10~15用字符A~F表示,這種表示方法稱為十六進制。
指數表示
進行數學計算時往往會用到指數表示的數值。如果采用十進制表示指數,需要使用大寫或小寫的 e 表示冪。
System.out.println(1e2);// 100.0
System.out.println(1e+2);// 100.0
System.out.println(1e-2);// 0.01
System.out.println(1E+1);// 10.0
在使用十六進制數的時候也是可以使用科學計數法,只是此種用法用得不多
// 表示十六進制12 乘以 (2 的 2次方) = 18 * 4 = 72
System.out.println(0x12P2);
在 Java SE 7 中,還支持以下劃線作為分隔符聯接的數值表示方式, 但是下劃線不能放在首尾的位置
輸出樣例
System.out.println(123_456);
System.out.println(0B1111_1111);
System.out.println(3.141_592F);
字符類型
- Java中 char 聲明字符類型
- 必須用單引號括起來的單個字符
- 雙字節國際統一標準 Unicode 編碼,占兩個字節(16位),因而可用十六進制(無符號的)編碼形式表示, 所以'A'字符也可以用 Unicode 編碼'\u0041'表示
提示 字符類型也屬于是數值類型,可以與int等數值類型進行數學計算或進行轉換。這是因為字符類型在計算機中保存的是 Unicode編碼,雙字節Unicode 的字符范圍:\u0000(即為 0)到 \uffff(即為 65,535)
在 Java中,為了表示一些特殊字符,前面要加上反斜杠(\),這稱為字符轉義。
特殊字符
\u3000
表示一個中文空格。
布爾類型
在Java語言中聲明布爾類型的關鍵字是 boolean,只有兩個值:true 和 false。
數值類型相互轉換
自動類型轉換
自動類型轉換就是需要類型之間轉換是自動的,不需要采取其他手段,總的原則是小范圍數據類型可以自動轉換為大范圍數據類型,列類型轉換順序如圖所示,從左到右是自動。
注意 如圖所示,char 類型比較特殊,char 自動轉換為 int、long、float和 double,但 byte 和 short 不能自動轉換為char,而且 char 也不能自動轉換為 byte 或 short。
char 和 int 的碼值對應
a 97 ~ z 122
A 65 ~ Z 90
0 48 ~ 9 57
// 字符 轉 int 屬于自動升位, 不需要強轉
int c = 'a';
// 輸出'A'
System.out.println((char)(c - 32));
強制類型轉換
在數值類型轉換過程中,除了需要自動類型轉換外,有時還需要強制類型轉換,強制類型轉換是在變量或常量之前加上“(目標類型)”實現。
變量
變量和常量是構成表達式的重要部分,變量所代表的內部是可以被修改的。
- 一定要注意變量屬于哪個類型和它的取值范圍
- 強制類型轉換(小能默認轉大,大轉小要用強轉)
- 強轉可以取某個實數的整數部分(int a = (int)12.34)
成員變量
- 定義在類中,在整個類中都可以被訪問。
- 成員變量隨著對象的建立而建立,存在于對象所在的堆內存中。
- 成員變量有默認初始化值。
靜態成員變量(類變量)
在定義 class 時,作為成員變量且加了static 關鍵字。
局部變量(自動變量) :
- 局部變量只定義在局部范圍內,如:方法內,語句內等。
- 局部變量存在于棧內存中。
- 作用的范圍結束,變量空間會自動釋放。
- 局部變量沒有默認初始化值
- 在方法體內可以定義本方法所使用的變量,這種變量是局部變量,它的生存期與作用域是在本方法內。
- 方法體內定義變量時,變量前不能加修飾符。
- 局部變量在使用前必須明確賦值,因為它沒有默認值,否則編譯時會出錯。
- 在語句塊中定義的變量它只在語句塊中有效;
- 方法參數:作用域是整個方法.
- 異常處理參數: catch跟隨的異常處理塊.
變量的作用域總結
變量的作用域也稱變量的有效范圍,它是程序的一個區域,變量在其作用域內可以通過它的名字來引用。作用域也決定系統什么時候為變量創建和清除內存。根據變量在程序聲明的位置,可以將變量分為4類情形。
- 成員變量 / 類變量(靜態成員變量)
成員變量可添加修飾符,包括訪問權限修飾符public
、private
、protected
和非訪問權限修飾符static
、final
、native
等。 - 如果沒有給對象屬性賦初值,則對象屬性的初始值由相應數據類型的默認值決定,如數值型數據的默認值為0,boolean的默認值為 false,字符串的默認值為 null。成員變量的作用域是在類的范圍。
成員變量和靜態成員變量(類變量)的區別
- 兩個變量的生命周期不同。
成員變量隨著對象的創建而存在,隨著對象的被回收而釋放。
靜態變量隨著類的加載而存在,隨著類的消失而消失。 - 調用方式不同。
- 成員變量只能被對象調用。
- 靜態變量可以被對象調用,還可以被類名調用。
- 數據存儲位置不同。
- 成員變量數據存儲在堆內存的對象中,所以也叫對象的特有數據
- 靜態變量數據存儲在方法區(共享數據區)的靜態區,所以也叫對象的共享數據.
常量
常量事實上是那些內容不能被修改的變量,常量與變量類似也需要初始化,即在聲明常量的同時要賦予一個初始值。常量一旦初始化就不可以被修改。它的聲明格式為:final 數據類型 變量名 = 初始值;
常量和變量的命名規范
Java 編碼規范命名方法采用駝峰法,下面分類說明一下。
- 包名:包名是全小寫字母,中間可以由點分隔開。作為命名空間,包名應該具有唯一性,推薦采用公司或組織域名的倒置,如com.apple.quicktime.v2。但Java核心庫包名不采用域名的倒置命名,如java.awt.event。
- 類和接口名:采用大駝峰法,如 SplitViewController。
- 文件名:采用大駝峰法,如 BlockOperation.java。
- 變量:采用小駝峰法,如 studentNumber。
- 常量名:全大寫,如果是由多個單詞構成,可以用下劃線隔開,如 YEAR 和WEEK_OF_MONTH。
- 方法名:采用小駝峰法,如 balanceAccount、isButtonPressed 等。
參考
丁振凡編著,《Java 語言程序設計(第2版)》華東交大版
免費公開課_傳智播客和黑馬程序員免費公開課
http://yun.itheima.com/openJava從小白到大牛-圖書-圖靈社區
http://www.ituring.com.cn/book/2480Java 編程的邏輯-微信讀書
https://weread.qq.com/web/reader/b51320f05e159eb51b29226kc81322c012c81e728d9d180