??數(shù)據(jù)類型
在Java中數(shù)據(jù)類型主要分為兩類:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。本文來介紹基本數(shù)據(jù)類型。
基本數(shù)據(jù)類型有:整型、浮點型、字符型以及布爾型
(這看起來和C語言一樣,還挺親切的)
??整型
Java中的整型有:byte,short,int,long
與C語言相比,short和int沒啥變化。
有變化的點在于,多了一個byte,叫做字節(jié)型,它占一個字節(jié),很像C語言中的char,它的范圍也是從-128~127
。(待會下面會對這個范圍作一些說明)
同時我們不難發(fā)現(xiàn),Java沒有l(wèi)ong long,因為它的long(長整型)的大小就是8個字節(jié)了,不像C語言的long有時是4個字節(jié),而有時是8。這也正引出一個重要的點:Java的數(shù)據(jù)類型在32位和64位環(huán)境下的大小都是一樣的,這保證了在不同平臺的可移植性。
??byte的范圍
(其實我之前學C語言的時候char的取值范圍沒有完全弄懂hhh)
我們以前學過:數(shù)據(jù)在內(nèi)存中的存儲是補碼。數(shù)據(jù)的二進制序列中最高位是符號位。因為C語言和Java只是語言不同而已,所以它們在數(shù)據(jù)存儲方面其實是大同小異的。
Java中的基本數(shù)據(jù)類型沒有“無符號”這一概念,也就是說都是有符號的,必定有符號位。
先來看正數(shù)的情況,易知只要數(shù)值位都是1就可以取到最大值127。
負數(shù)的情況有點小復雜,按理來說負數(shù)最小值是-127,即11111111。至于-128,其實是人為規(guī)定的,怎么規(guī)定呢?127的源碼和1的源碼相加就是1000 0000,規(guī)定這個數(shù)就是-128(就最高位的1同時作為數(shù)值位和符號位這樣子)
然后還有兩件事:
第一,我們判定一個數(shù)的大?。ㄟ@里指的是十進制大?。┛梢钥丛创a,也可以看補碼,但是看源碼會比較直觀,因為你可以直接算出來。
第二,計算機中各種運算主要是以補碼
參與運算。
??浮點型
Java浮點型也是float和double。float大小為4個字節(jié)
;double為8個字節(jié)
。
我們在寫代碼的時候如果寫
float a = 0.5;
那編譯器會報錯
,因為Java中浮點數(shù)默認是double類型的,而a是float,自然報錯了(而C語言就不會這樣,這也體現(xiàn)了Java的嚴謹)。如果你要讓a就是float類型的話,就在后面加個f:
float a = 0.5f;
??浮點數(shù)相關(guān)運算
這部分的規(guī)則也是和C語言的差不多,在此不多贅述(其實是我懶得寫 )。但仍要補充一些要點:
①對于整型的除法運算,若想轉(zhuǎn)化為浮點數(shù)的除法運算,則
在分子or分母乘0.1
就ok了。
②Java中的小數(shù)并沒有精確的位數(shù),哪怕你在初始化一個浮點數(shù)變量時給它一個有限位數(shù)的初始值,比如float a = 1.1,是兩位小數(shù),但是你去打印a*a,會發(fā)現(xiàn)結(jié)果不是1.21。
??字符類型
計算機中的字符本質(zhì)上是一個整數(shù)。 C 語言中使用 ASCII 表示字符,而 Java 中使用 Unicode 表示字符。因此一個字符占用兩個字節(jié),表示的字符種類更多,包括中文。
char c1 = 'A'; // 大寫字母
char c2 = '1'; // 數(shù)字字符
System.out.println(c1);
System.out.println(c2);
char c3 = '帥';
System.out.println(c3);
這里先簡單介紹一下,后續(xù)會有專門的章節(jié)來講字符和字符串的。
??布爾類型
布爾類型(boolean)常用來表示真假,它只有兩種取值,true 表示真,false 表示假。
Java 的 boolean 類型和 int 不能相互轉(zhuǎn)換,不存在1表示 true,0表示false這樣的用法?。?!
然后值得注意的是,Java虛擬機規(guī)范中,并沒有明確規(guī)定boolean占幾個字節(jié)。
??類型轉(zhuǎn)換
(Java 作為一門強類型編程語言,當不同類型之間的變量相互賦值的時候,會有比較嚴格的校驗。)
在Java中,當參與運算數(shù)據(jù)類型不一致時,就會進行類型轉(zhuǎn)換。Java中類型轉(zhuǎn)換主要分為兩類:自動類型轉(zhuǎn)換(隱式)
和強制類型轉(zhuǎn)換(顯式)
。
??自動類型轉(zhuǎn)換(隱式)
代碼不需要經(jīng)過任何處理,在代碼編譯時,編譯器會自動進行處理。
特點:數(shù)據(jù)范圍小的
轉(zhuǎn)為數(shù)據(jù)范圍大的
時會自動進行。
int a = 100;
long b = 10L;
b = a; // a和b都是整形,a的范圍小,b的范圍大,當將a賦值給b時,編譯器會自動將a提升為long類型,然后賦值
a = b; // 編譯報錯,long的范圍比int范圍大,會有數(shù)據(jù)丟失,不安全
?然后不知道你有沒有發(fā)現(xiàn)這樣一個問題,為啥我把byte或short賦為整型值的時候編譯器不會報錯呢?比如byte = 11; short = 20。
因為Java規(guī)定:對于byte,short這兩種大小小于4個字節(jié)的類型,你對這兩種類型的變量進行賦值的時候,只要
賦的值的大小不超過這個類型的范圍
,那么這個值就不會被解析為整型
。
比如byte a = 300,因為300已經(jīng)超過byte的范圍,那么此時300就會被當做整型,就會報錯了。
??強制類型轉(zhuǎn)換(顯式)
這個和C語言的差不多,打個比方,強制類型轉(zhuǎn)換就像你現(xiàn)在有一條2米的桿子,你要放進一個1米長的箱子,就只能把它砍短咯。舉一些例子讓你回憶一下:
int a = 10;
long b = 100L;
b = a; // int-->long,數(shù)據(jù)范圍由小到大,隱式轉(zhuǎn)換
a = (int)b; // long-->int, 數(shù)據(jù)范圍由大到小,需要強轉(zhuǎn),否則編譯失敗
float f = 3.14F;
double d = 5.12;
d = f; // float-->double,數(shù)據(jù)范圍由小到大,隱式轉(zhuǎn)換
f = (float)d; // double-->float, 數(shù)據(jù)范圍由大到小,需要強轉(zhuǎn),否則編譯失敗
a = d; // 報錯,類型不兼容
a = (int)d; // int沒有double表示的數(shù)據(jù)范圍大,需要強轉(zhuǎn),小數(shù)點之后全部丟棄
byte b1 = 100; // 100默認為int,沒有超過byte范圍,隱式轉(zhuǎn)換
byte b2 = (byte)257; // 257默認為int,超過byte范圍,需要顯示轉(zhuǎn)換,否則報錯
boolean flag = true;
a = flag; // 編譯失?。侯愋筒患嫒?flag = a; // 編譯失?。侯愋筒患嫒?
總結(jié)一下就是:
- 不同數(shù)字類型的變量之間賦值, 表示范圍更小的類型能隱式轉(zhuǎn)換成范圍較大的類型
- 如果需要把范圍大的類型賦值給范圍小的, 需要強制類型轉(zhuǎn)換, 但是可能精度丟失
- 將一個字面值常量進行賦值的時候, Java 會自動針對數(shù)字范圍進行檢查
- 強制類型轉(zhuǎn)換不一定能成功,不相干的類型不能互相轉(zhuǎn)換
??類型提升
不同類型的數(shù)據(jù)之間相互運算時,數(shù)據(jù)類型小
的會被提升到數(shù)據(jù)類型大
的。
①int與long之間:int會被提升為long
int a = 10;
long b = 20;
int c = a + b; // 編譯出錯: a + b==>int + long--> long + long 賦值給int時會丟失數(shù)據(jù)
long d = a + b; // 編譯成功:a + b==>int + long--->long + long 賦值給long
第三行代碼中,a類型提升之后變?yōu)閘ong類型,此時long+long結(jié)果為long,不能用int類型接收。
②byte與byte的運算
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
這段代碼編譯也會報錯,a和b雖然都是byte,但是計算 a + b 會先將 a和b 都提升成 int,再進行計算,得到的結(jié)果也是 int,此時賦給c,就會出錯。
byte和short這種低于4個字節(jié)的類型,會先提升成 int,再參與計算。
原因:計算機的 CPU 通常是按照4個字節(jié)為單位從內(nèi)存中讀寫數(shù)據(jù),為了硬件上實現(xiàn)方便,所以在計算時把它們給提升了。文章來源:http://www.zghlxwxcb.cn/news/detail-713457.html
??寫在最后
如果你覺得本文寫得還不錯,不妨點贊收藏關(guān)注三連唄!
如果發(fā)現(xiàn)本文有不足或不妥之處,歡迎指出,我將第一時間改正。文章來源地址http://www.zghlxwxcb.cn/news/detail-713457.html
到了這里,關(guān)于Java的數(shù)據(jù)類型與變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!