首頁> Java> java教程> 主體

Java基本資料型態圖文程式碼詳解(動力節點整理)

黄舟
發布: 2017-04-01 10:27:06
原創
1984 人瀏覽過

Java資料型別(type)可以分為兩大類:基本型別(primitive types)和引用型別(reference types)。以下是動力節點給大家整理java基本資料型別相關知識,有興趣的朋友一起學習吧

1. 資料型態:

在Java原始碼中,每個變數都必須宣告一種類型(type)。 Java資料型別(type)可以分為兩大類:基本型別(primitive types)和引用型別(reference types)。 primitive types 包含boolean型別以及數值型別(numeric types)。 numeric types又分為整型(integer types)和浮點型(floating-point type)。整數型有5種:byte short int long char(char本質上是一種特殊的int)。浮點型別有float和double。關係整理一下如下圖:

2. 基本型別:

Java為基本類型提供語言層級的支持,即已經在Java中預先定義,並以對應的保留關鍵字表示。基本型別是單一值,而不是複雜的物件,基本型別不是物件導向的,主要出去效率的考慮,但是同時也提供基本型別的物件版本,也就是基本類型的包裝器(wrapper)。可以直接使用這些基本類型,也可以使用基本類型建構陣列或其他自訂類型。基本型別具有明確的取值範圍和數學行為

2.1 整數

整數型有byte short int long char,分別以8、16、32、64、16bits表示。有些地方可能不會把char列入整數範疇,但本質上char型別是int的子集。整數型的寬度不應該被看成整數所佔用的記憶體空間大小,而應理解成定義為整數的變數或表達式的行為。 JVM可以自由使用它們希望的、任何大小的記憶體空間,只要類型的行為符合規範。 byte short int long都是有符號的,用2的補碼(two‘s-complement)表示。而char用16位元表示,它是無符號的,表示的是UTF-16編碼集。

2.1.1 byte

byte由1個位元組8位元表示,是最小的整數型別。主要用於節省記憶體空間關鍵。當操作來自網路、檔案或其他IO的資料流時,byte類型特別有用。取值範圍為:[-128, 127]. byte的預設值為(byte)0,如果我們試圖將取值範圍外的值賦給byte類型變量,則會出現編譯錯誤,例如byte b = 128;這個語句是無法通過編譯的。一個有趣的問題,如果我們有個方法: public void test(byte b)。試圖這麼調用這個方法是錯誤的: test(0); 編譯器會報錯,類型不相容! ! !我們記得byte b =0;這是完全沒有問題的,為什麼在這裡會出錯啦?

這裡涉及到一個叫字面值(literal)的問題,字面值就是表面上的值,例如整數字面值在原始碼中就是諸如 5 , 0, -200這樣的。如果整數子麵子後面加上L或l,則這個字面值就是long類型,例如:1000L代表一個long類型的值。如果不加L或l,則為int型別。基本類型當中的byte short int long都可以透過不加L的整數字面值(我們就稱作int字面值吧)來創建,例如byte b = 100; short s = 5;對於long類型,如果大小超出int所能表示的範圍(32 bits),則必須使用L結尾來表示。整數字面值可以有不同的表示方式:16進位【0X or 0x】、10進位【nothing】、八進位【0】2進位【0B or 0b】等,二進位字面值是JDK 7以後才有的功能。在賦值運算中,int字面值可以賦給byte short int long,Java語言會自動處理好這個過程。如果方法調用時不一樣,調用test(0)的時候,它能匹配的方法是test(int),當然不能匹配test(byte)方法,至於為什麼Java沒有像支持賦值操作那樣支持方法調用,不得而知。注意區別包裝器與原始類型的自動轉換(anto-boxing,auto-unboxing)。 byte d = 'A';也是合法的,字元字面值可以自動轉換成16位元的整數。
對byte型別進行數學運算時,會自動提升為int型別,如果表達式中有double或float等型別,也是自動提升。所以下面的程式碼是錯誤的:

byte s2 = 'a'; byte sum = s1 + s2;//should cast by (byte)
登入後複製

