日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java中类型转换的造型_Java总结篇系列:类型转换/造型

發(fā)布時間:2023/12/9 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中类型转换的造型_Java总结篇系列:类型转换/造型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Java中,經(jīng)常可以遇到類型轉(zhuǎn)換的場景,從變量的定義到復(fù)制、數(shù)值變量的計(jì)算到方法的參數(shù)傳遞、基類與派生類間的造型等,隨處可見類型轉(zhuǎn)換的身影。Java中的類型轉(zhuǎn)換在Java編碼中具有重要的作用。

首先,來了解下數(shù)據(jù)類型的基本理解:數(shù)據(jù)是用來描述數(shù)據(jù)的種類,包括其值和基于其值基礎(chǔ)上的可進(jìn)行的操作集合。

Java中數(shù)據(jù)類型主要分為兩大類:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。

基本數(shù)據(jù)類型共有8種,分別是:布爾型boolean, 字符型char和數(shù)值型byte/short/int/long/float/double。由于字符型char所表示的單個字符與Ascii碼中相應(yīng)整形對應(yīng),因此,有時也將其劃分到數(shù)值型中。引用類型具體可分為:數(shù)組、類和接口。因此,本文中Java類型轉(zhuǎn)換的總結(jié)也將分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩個方面展開。

一、基本數(shù)據(jù)類型的類型轉(zhuǎn)換

基本數(shù)據(jù)類型中,布爾類型boolean占有一個字節(jié),由于其本身所代碼的特殊含義,boolean類型與其他基本類型不能進(jìn)行類型的轉(zhuǎn)換(既不能進(jìn)行自動類型的提升,也不能強(qiáng)制類型轉(zhuǎn)換), 否則,將編譯出錯。

1.基本數(shù)據(jù)類型中數(shù)值類型的自動類型提升

數(shù)值類型在內(nèi)存中直接存儲其本身的值,對于不同的數(shù)值類型,內(nèi)存中會分配相應(yīng)的大小去存儲。如:byte類型的變量占用8位,int類型變量占用32位等。相應(yīng)的,不同的數(shù)值類型會有與其存儲空間相匹配的取值范圍。具體如下所示:

圖中依次表示了各數(shù)值類型的字節(jié)數(shù)和相應(yīng)的取值范圍。在Java中,整數(shù)類型(byte/short/int/long)中,對于未聲明數(shù)據(jù)類型的整形,其默認(rèn)類型為int型。在浮點(diǎn)類型(float/double)中,對于未聲明數(shù)據(jù)類型的浮點(diǎn)型,默認(rèn)為double型。

接下來我們看看如下一個較為經(jīng)典例子:

1 package com.corn.testcast;

2

3

4 public class TestCast {

5

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

7 byte a = 1000; //編譯出錯 Type mismatch: cannot convert from int to byte

8 float b = 1.5; //編譯出錯 Type mismatch: cannot convert from double to float

9 byte c = 3; //編譯正確

10 }

11

12 }

是不是有點(diǎn)奇怪?按照上面的思路去理解,將一個int型的1000賦給一個byte型的變量a,編譯出錯,提示"cannot convert from int to byte"是對的,1.5默認(rèn)是一個double型,將一個double類型的值賦給一個float類型,編譯出錯,這也是對的。但是最后一句:將一個int型的3賦給一個byte型的變量c,居然編譯正確,這是為什么呢?

原因在于:jvm在編譯過程中,對于默認(rèn)為int類型的數(shù)值時,當(dāng)賦給一個比int型數(shù)值范圍小的數(shù)值類型變量(在此統(tǒng)一稱為數(shù)值類型k,k可以是byte/char/short類型),會進(jìn)行判斷,如果此int型數(shù)值超過數(shù)值類型k,那么會直接編譯出錯。因?yàn)槟銓⒁粋€超過了范圍的數(shù)值賦給類型為k的變量,k裝不下嘛,你有沒有進(jìn)行強(qiáng)制類型轉(zhuǎn)換,當(dāng)然報錯了。但是如果此int型數(shù)值尚在數(shù)值類型k范圍內(nèi),jvm會自定進(jìn)行一次隱式類型轉(zhuǎn)換,將此int型數(shù)值轉(zhuǎn)換成類型k。如圖中的虛線箭頭。這一點(diǎn)有點(diǎn)特別,需要稍微注意下。

在其他情況下,當(dāng)將一個數(shù)值范圍小的類型賦給一個數(shù)值范圍大的數(shù)值型變量,jvm在編譯過程中俊將此數(shù)值的類型進(jìn)行了自動提升。在數(shù)值類型的自動類型提升過程中,數(shù)值精度至少不應(yīng)該降低(整型保持不變,float->double精度將變高)。

1 package com.corn.testcast;

2

3 public class TestCast {

4

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

6 long a = 10000000000; //編譯出錯: The literal 10000000000 of type int is out of range

7 long b = 10000000000L; //編譯正確

8 int c = 1000;

9 long d = c;

10 float e = 1.5F;

11 double f = e;

12 }

