A. 誰能給我講講java中的強製造型啊最好以代碼形式講下,加下注釋,謝謝喔!
分為兩種:一種是基礎數據類型的強制轉型,另一種是引用類型的轉型。 基礎數據的轉型:表數范圍小的自動向表數范圍大的轉型,也叫做向上轉型。表數范圍大的向表數范圍小的轉型則需要強制類型轉換。例:1、java中的整數默認為int類型。但是我們可以這樣寫: double a = 10; //自動向上轉型, 列印結果:10.0 2、java中的小數默認為double類型。用int類型接收一個double類型的數據, 則需要強制類型轉換: int b = (int)10.9; //強制轉型,必須顯示聲明轉型(也就是在10.9前面加(int)), //列印結果10 //注意:這里不是四捨五入,而是去掉了所有的小數部分。 另一種強制轉型的方式: float c = 10.9f //這是轉型的另一種方式。 3、字元串與int,float,double等轉型,這主要依靠三種基礎數據類型的封裝類 的parseXxx()方法來實現(parseInt(),parseFloat(),parseDouble()等), 而整形和浮點型向字元串轉型 則依靠String類的valueOf()方法。 int d = Integer.parseInt("100"); //將字元串轉成int類型數據, //注意:字元串的內容必須全為數字,不然會出現類型轉換異常。 引用數據類型轉型和基礎數據類型轉型類似,也是自動向上轉型。Object為java的基類,它可以接收任意類型。例: 有一個Person類: public class Person { ....... } 可以用Object接收Person類的對象: Object obj = new Person(); //自動向上轉型 引用類型的向下轉型則需要先建立父類與子類之間的關系: class Person { //父類
......
} class Student extends Person { //子類
.......
} 上面的是一個繼承的關系,如果要讓父類的Person對象可以轉型為子類的Student對象, 則首先要建立一個向上轉型的關聯,即: Person p = new Student(); //首先向上轉型建立關聯(必須,否則不能向下轉型) Student s = (Student)p; //強制轉型到Student對象 父類引用指向子類的對象是多態的表現手段,介面和實現類之間也是這樣。 希望對你有所幫助。
B. Java 什麼情況下,造型會發生異常如何避免造型出現異常
構造函數中的代碼出現未捕獲異常會發生。
如何避免:
1、 將構造函數中的異常捕獲並處理;
2、將構造函數中容易出現異常的代碼 剝離到初始化函數中,並在構造後調用。
C. java向上造型強制轉換的好處
向上造型是指父類的引用指向子類對象。向上造型可以提高程序的擴展性,利於代碼維護
D. java 對象造型的意義 java
模塊與重用
以你的例子來說吧。你那例子是課本用來告訴我們怎麼用父類引用子類對象的,所以根本沒有意義,於是你自然會問「為什麼不直接使用B b1=new B();?」這樣的問題了。
要知道把子類的引用給父類有什麼意義,這要在夠大型的架構裡面才能體現的。比如說Java的awt、swing等GUI的框架裡面,你隨處可以看到繼承重用。
就好像說,一個按鈕和一個文本框,這兩個都是可以顯示出來的圖形組件;而你要把這兩個組件添加到某某窗口frame。那麼在這個窗口frame應該有一個方法是可以添加圖形組件的,而這個方法必須帶有一個參數,這個參數表示要添加的組件,如果讓你來設計,你覺得這個參數的類型是什麼?顯然,這個參數的類型應該表示所有可以被繪制的圖形組件(如果只表示按鈕或文本框的話,那麼以後你新設計了一個單選框,那不是要把frame的代碼改動了)。實際上它的這個添加方法是這么被定義的:add(Component comp)。這里的Component是你要添加的按鈕或文本框的頂級父類了。
E. java向上造型
正確的有 P0=P1 P0=P2 P4=P2 只要創建對象沒錯 就直接看引用,誰是爸爸誰在左邊等著兒子賦值就行了。
F. java向上造型強轉類型的好處
類的載入機制是先載入父類再載入子類,我感覺它的好處是可以讓程序運行更快。
G. java向上造型的意義
向上轉型是子類對象當成父類對象來使用,也就可以這樣理解,父類引用指向子類對象。
那麼比如有一個方法m,它傳的參數是父類的類型,m(father
f),執行的父類中已有的某個方法
而你實際傳的是它的子類
son,如果子類中有重寫父類的方法,那麼java機制就會自動的執行子類的那個方法。
想像下,如果你不用父類對象引用,那麼你實現每個動物的m方法的時候都要去寫一次,而用了這個,java自動判斷實際上是哪個對象就用哪個的方法。
而且你如果添加別的子類,也只需要重寫出這個類和重寫的父類方法就可以了,否則你還要去改m方法。
也就是說,向上轉型體現了面向對象的特點,也增加了程序的擴展性。
H. java向上造型有什麼作用為什麼要造型,有什麼效果
向上造型:父類的引用指向子類的對象。
向上造型可以大大提高程序的可擴展性。利於代碼維護。
面向對象的三大特性:封裝;繼承;多態。向上造型可以看做多態的一種體現。即允許一種類型有不同的實現(可以理解為事物存在的多種體現形態)。
典型應用:介面。
沒有什麼效果,只是是代碼精簡而已
I. java裡面的向上造型中,父類引用指向子類對象時,父類引用只能訪問父類的方法,變數等
這是「動態綁定」,動態綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
而想實現「動態綁定」,必須有繼承、重寫且父類引用指向子類對象,滿足了這3條就屬於「動態綁定」,而它的好處就是像你說的那樣,父類引用訪問的是子類對象的方法,你看下邊的例子吧:
publicclassA
{
publicstaticvoidmain(Stringargs[])
{
Aa=newB();
print(ainstanceofA);
print(ainstanceofB);
a.sayHello();
a=newC();
print(ainstanceofA);
print(ainstanceofC);
a.sayHello();
}
voidsayHello()
{
print("Hello!");
}
publicstaticvoidprint(Objectobj)
{
System.out.println(obj);
}
publicstaticvoidprint()
{
System.out.println();
}
}
classBextendsA
{
voidsayHello()
{
print("Hello,I'mB!");
}
}
classCextendsA
{
voidsayHello()
{
print("Hello,I'mC!");
}
}
它的輸出結果是:
而不是輸出的「Hello」,從輸出的2個true可以看出這里採用的就是「父類引用指向子類對象」,你先別問為什麼輸出的不是「Hello」,其實實際情況也正是我們希望輸出「Hello,I'm B」要好一些,因為我們new的是A類的子類B和C,雖然它們2個都可以直接採用a.sayHello來調用,但如果輸出2個「Hello」,那跟我們直接new一個A類的對象沒什麼區別。如果我們要想不管A有多少子類,都採用a.sayHello來調用(好記、易寫、易改),且java沒有「動態綁定機制」,那麼父類A的sayHello方法可就不好寫了,得先判斷是哪個子類,再調用相關子類的sayHello方法,這跟不採用繼承,直接new個B和C的對象,再採用b.sayHello、c.sayHello沒什麼2樣,那麼這里的「繼承」將毫無意義,而且如果日後你你還需要加一個子類D,你還需要new個D的對象,再採用d.sayHello。
順便,這里你應該還看到了我的父類A還自定義了一個print方法,它的參數既不是String也不是int、double,而是String類、int的包裝類、double的包裝類等類的父類對象Object類,所以我的sayHello方法里給print函數傳遞的是String類(父類Object的引用指向子類對象String類),而main方法里的print(a instanceof A)語句傳遞的是boolean的包裝類(父類Object的引用指向子類對象Boolean類),所以這2種調用也是用了「動態綁定」,如果不用呢?不是很多新手都希望java能像C那樣直接print("Hello World")多好,那麼如果不用「動態綁定」,光是8個基本類型你就需要重寫8個print函數,而且,System.out.println語句傳遞的參數個數也是不確定的(盡管最後都連接成1個String參數),你不用「動態綁定」如何重寫?你寫不出來!
再舉個例子,如果你寫了一個小游戲,幾十中坦克都繼承於同一個父類:Tank類,然後,你想在游戲界面新建1個坦克,那你的main方法只需要統統採用類似於a.Draw()的語句去畫一個坦克即可(全用父類對象的引用),而不需要先判斷是哪個子類,再採用類似【case b:b.Draw();break;case c:c.Draw();break;……case n:n.Draw();break;】的語句(幾十、幾百個子類,你光判斷語句恐怕就幾百行了吧?),同樣開火、移動都只需要調用a.Fire()、a.up()、a.down()、a.Left()、a.Right()即可。而且,如果日後你再想新加1個叫Tank99的子類,那麼你的主方法里關於生成一輛Tank99坦克和Tank99的開火、移動等一系列語句都無需修改,你只需要寫一個Tank99類,繼承並重寫Tank父類的方法即可(你不採用「動態綁定」,那麼主方法里的一切相關方法全部都需要修改,忘了1個地方,程序就出錯了)。程序的可擴展性和健壯性很好,這就是java中「動態綁定機制」的好處。
J. java對象造型問題
Dog d1=(Dog)a;
因為這一句的定義是把父類對象強制轉換為子類對象,又因為子類對象有name和furColor兩個屬性,所以可以去調用,而"bigyellow"已經被賦給了父類的name屬性,所以你再調用子類的name屬性時就沒有了,只能是null.
其實你程序里把子類都又重新定義一個name屬性是多餘的.
應該這樣寫.子類不要再定義name屬性,而是直接super(name),這樣的話,父類和子類都通用一個name屬性,就不會出現錯誤了.而更加符合繼承的思想.