2.1.2 short

用16為表示,取值範圍為:[- 2^15, 2^15 - 1]。 short可能是最不常用的類型了。可以透過整數字面值或字元字面值賦值,前提是不超出範圍(16 bit)。 short型別參與運算的時候,一樣被提升為int或更高的型別。 (順序為byte short int long float double).

2.1.3 int

32 bits, [- 2^31, 2^31 - 1 ].有符號的二進位補碼表示的整數。常用語控制循環,注意byte 和 short在運算中會被提升為int型別或更高。 Java 8以後,可以使用int型別表示無符號32位元整數[ 0, 2^31 - 1]。

2.1.4 long

#64 bits, [- 2^63, 2^63 - 1,預設值為0L].當需要計算非常大的數字時,如果int不足以容納大小,可以使用long型別。如果long也不夠,可以使用BigInteger類別。

2.1.5 char

#16 bits, [0, 65535], [0, 2^16 -1],從'\ u0000'到'\uffff'。無符號,預設值為'\u0000'。 Java使用Unicode字符集表示字符,Unicode是完全國際化的字符集,可以表示人類語言中的全部字符。 Unicode需要16位元寬,所以Java中的char類型也使用16 bit表示。 賦值可能是這樣的:

char ch1 = 88; char ch2 = 'A';
登入後複製

ASCII字元集佔用了Unicode的前127個值。之所以把char歸入整型,是因為Java為char提供算術運算支持,例如可以ch2++;之後ch2就變成Y。當char進行加減乘除運算的時候,也被轉換成int型,必須明確轉換回來。

2.2 浮點類型

包含單精度的float和雙精度的double,分別以32、64bits表示,遵循IEEE 754規範。

2.2.1 float

使用32 bit表示,對應單精度浮點數,運行速度相比double更快,佔記憶體更小,但是當數值非常大或非常小的時候會變得不精確。精度要求不高的時候可以使用float型,宣告賦值範例:

f1 = 10L; f1 = 10.0f; //f1 = 10.0;默认为double
登入後複製

可以將byte、short、int、long、char賦給float型,java自動完成轉換。

2.2.2 double

64為表示,將浮點子麵子賦給某個變數時,如果不顯示在字面值後面加f或F,則預設為double類型。 java.lang.Math中的函數都採用double型別。

如果double和float都無法達到想要的精確度,可以使用BigDecimal類別。

2.3 boolean型別

boolean型別只有兩個值true和false,預設為false。 boolean與是否為0沒有任何關係,但可以依照想要的邏輯進行轉換。許多地方都需要用到boolean型別。

3. 字面上值

在Java原始程式碼中,字面上值用來表示固定的值(fixed value)。數值型的字面值是最常見的,字串字面值可以算是一種,當然也可以把特殊的null當成字面值。字面值大體上可以分為整型字面值、浮點字面值、字元和字串字面值、特殊字面值。

3.1. 整型字面值

从形式上看是整数的字面值归类为整型字面值。例如: 10, 100000L, 'B'、0XFF这些都可以称为字面值。整型字面值可以用十进制、16、8、2进制来表示。十进制很简单,2、8、16进制的表示分别在最前面加上0B(0b)、0、0X(0x)即可,当然基数不能超出进制的范围,比如09是不合法的,八进制的基数只能到7。一般情况下,字面值创建的是int类型,但是int字面值可以赋值给byte short char long int,只要字面值在目标范围以内,Java会自动完成转换,如果试图将超出范围的字面值赋给某一类型(比如把128赋给byte类型),编译通不过。而如果想创建一个int类型无法表示的long类型,则需要在字面值最后面加上L或者l。通常建议使用容易区分的L。所以整型字面值包括int字面值和long字面值两种。

3.2. 浮点字面值

浮点字面值简单的理解可以理解为小数。分为float字面值和double字面值,如果在小数后面加上F或者f,则表示这是个float字面值,如11.8F。如果小数后面不加F(f),如10.4。或者小数后面加上D(d),则表示这是个double字面值。另外,浮点字面值支持科学技术法表示。下面是一些例子:

