摘要:基本類型的類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換一的變量類型分為種。目錄基本類型的類型轉(zhuǎn)換隱式類型轉(zhuǎn)換基本類型的強(qiáng)制類型轉(zhuǎn)換基本類型的類型轉(zhuǎn)換隱式類型轉(zhuǎn)換基本類型的類型轉(zhuǎn)換是通過擴(kuò)展轉(zhuǎn)換的規(guī)則完成的。
基本類型的類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換(一)
Java的變量類型分為2種。基本類型(原始類型)和引用類型。基本類型包括以下八種類型:boolean、 char、byte、short、int、long、float、double。引用類型包括一下三種類型,類(class)類型、接口(interface)類型、數(shù)組(Array)類型。
本章主要講述基本類型之間轉(zhuǎn)換的方法,轉(zhuǎn)換包括由Java運(yùn)行時(shí)環(huán)境隱式執(zhí)行的類型轉(zhuǎn)換和根據(jù)程序需要進(jìn)行的強(qiáng)制類型轉(zhuǎn)換。另外,關(guān)于引用類型的轉(zhuǎn)換,請參照Class(引用類型的轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換)。
目錄基本類型的類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換)
基本類型的強(qiáng)制類型轉(zhuǎn)換
基本類型的類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換)基本類型的類型轉(zhuǎn)換是通過擴(kuò)展轉(zhuǎn)換的規(guī)則完成的。當(dāng)Java運(yùn)行時(shí)環(huán)境將數(shù)據(jù)的存儲范圍向更寬的類型轉(zhuǎn)換的時(shí),執(zhí)行隱式類型轉(zhuǎn)換。
類型轉(zhuǎn)換規(guī)則待轉(zhuǎn)換的基本類型 | 可能的轉(zhuǎn)換目標(biāo)的基本類型 |
---|---|
boolean | 沒有 |
char | int, long, float, double |
byte | short, int, long, float, double |
short | int, long, float, double |
int | long, float, double |
long | float, double |
float | double |
double | 沒有 |
以下將會說明Java運(yùn)行時(shí)環(huán)境何時(shí)會進(jìn)行隱式類型轉(zhuǎn)換。
在賦值時(shí)進(jìn)行類型轉(zhuǎn)換某個(gè)基本類型的變量,在賦值給其他基本類型的變量時(shí),將會進(jìn)行隱式的類型轉(zhuǎn)換。轉(zhuǎn)換遵循[類型轉(zhuǎn)換規(guī)則]。
int x = 10; double y; y = x; //變量x(int類型)賦值給變量y(double類型)時(shí),將會執(zhí)行隱式類型轉(zhuǎn)換。int類型的變量轉(zhuǎn)換為double類型之后,會執(zhí)行賦值操作。因?yàn)樗前凑誟類型轉(zhuǎn)換的規(guī)則]進(jìn)行的,所以不需要程序員主動的進(jìn)行轉(zhuǎn)換。 int x = 10; short y; y = x; //變量x(int類型)無法賦值給變量y(short類型)。因?yàn)閕nt類型的變量x無法轉(zhuǎn)換成shot類型的變量,short類型的存儲范圍小于int類型。執(zhí)行的結(jié)果會出現(xiàn)編譯錯(cuò)誤。在調(diào)用方法時(shí)的類型轉(zhuǎn)換
在調(diào)用方法時(shí),如果指定的類型與您要調(diào)用的方法的參數(shù)類型所需的類型不同,則會執(zhí)行隱式類型轉(zhuǎn)換。 在這種情況下,類型轉(zhuǎn)換也遵循【類型轉(zhuǎn)換規(guī)則】
short x = 10; System.out.println(Integer.toString(x));
Integer.toString是一種將int類型數(shù)據(jù)轉(zhuǎn)換為字符串的方法,該方法需要一個(gè)int類型的參數(shù)。 在如上所示代碼,形參的類型為short類型的情況下 根據(jù)【類型轉(zhuǎn)換規(guī)則】,short類型被轉(zhuǎn)換為int類型之后,然后方法被執(zhí)行,所以不會出現(xiàn)編譯錯(cuò)誤。
double y = 20.25; System.out.println(Integer.toString(y));
double類型的變量被指定為參數(shù)時(shí)
由于不符合【類型轉(zhuǎn)換規(guī)則】(double類型不能轉(zhuǎn)換為int類型),執(zhí)行結(jié)果為編譯錯(cuò)誤。
當(dāng)使用算術(shù)運(yùn)算符執(zhí)行算術(shù)運(yùn)算時(shí),將執(zhí)行隱式類型轉(zhuǎn)換。 算術(shù)運(yùn)算中的類型轉(zhuǎn)換規(guī)則如下。
【算術(shù)運(yùn)算符類型變換規(guī)則】
算術(shù)運(yùn)算符 | 規(guī)則 |
---|---|
單項(xiàng)運(yùn)算符 (+, -, ~) |
1. char, byte, short類型的變量會轉(zhuǎn)化成int類型。 2. 除此之外不會進(jìn)行轉(zhuǎn)換。 |
二項(xiàng)運(yùn)算符 (+, -, *, /, %, >>, >>>, <<, &, ^, 、豎線) |
1. 其中一個(gè)變量為double類型的時(shí)候,另一個(gè)變量也會轉(zhuǎn)換為double型。 2. 不含有double類型的變量的時(shí)候,其中一個(gè)變量為float類型,那么另一個(gè)變量也會變成float類型。 3. 不含有double、float類型的時(shí)候,其中一個(gè)變量為long類型,那么另一個(gè)變量也會變成long類型。 4. 不含有double、float、long類型的時(shí)候,其中一個(gè)變量為int類型,那么另一個(gè)變量也會變成int類型。 |
【例1】算術(shù)運(yùn)算時(shí)進(jìn)行轉(zhuǎn)換的正確例子。
short x = 10; double y = 20.25; double z = -x + y; //(1) System.out.println(z); //(2)
解釋1
(1)變量x(short)類型,根據(jù)單項(xiàng)運(yùn)算符(-)會轉(zhuǎn)換為int類型。變量x(int類型)和變量y(double類型),根據(jù)二項(xiàng)運(yùn)算符(+)會轉(zhuǎn)換為double類型。然后賦值給變量z。
(2)運(yùn)算結(jié)果10.25。
【例2】算術(shù)運(yùn)算時(shí)進(jìn)行轉(zhuǎn)換編譯錯(cuò)誤的例子
short x = 10; double y = 20.25; int z = -x + y; //(1) System.out.println(z);
解釋2
(1)變量x(short)類型,根據(jù)單項(xiàng)運(yùn)算符(-)會轉(zhuǎn)換為int類型。變量x(int類型)和變量y(double類型),根據(jù)二項(xiàng)運(yùn)算符(+)會轉(zhuǎn)換為double類型。。double類型的的運(yùn)算結(jié)果無法賦值給z變量,編譯錯(cuò)誤。
一些解釋說明(非原文)也許有的讀者會問,如何證明變量-x是int類型,苦于譯者的水平,想不到如何用代碼來證明,但是通過:
javap -c [class文件名]//java反匯編命令
也許可以一探究竟。
示例代碼public class HelloWorld { public static void main(String[] args) { short x = 10; double y = 20.25; double z = -x + y; } }
使用javac命令編譯后,運(yùn)行javap -c命令進(jìn)行反編譯,編譯結(jié)果如下
Compiled from "HelloWorld.java" public class HelloWorld { public HelloWorld(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: bipush 10 2: istore_1 3: ldc2_w #2 // double 20.25d 6: dstore_2 7: iload_1 8: ineg 9: i2d 10: dload_2 11: dadd 12: dstore 4 14: return }
第0行:使用bipush將10推入棧頂時(shí),會被擴(kuò)展為32bit int類型的值。
第3行:使用ldc2_將將long或double型常量值從常量池中推送至棧頂(寬索引),這里常量是10
第7行:使用iload_1將第2個(gè)int類型的局部變量入棧,也就是10。
第8行:使用ineg將棧頂int型數(shù)值取負(fù),并且結(jié)果進(jìn)棧。
第9行:使用i2d將棧頂int值強(qiáng)轉(zhuǎn)double值,并且結(jié)果進(jìn)棧。
第10行:使用dload_2將第3個(gè)double類型的局部變量入棧,也就是20.25d。
第11行:使用dadd將棧頂兩double型數(shù)值相加,并且結(jié)果進(jìn)棧。
第12行:使用dstore將棧頂double類型的值存入指定的局部變量。
_(:з」∠)_,好像解釋的并不怎么好。要是有好的辦法,希望能告訴我,大家一起學(xué)習(xí)。謝謝。
---未完待續(xù)---
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68506.html
摘要:基本類型的類型轉(zhuǎn)換隱式類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換基本類型的強(qiáng)制轉(zhuǎn)換所謂強(qiáng)制類型轉(zhuǎn)換是根據(jù)程序員的意志來進(jìn)行類型變換的處理。將變量轉(zhuǎn)換為存儲領(lǐng)域強(qiáng)制轉(zhuǎn)換為更窄的場合,待變換的數(shù)據(jù)可能發(fā)生溢出。強(qiáng)制轉(zhuǎn)換數(shù)據(jù)溢出運(yùn)行結(jié)果更新日 基本類型的類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換)和強(qiáng)制類型轉(zhuǎn)換 基本類型的強(qiáng)制轉(zhuǎn)換 所謂強(qiáng)制類型轉(zhuǎn)換(CAST)是根據(jù)程序員的意志來進(jìn)行類型變換的處理。如果隱式類型轉(zhuǎn)化無法進(jìn)行的場合,...
摘要:如果有并且返回基本類型值,再使用該值進(jìn)行強(qiáng)制類型轉(zhuǎn)換。四寬松相等和嚴(yán)格相等允許在相等比較中進(jìn)行強(qiáng)制類型轉(zhuǎn)換,而不允許。這時(shí)最好用來避免不經(jīng)意的強(qiáng)制類型轉(zhuǎn)換。這兩個(gè)原則可以讓我們避開幾乎所有強(qiáng)制類型轉(zhuǎn)換的坑。 一、類型轉(zhuǎn)換規(guī)則 1.ToString 對于普通對象來說,除非自行定義toString方法,否則就會調(diào)用Object.prototype.toString()方法,如果對象有自己的...
摘要:強(qiáng)制類型轉(zhuǎn)換作為程序員,你一定獲取過當(dāng)前系統(tǒng)的時(shí)間戳。比如對于變量而言,此次強(qiáng)制類型轉(zhuǎn)換是隱式的。然而則是非常典型的顯式強(qiáng)制類型轉(zhuǎn)換。隱式強(qiáng)制類型轉(zhuǎn)換大部分被詬病的強(qiáng)制類型轉(zhuǎn)換都是隱式強(qiáng)制類型轉(zhuǎn)換。 JavaScript 強(qiáng)制類型轉(zhuǎn)換 作為 JavaScript 程序員,你一定獲取過當(dāng)前系統(tǒng)的時(shí)間戳。在 ES5 引入 Date.now() 靜態(tài)方法之前,下面這段代碼你一定不會陌生: v...
摘要:顯示的調(diào)用轉(zhuǎn)換過程稱為顯式強(qiáng)制類型轉(zhuǎn)換,隱式的情況稱為隱式強(qiáng)制類型轉(zhuǎn)換。隱式強(qiáng)制類型轉(zhuǎn)換讓代碼變得晦澀難懂而又便捷而奇妙。事實(shí)上,允許在比較中進(jìn)行強(qiáng)制類型轉(zhuǎn)換,而不允許。如果有并且返回基本類型值,就使用該值進(jìn)行強(qiáng)制類型轉(zhuǎn)換。 JavaScript是一種非常靈活的現(xiàn)代編程語言,靈活到使用者極其容易被忽視的它那廣闊的世界以及它帶給我們的無限遐想空間。本文將對JavaScript最最基礎(chǔ)也最...
摘要:隱式強(qiáng)制類型轉(zhuǎn)換指的是那些隱藏的強(qiáng)制類型轉(zhuǎn)換,副作用也不是很明顯,事實(shí)上,只要自己覺得不夠明顯的強(qiáng)制類型轉(zhuǎn)換都可以算作隱式強(qiáng)制類型轉(zhuǎn)換,接下來,此文將會介紹幾種常見的隱式類型轉(zhuǎn)換。 隱式強(qiáng)制類型轉(zhuǎn)換指的是那些隱藏的強(qiáng)制類型轉(zhuǎn)換,副作用也不是很明顯,事實(shí)上,只要自己覺得不夠明顯的強(qiáng)制類型轉(zhuǎn)換都可以算作隱式強(qiáng)制類型轉(zhuǎn)換,接下來,此文將會介紹幾種常見的隱式類型轉(zhuǎn)換。 加法操作符 轉(zhuǎn)換規(guī)則: ...
閱讀 2337·2021-11-16 11:52
閱讀 2323·2021-11-11 16:55
閱讀 750·2021-09-02 15:41
閱讀 2981·2019-08-30 15:54
閱讀 3142·2019-08-30 15:54
閱讀 2251·2019-08-29 15:39
閱讀 1507·2019-08-29 15:18
閱讀 968·2019-08-29 13:00