強制類型轉換java
⑴ 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 = 10;
long b = a;
這里就是把int型轉成了long型 , 因為 long范圍比int大 , 這樣的轉型不會有任何影響 , 所以可以自動轉型
又比如 A a = new B();
其中 A 是B 的父類 , 這也是多態 , 就是父類的對象指向子類的引用 , 你調用a對象 , 實際上是B的類 , 但是B繼承A , 擁有A的一切屬性和方法 (不談復寫)
第二種是向下轉型 , 也就是強制
這種需要強轉 , 比如
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 , 不然會報錯.
不同類型之間如果要轉型 , 需要通過中間途徑 , 比如JSON , 將A轉成JSON串 , 然後再轉換為B
⑷ 在java中什麼是強制類型轉換!
1 ) 整數 int 轉換成字串 String , 有三種方法 :
String s = String.valueOf(i);
String s = Integer.toString(i);
String s = "" + i;
2 ) String 轉 int
int i = Integer.parseInt([String]);
i = Integer.parseInt([String],[int radix]);
int i = Integer.valueOf(my_str).intValue();
3 ) 布爾類型 轉 String
1. 第一種方法
boolean bool = true;
String s = new Boolean(bool).toString();//將bool利用對象封裝器轉化為對象
2. 第二種方法
boolean bool = true;
String s = String.valueOf( bool );
4 ) String 轉 Date
1 . 導入 java.util.Date date=null;
2 . date=java.sql.Date.valueOf(String s);
5 ) 數字類型間的轉換
轉型有兩種: 向上轉型和向下轉型(強制轉型)
兩種分別如下:
第一種是向上轉型
對於基礎數據類型 , 可以自動轉型 ,比如:
int a = 10;
long b = a;
這里就是把int型轉成了long型 , 因為 long范圍比int大 , 這樣的轉型不會有任何影響 , 所以可以自動轉型
第二種是向下轉型 , 也就是強制
這種需要強轉 , 比如
long a = 10 ;
int b = (int) a;
通過 (int)可以強制轉型 , 但是這樣會丟失精度 , 比如a如果超過了b的范圍 , 那麼強轉成int型, 只會等於int的最大值
又如 : int a = ( int ) 8.8 ;
如果對編程感興趣可以來我這個看看,希望對您有所幫助!~
⑸ Java中什麼情況下需要強制轉換
自動轉換和強制轉換我知道的有兩種情況:基本數據類型
和
類。
先說基本數據類型:因為java是強類型語言,由強類型向弱類型轉換需要強制轉換,而由弱類型向強類型轉換則系統自動轉換。比如:double
類型相比int類型是屬於強類型,則由double類型的數據向int類型數據轉換就需要強制轉換,反之則自動轉換。另外八大基本數據類型的強弱關系如下:byte
評論
0
0
載入更多
⑹ java 強制類型轉換的規則是什麼
1、執行算術運算時,低類型(短位元組)可以轉換為高類型(長位元組);例如: int型轉換成double型,char型轉換成int型等等;
2、賦值表達式中,等號右邊表達式的值的類型自動隱式地轉換為左邊變數的類型,並賦值給它;
3、函數調用時,將實參的值傳遞給形參,系統首先會自動隱式地把實參的值的類型轉換為形參的類型,然後再賦值給形參;
4、函數有返回值時,系統首先會自動隱式地將返回表達式的值的類型轉換為函數的返回類型,然後再賦值給調用函數返回。
(6)強制類型轉換java擴展閱讀
C++中強制類型轉換函數有4個:
1、const_cast(用於去除const屬性)。
2、static_cast(用於基本類型的強制轉換)。
3、dynamic_cast(用於多態類型之間的類型轉換)。
4、reinterpreter_cast(用於不同類型之間的指針之間的轉換,最常用的就是不同類型之間函數指針的轉換)。
隱式類型轉換發生在賦值表達式和有返回值的函數調用表達式中。
在賦值表達式中,如果賦值符左右兩側的操作數類型不同,則將賦值符右邊操作數強制轉換為賦值符左側的類型數值後,賦值給賦值符左側的變數。
在函數調用時,如果return後面表達式的類型與函數返回值類型不同,則在返回值時將return後面表達式的數值強制轉換為函數返回值類型後,再將值返回。
參考資料
網路-強制類型轉換
⑺ Java強制類型轉換
原因有如下:
Object數組中可以存儲int ,string, class等類型,對於計算機來說它不清楚用戶最終存儲的是什麼類型的數據,例如可以存儲:
mm[0] = new String("123");
mm[1] = new MyClass();如果存儲以上數據類型,那麼你強制轉換就是失敗的,Object數組存儲未知類型,所以無法強制轉換某一固定類型的數據,強制轉換就會異常。
針對Object數組中某一個具體數據進行強制轉換時,可以根據存儲的實際類型進行轉換處理,能夠正常進行,所以是正確的。
以上的說明希望你能明白。
⑻ java的強制類型轉換應該怎樣理解
類型轉換, 就是一種數據類型轉化到另一種數據類型嘛。我這樣給你講吧,不管什麼語言,在計算機看來,不管什麼數據類型的數據,它都是以二進制的方式存在某一個地址開始的一段內存里吧。但是對我們來說,我們並不真正了解這些二進制到底是什麼數據,其實呢,你認為它是什麼都可以。類型之間的轉化其實就是一開始如果你以類型A來解釋這段二進制碼得到類型A的數據a,然後你要強制轉化為類型B,就是同樣的把這段二進制碼解釋成類型B的數據b.當然了,從java上講,從現象上看分原生類型之間的轉化以及對象類型之間的轉化。具體的我就不講了,自己看看書,翻翻兩個例子就懂了,沒啥難度。
⑼ Java的強制類型轉換的格式,急
強制轉換格式為(int)a將變數a強制轉換為int型,但是轉換是有條件的。數值類型只能轉換為數值類型,邏輯類型boolean不能轉換為數值型。如(int)true就是不對的。詳細的可以參考一些網上的資料。我就不一一列舉了
⑽ JAVA如何進行強制類型轉換
如果這2種類型是兼容的,那麼Java 將自動地進行轉換。