double d2 = 11.4; double d3 = 1.23E3; double d4 = 10D; double d5 = 0.4D; float f1 = 10; float f2 = 11.1F; float f3 = 1.23e-4F; float f4 = 1.23E0F;
登入後複製

3.3 字符及字符串字面值

Java中字符字面值用单引号括起来,如‘@'‘1'。所有的UTF-16字符集都包含在字符字面值中。不能直接输入的字符,可以使用转义字符,如‘\n'为换行字符。也可以使用八进制或者十六进制表示字符,八进制使用反斜杠加3位数字表示,例如'\141'表示字母a。十六进制使用\u加上4为十六进制的数表示,如'\u0061'表示字符a。也就是说,通过使用转义字符,可以表示键盘上的有的或者没有的所有字符。常见的转义字符序列有:

\ddd(八进制) 、 \uxxxx(十六进制Unicode字符)、\'(单引号)、\"(双引号)、\\ (反斜杠)\r(回车符) \n(换行符) \f(换页符) \t(制表符) \b(回格符)

字符串字面值则使用双引号,字符串字面值中同样可以包含字符字面值中的转义字符序列。字符串必须位于同一行或者使用+运算符,因为java没有续行转义序列。

3.4 特殊字面值

null是一种特殊的类型(type),可以将它赋给任何引用类型变量,表示这个变量不引用任何东西。如果一个引用类型变量为null,表示这个变量不可用。

还有一种特殊的class literal,用type name加上.class表示,例如String.class。首先,String是类Class(java.lang.Class)的一个实例(对象),而"This is a string"是类String的一个对象。然后,class literal用于表示类Class的一个对象,比如String.class用于表示类Class的对象String。简单地说,类子面子(class literal)就是诸如String.class 、Integer.class这样的字面值,它所表示的就是累String、类Integer。如果输出Integer.class,你会得到class java.lang.Integer。List.class的输出为interface java.util.List。总之,class literal用于表示类型本身!

3.5 在数值型字面值中使用下划线。

JDK7开始,可以在数值型字面值(包括整型字面值和浮点字面值)插入一个或者多个下划线。但是下划线只能用于分隔数字,不能分隔字符与字符,也不能分隔字符与数字。例如 int x = 123_456_789.在编译的时候,下划线会自动去掉。可以连续使用下划线,比如float f = 1.22_3344.二进制或者十六进制的字面值也可以使用下划线,记住一点,下划线只能用于数字与数字之间,初次以外都是非法的。例如1._23是非法的,_123、11000_L都是非法的。

4. 基本类型之间的转换

我们看到,将一种类型的值赋给另一种类型是很常见的。在Java中,boolean类型与所有其他7种类型都不能进行转换,这一点很明确。对于其他7中数值类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化。转换分为自动转换和强制转换。对于自动转换(隐式),无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。首先将7种类型按下面顺序排列一下:

byte <(short=char)< int < long < float < double
登入後複製

如果从小转换到大,可以自动完成,而从大到小,必须强制转换。short和char两种相同类型也必须强制转换。

4.1 自动转换

自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。注意区别,此时从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。

》int--> float 》long--> float 》long--> double 》float -->double without strictfp
登入後複製

除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。

4.2 强制类型转换

如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于narrowing conversion),因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。强制转换格式如下:

byte b; b = (byte)a;//1
登入後複製

如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200.

将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。

7种基本类型转换总结如下图:

4.3 赋值及表达式中的类型转换:

4.3.1 字面值赋值

在使用字面值对整数赋值的过程中,可以将int literal赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long literal赋给byte,即使没有超出范围,也必须进行强制类型转换。例如 byte b = 10L;是错的,要进行强制转换。

4.3.2 表达式中的自动类型提升

除了赋值以外,表达式计算过程中也可能发生一些类型转换。在表达式中,类型提升规则如下:

》所有byte/short/char都被提升为int。

》如果有一个操作数为long,整个表达式提升为long。float和double情况也一样。

以上是Java基本資料型態圖文程式碼詳解(動力節點整理)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!