❶ java編譯時,自動類型轉換,是不是自動在變數前面加上要轉換的類型
1、小的類型自動轉化為大的類型
2、整數類型可以自動轉化為浮點類型,可能會產生舍入誤差
3、字元可以自動提升為整數,自動轉換類型不需要在前面加類型,那是強制轉換。
❷ 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異常。
所以在繼承中,子類可以自動轉型為父類,但是父類強制轉換為子類時只有當引用類型真正的身份為子類時才會強制轉換成功,否則失敗。
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中的類型轉化的問題
首先,泛型本身並不直接改動原有的類型設計,只是」讓編譯器幫我們檢查在添加東西到集合中或對集合迭代時檢查對應的類型「,因為有了泛型,之後你可以直接
UserInforLista=userIdList.get(1);而不用(UserInforList)userIdList.get(1);
為了保證後面直接從集合中拿東西不需要 cast ,當然需要保證這其中所有的過程都是符合當初指定的類型的,因此不可以直接把它們轉換的。因為裡面裝的對象的類型本來就不相同的。
另外要記得在 Java 中抽換類型的對象本身是什麼類型從來不會因為你把它添加到集合中或賦值給父類型的變數符號而改變,它一直」還是原來的配方,還是熟悉的味道「。我們在繼承關系樹上的不同父類之間賦值僅僅改變它的成員的可見性(讓編譯器來檢查某個方法對於當前這個變數類型來說是否可以調用),這也是為什麼用反射就能調用所有方法的原因,如果類型真的不同了為什麼你能成功通過反射調用某個子類中才有的方法呢?
只有像C語言中的那些基本類型(比如 int, float) 會因為 cast 而改變(因為 cast 會改變一個數字在內存中的二進製表示以及及超出精度范圍而產生的變化等)。
❹ Java中對象類型轉換原則有哪些
Java數據類型的轉換原則
從低精度向高精度轉換
byte 、short、int、long、float、double、char
註:兩個char型運算時,自動轉換為int型;當char與別的類型運算時,也會先自動轉換為int型的,再做其它類型的自動轉換
基本類型向類類型轉換
正向轉換:通過類包裝器來new出一個新的類類型的變數
Integer a= new Integer(2);
反向轉換:通過類包裝器來轉換
int b=a.intValue();
類類型向字元串轉換
正向轉換:因為每個類都是object類的子類,而所有的object類都有一個toString()函數,所以通過toString()函數來轉換即可
反向轉換:通過類包裝器new出一個新的類類型的變數
eg1: int i=Integer.valueOf(「123」).intValue()
說明:上例是將一個字元串轉化成一個Integer對象,然後再調用這個對象的intValue()方法返回其對應的int數值。
eg2: float f=Float.valueOf(「123」).floatValue()
說明:上例是將一個字元串轉化成一個Float對象,然後再調用這個對象的floatValue()方法返回其對應的float數值。
eg3: boolean b=Boolean.valueOf(「123」).booleanValue()
說明:上例是將一個字元串轉化成一個Boolean對象,然後再調用這個對象的booleanValue()方法返回其對應的boolean數值。
eg4:double d=Double.valueOf(「123」).doubleValue()
說明:上例是將一個字元串轉化成一個Double對象,然後再調用這個對象的doubleValue()方法返回其對應的double數值。
eg5: long l=Long.valueOf(「123」).longValue()
說明:上例是將一個字元串轉化成一個Long對象,然後再調用這個對象的longValue()方法返回其對應的long數值。
eg6: char=Character.valueOf(「123」).charValue()
說明:上例是將一個字元串轉化成一個Character對象,然後再調用這個對象的charValue()方法返回其對應的char數值。
❺ Java數據類型轉換問題
放在前面那叫強制類型轉換,放在後面編譯就報錯了,java源程序需要編譯成.class文件,才能被JVM所識別的。
❻ Java中的強制類型轉換是如何轉換的
java中數據類型的強制轉換是通過強制轉換語句完成的,強制轉換語句的格式為「目標數據類型 變數 = (目標數據類型) 數據;」。下面給出例子:
1、定義兩個位元組數據類型a、b、c,分別賦予1和2和a+b的值,進行加法運算的式子a+b=3,得出的結果「3」將會被編譯環境判定為整形數據,把這個整形數據賦值給c,系統將會報錯,這樣就需要用到格式為「目標數據類型 變數 = (目標數據類型) 數據;」的強制轉換語句。
2、根據強制轉換語句的格式,易得「byte c = (byte)(a+b);」;
3、這樣就把整形數據的「3」賦值給位元組數據類型的c了,其中完成數據的強制類型轉換。
(6)java類型轉換編譯擴展閱讀:
基本類型 轉換原則:
1、類型轉換主要在在賦值、方法調用、算術運算三種情況下發生。
a、賦值和方法調用 轉換規則:從低位類型到高位類型自動轉換;從高位類型到低位類型需要強制類型轉換:
(1)布爾型和其它基本數據類型之間不能相互轉換;
(2)byte型可以轉換為short、int、、long、float和double;
(3)short可轉換為int、long、float和double;
(4)char可轉換為int、long、float和double;
(5)int可轉換為long、float和double;
(6)long可轉換為float和double;
(7)float可轉換為double;
b、算術運算 中的類型轉換:
1、基本就是先轉換為高位數據類型,再參加運算,結果也是最高位的數據類型;
2、byte short char運算會轉換為Int;
(1)如操作數之一為double,則另一個操作數先被轉化為double,再參與算術運算。
(2)如兩操作數均不為double,當操作數之一為float,則另一操作數先被轉換為float,再參與運算。
(3)如兩操作數均不為double或float,當操作數之一為long,、則另一操作數先被轉換為long,再參與算術運算。
(4)如兩操作數均不為double、float或long,則兩操作數先被轉換為int,再參與運算。
特殊:
(1)如採用+=、*=等縮略形式的運算符,系統會自動強制將運算結果轉換為目標變數的類型。
(2) 當運算符為自動遞增運算符(++)或自動遞減運算符(--)時,如果操作數為byte,short或char類型不發生改變;
❼ java 強制類型轉換的規則是什麼
1、執行算術運算時,低類型(短位元組)可以轉換為高類型(長位元組);例如: int型轉換成double型,char型轉換成int型等等;
2、賦值表達式中,等號右邊表達式的值的類型自動隱式地轉換為左邊變數的類型,並賦值給它;
3、函數調用時,將實參的值傳遞給形參,系統首先會自動隱式地把實參的值的類型轉換為形參的類型,然後再賦值給形參;
4、函數有返回值時,系統首先會自動隱式地將返回表達式的值的類型轉換為函數的返回類型,然後再賦值給調用函數返回。
C++中強制類型轉換函數有4個:
1、const_cast(用於去除const屬性)。
2、static_cast(用於基本類型的強制轉換)。
3、dynamic_cast(用於多態類型之間的類型轉換)。
4、reinterpreter_cast(用於不同類型之間的指針之間的轉換,最常用的就是不同類型之間函數指針的轉換)。
隱式類型轉換發生在賦值表達式和有返回值的函數調用表達式中。
在賦值表達式中,如果賦值符左右兩側的操作數類型不同,則將賦值符右邊操作數強制轉換為賦值符左側的類型數值後,賦值給賦值符左側的變數。
在函數調用時,如果return後面表達式的類型與函數返回值類型不同,則在返回值時將return後面表達式的數值強制轉換為函數返回值類型後,再將值返回。
網路-強制類型轉換
❽ java中的類型轉換
很簡單,因為第三行中的1不是short類型,是int,int不能直接和short相加減
回頭來看第二行為啥對了
因為si+=1這種寫法可以進行自動的轉換
❾ java 數據類型轉換
java中數據類型是有個隱式的自動轉換的.
byte,short,int和long都是整數,任何數字(如1,11,111等),只要不超過范圍,都是可以賦值給byte,short,int類型的,但不能直接賦值給long,必須在後面加上L(大小寫均可),任何char,byte,short,int之間的計算的結果都是int 型,
如題,
a = 1;把1賦給a,當然把1賦給byte是沒有問題的,
a = a + 1 ; 這樣就等於把int型賦給了byte型是會報錯的.
a += 1 是自增運算,+=,-=,*=,/=等運算是不會轉成其他類型的,此題中雖然結果與a = a + 1一樣;
順便展開一點講,共有8種基本數據類型,順要說明的是:byte,short,int,long,float,double,boolean,char
1.char,byte,short,int之間運算會自動轉換為int,不包括自增與自減;
char會以ASCII碼轉換
2.如下鏈條,可以向下賦值,反之剛不行,比如,byte值可以賦給short變數,反之則不行.
3.數字默認類型是int,是不符合如下鏈條的例外情況,只要不超過范圍可以賦值給char,byte,short等類型,比如可以byte a = 127是對的,byte a = 128是會編譯錯誤的;
4.有小數點的都默認為為double型,加f變float,如2.5f
5.boolean只能邏輯運算
byte->short->int->long->float->double char->int
❿ java類型轉換錯誤
通常使用強制類型轉換將父類型轉換成子類型時,是不會有編譯錯誤的,只會有運行時拋出ClassCast的異常,如果編譯提示錯誤,那肯定是因為你轉換的時候類型就匹配,被轉換的對象和目標類型不是子父類/介面實現類的關系,自然編譯不通過