當前位置:首頁 » 編程語言 » java的強制類型轉換

java的強制類型轉換

發布時間: 2022-06-24 14:36:41

java中的強制類型轉換

在Java中強制類型轉換分為基本數據類型和引用數據類型兩種,這里我們討論的後者,也就是引用數據類型的強制類型轉換。

在Java中由於繼承和向上轉型,子類可以非常自然地轉換成父類,但是父類轉換成子類則需要強制轉換。因為子類擁有比父類更多的屬性、更強的功能,所以父類轉換為子類需要強制。那麼,是不是只要是父類轉換為子類就會成功呢?其實不然,他們之間的強制類型轉換是有條件的。

當我們用一個類型的構造器構造出一個對象時,這個對象的類型就已經確定的,也就說它的本質是不會再發生變化了。在Java中我們可以通過繼承、向上轉型的關系使用父類類型來引用它,這個時候我們是使用功能較弱的類型引用功能較強的對象,這是可行的。但是將功能較弱的類型強制轉功能較強的對象時,就不一定可以行了。

舉個例子來說明。比如系統中存在Father、Son兩個對象。首先我們先構造一個Son對象,然後用一個Father類型變數引用它:

Father father = new Son();

在這里Son 對象實例被向上轉型為father了,但是請注意這個Son對象實例在內存中的本質還是Son類型的,只不過它的能力臨時被消弱了而已,如果我們想變強怎麼辦?將其對象類型還原!

Son son = (Son)father;

這條語句是可行的,其實father引用仍然是Father類型的,只不過是將它的能力加強了,將其加強後轉交給son引用了,Son對象實例在son的變數的引用下,恢復真身,可以使用全部功能了。

前面提到父類強制轉換成子類並不是總是成功,那麼在什麼情況下它會失效呢?當引用類型的真實身份是父類本身的類型時,強制類型轉換就會產生錯誤。例如:

Father father = new Father();

Son son = (Son) father;

這個系統會拋出ClassCastException異常信息。

所以編譯器在編譯時只會檢查類型之間是否存在繼承關系,有則通過;而在運行時就會檢查它的真實類型,是則通過,否則拋出ClassCastException異常。

所以在繼承中,子類可以自動轉型為父類,但是父類強制轉換為子類時只有當引用類型真正的身份為子類時才會強制轉換成功,否則失敗。

(1)java的強制類型轉換擴展閱讀:

public class TestCastClassException

{

public static void main(String[] args)

{

Father father = new Son();

//這兩句話是不對的,因為一個father類型的引用(指針)是看不見、看不到son中新定義的數據成員或者成員函數的

//雖然這個對象的本質是Son類型的,它也確實有這樣的數據成員和成員函數,但是指針的作用范圍不夠,它看不到。

//代碼後面附上模型分析

//father.son = 2;

//father.show_son();

father.show_father();

father.show();

Father father1 = (Father)father;//一個對象在內存中被new出來後,只能選擇訪問它的方式,不能修改它的布局(包含的成員的個數等)

father1.show();

} //main

}

class Father

{

public int father = 2;

Father(){}

void show()

{

System.out.println("This is father");

}

void show_father()

{

System.out.println("father!!");

}

}

class Son extends Father

{

public int son = 1;

Son(){}

void show()

{

System.out.println("This is son");

}

void show_son()

{

System.out.println("son!!");

}

}

⑵ Java強制數據類型轉換

規則可不少,挺亂的其實:
強制數據類型轉換: int nowC = (int)c;
還可以這樣,使用intValue方法,返回一個int值:
Double d = 5 / 9.0 * (f - 32);
int nowC = d.intValue();
Double類是基本數據類型double所對應的包裝類。

基本數據類型轉換的規則:
Java中基本數據類型共有8種,其中boolean類型不能轉換為其它類型,其它類型也不能轉換為boolean型
除了boolean類型,還有7種,按照它們的容量(也就是表數范圍,就是能表示的數的大小范圍,比如char是0——65535)的大小,從小到大,排序依次為:
byte short char int long float double
1.容量小的向容量大的轉換,可以自動轉換,比如可以直接將一個int類型賦值給double:
double d = 34;
2.容量大的向容量小的轉換,必須強制類型轉換,就是你上面的那種形式,比如:
double c = 5/9.0 *(f - 32);
int nowC = (int)c;
3.整數類型常量默認為int類型,比如17
4.浮點類型常量默認為double類型,比如3.14
5.在多種數據類型混合運算時,容量小的自動轉換為整個表達式中容量最大的,然後再進行計算,比如:
int i = 9; float f = 4f; double d = 3.14; double dd = i+f+d;
此時,i和f都各自先轉換成double,在進行+運算。
6.在多種數據類型混合運算時,byte short char 3者不會互相轉換,他們各自轉換為int再進行計算
7.在有些時候,容量小的會自動提升為容量大的,比如方法重載傳參數時候,
但是byte 和 short 不會自動提升為char,其它類型按照我上面所述的順序提升。