13

14 }

如上:定義long類型的a變量時,將編譯出錯,原因在于10000000000默認(rèn)是int類型,同時int類型的數(shù)值范圍是-2^31 ~ 2^31-1,因此,10000000000已經(jīng)超過此范圍內(nèi)的最大值,故而其自身已經(jīng)編譯出錯,更談不上賦值給long型變量a了。

此時,若想正確賦值,改變10000000000自身默認(rèn)的類型即可,直接改成10000000000L即可將其自身類型定義為long型。此時再賦值編譯正確。

將值為1000的int型變量c賦值給long型變量d,按照上文所述,此時直接發(fā)生了自動類型提升, 編譯正確。同理,將e賦給f編譯正確。

接下來,還有一個地方需要注意的是:char型其本身是unsigned型,同時具有兩個字節(jié),其數(shù)值范圍是0 ~ 2^16-1,因?yàn)?#xff0c;這直接導(dǎo)致byte型不能自動類型提升到char,char和short直接也不會發(fā)生自動類型提升(因?yàn)樨?fù)數(shù)的問題),同時,byte當(dāng)然可以直接提升到short型。

2.基本數(shù)據(jù)類型中的數(shù)值類型強(qiáng)制轉(zhuǎn)換

當(dāng)我們需要將數(shù)值范圍較大的數(shù)值類型賦給數(shù)值范圍較小的數(shù)值類型變量時,由于此時可能會丟失精度(1講到的從int到k型的隱式轉(zhuǎn)換除外),因此,需要人為進(jìn)行轉(zhuǎn)換。我們稱之為強(qiáng)制類型轉(zhuǎn)換。

首先我們看一下如下的例子:

1 package com.corn.testcast;

2

3 public class TestCast {

4

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

6 byte p = 3; //編譯正確:int到byte編譯過程中發(fā)生隱式類型轉(zhuǎn)換

7 int a = 3;

8 byte b = a; //編譯出錯:cannot convert from int to byte

9 byte c = (byte) a; //編譯正確

10 float d = (float) 4.0;

11 }

12

13 }

byte p =3;編譯正確在1中已經(jīng)進(jìn)行了解釋。接下來將一個值為3的int型變量a賦值給byte型變量b,發(fā)生編譯錯誤。這兩種寫法之間有什么區(qū)別呢?

區(qū)別在于前者3是直接量,編譯期間可以直接進(jìn)行判定,后者a為一變量,需要到運(yùn)行期間才能確定,也就是說,編譯期間為以防萬一,當(dāng)然不可能編譯通過了。此時,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。

強(qiáng)制類型轉(zhuǎn)換所帶來的結(jié)果是可能會丟失精度,如果此數(shù)值尚在范圍較小的類型數(shù)值范圍內(nèi),對于整型變量精度不變,但如果超出范圍較小的類型數(shù)值范圍內(nèi),很可能出現(xiàn)一些意外情況。

如下經(jīng)典例子:

1 package com.corn.testcast;

2

3 public class TestCast {

4

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

6 int a = 233;

7 byte b = (byte) a;

8 System.out.println("b:" + b); //輸出:-23

9 }

10

11 }

為什么結(jié)果是-23?需要從最根本的二進(jìn)制存儲考慮。

233的二進(jìn)制表示為:24位0 + 11101001,byte型只有8位,于是從高位開始舍棄,截?cái)嗪笫O?#xff1a;11101001,由于二進(jìn)制最高位1表示負(fù)數(shù),0表示正數(shù),其相應(yīng)的負(fù)數(shù)為-23。

3.進(jìn)行數(shù)學(xué)運(yùn)算時的數(shù)據(jù)類型自動提升與可能需要的強(qiáng)制類型轉(zhuǎn)換

如下代碼:

1 package com.corn.testcast;

2

3 public class TestCast {

4

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

6 byte a = 3 + 5; //編譯正常 編譯成 3+5直接變?yōu)?

7 int b = 3, c = 5;

8 byte d = b + c; //編譯錯誤:cannot convert from int to byte

9

10 byte e = 10, f = 11;

11 byte g = e + f; //編譯錯誤 +直接將10和11類型提升為了int

12 byte h = (byte) (e + f); //編譯正確

13 }

14

15 }

當(dāng)進(jìn)行數(shù)學(xué)運(yùn)算時,數(shù)據(jù)類型會自動發(fā)生提升到運(yùn)算符左右之較大者,以此類推。當(dāng)將最后的運(yùn)算結(jié)果賦值給指定的數(shù)值類型時,可能需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。

二、引用類型的類型轉(zhuǎn)換/造型

本部分內(nèi)容將在后續(xù)時間在本文中補(bǔ)上。

總結(jié)

以上是生活随笔為你收集整理的java中类型转换的造型_Java总结篇系列:类型转换/造型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。