差不多就這些,不明白補充,另外需要注意的是強轉雖然編譯沒問題,但是運行時,有可能會數據溢出,損失精度

⑶ Java的強制類型轉換的格式,急

強制轉換格式為(int)a將變數a強制轉換為int型,但是轉換是有條件的。數值類型只能轉換為數值類型,邏輯類型boolean不能轉換為數值型。如(int)true就是不對的。詳細的可以參考一些網上的資料。我就不一一列舉了

⑷ JAVA如何進行強制類型轉換

如果這2種類型是兼容的,那麼Java 將自動地進行轉換。

⑸ java 強制類型轉換的規則是什麼

1、執行算術運算時,低類型(短位元組)可以轉換為高類型(長位元組);例如: int型轉換成double型,char型轉換成int型等等;

2、賦值表達式中,等號右邊表達式的值的類型自動隱式地轉換為左邊變數的類型,並賦值給它;

3、函數調用時,將實參的值傳遞給形參,系統首先會自動隱式地把實參的值的類型轉換為形參的類型,然後再賦值給形參;

4、函數有返回值時,系統首先會自動隱式地將返回表達式的值的類型轉換為函數的返回類型,然後再賦值給調用函數返回。

(5)java的強制類型轉換擴展閱讀

C++中強制類型轉換函數有4個:

1、const_cast(用於去除const屬性)。

2、static_cast(用於基本類型的強制轉換)。

3、dynamic_cast(用於多態類型之間的類型轉換)。

4、reinterpreter_cast(用於不同類型之間的指針之間的轉換,最常用的就是不同類型之間函數指針的轉換)。

隱式類型轉換發生在賦值表達式和有返回值的函數調用表達式中。

在賦值表達式中,如果賦值符左右兩側的操作數類型不同,則將賦值符右邊操作數強制轉換為賦值符左側的類型數值後,賦值給賦值符左側的變數。

在函數調用時,如果return後面表達式的類型與函數返回值類型不同,則在返回值時將return後面表達式的數值強制轉換為函數返回值類型後,再將值返回。

參考資料

網路-強制類型轉換

⑹ java怎麼自動判斷類型並且強制轉換

並不能直接解決你的問題,但可供參考:
Object something = "something";
String theType = "java.lang.String";
Class<?> theClass = Class.forName(theType);
Object obj = theClass.cast(something);
泛型:
Object something = new Integer(123);
String theType = "java.lang.Number";
Class<? extends Number> theClass = Class.forName(theType).asSubclass(Number.class);
Number obj = theClass.cast(something);

⑺ JAVA如何進行強制類型轉換

1.
轉型有兩種:
向上轉型和向下轉型(強制轉型)
2.
兩種分別如下:
1.
一種是向上轉型
1.
對於基礎數據類型
,
可以自動轉型
,比如:
int
a
=
10;
long
b
=
a;
這里就是把int型轉成了long型
,
因為
long范圍比int大
,
這樣的轉型不會有任何影響
,
所以可以自動轉型
2.
又比如
A
a
=
new
B();
其中
A
是B
的父類
,
這也是多態
,
就是父類的對象指向子類的引用
,
你調用a對象
,
實際上是B的類
,
但是B繼承A
,
擁有A的一切屬性和方法
(不談復寫)
3.
第二種是向下轉型
,
也就是強制
這種需要強轉
,
比如
long
a
=
10
;
int
b
=
(int)
a;
通過
(int)可以強制轉型
,
但是這樣會丟失精度
,
比如a如果超過了b的范圍
,
那麼強轉成int型,
只會等於int的最大值
又比如
:
B
b
=
new
A();
這樣是不行的
,
需要有中間途徑
,
比如
A
a
=
new
A();

Object
obj
=
a;

B
b
=
(A)
a;
而這種強轉
,
又有要求
,
必須是同類型
,
也就是說
A
就是B
,
不然會報錯.
4.
不同類型之間如果要轉型
,
需要通過中間途徑
,
比如JSON
,
將A轉成JSON串
,
然後再轉換為B

熱點內容
阿里雲伺服器能用vmware嗎 發布:2024-04-25 13:33:23 瀏覽:731
1616源碼 發布:2024-04-25 13:33:19 瀏覽:80
奧維地圖伺服器地址怎麼填 發布:2024-04-25 12:40:04 瀏覽:965
低配置游戲玩哪個平台 發布:2024-04-25 12:35:04 瀏覽:559
glinux下載 發布:2024-04-25 12:30:09 瀏覽:84
安卓手機可以用的谷歌叫什麼 發布:2024-04-25 12:05:57 瀏覽:943
linux改變用戶所屬組 發布:2024-04-25 11:50:33 瀏覽:469
rsa加密演算法java代碼 發布:2024-04-25 11:40:07 瀏覽:883
如何改變拉桿箱上的初始密碼 發布:2024-04-25 11:17:23 瀏覽:799
內網掛代理虛擬機如何配置網卡 發布:2024-04-25 11:15:06 瀏覽:687