㈠ java中向上轉型和向下轉型有何用途
無論是上轉還是下轉都是為了讓類的使用范圍和適用范圍發生變化,以便操作不同范圍的變數或者方法。
1上轉型是指將子類對象使用父類引用進行引用。
得:上轉型對象可以操作和使用子類繼承或者重寫的方法。
失:上轉型對象喪失了對子類新增成員變數或新增的方法的操作和使用。
2與向上轉型相反,即是把父類對象轉為子類對象:作用也與上轉相反。
java 轉型問題其實並不復雜,只要記住一句話:父類引用指向子類對象。子類和父類中定義同名的變數時,僅僅是隱藏了,變數沒有多態性;而對於覆蓋的方法,Java表現出多態性,會調用更具體的子類裡面的方法,無論從哪裡調用,無論使用什麼引用類型調用。
㈡ java中向下轉型後的對象對於訪問父類 或者子類的方法有什麼限制
不能訪問父類沒有的方法和屬性
就是這個限制了,其他沒有
-------
不能,就好象 你懂電腦,但是不是所有的人都懂電腦
所以無法讓一個 "人" 去操作電腦,而只能讓「懂電腦的人」去操作電腦。
懂電腦的人 是 人 的子類。
初學者一般都會有這樣的問題,先強轉成B
以後學了設計的方法學就會很少遇到這樣的編碼方式了
㈢ 關於JAVA向下轉型的問題
有意思
向下轉型的最終結果是,子類變數的指針指向了父類的實例化對象。簡單點講,就是把爹當兒子用。
比如:此時你想比較一下兩個兒子的年齡和體重是否一樣。【採用equals方法】
第一,在object父輩繼承得來的equals方法,不能完成年齡和體重對比的要求,故要重寫
第二,對象那裡找呢?子類自身可以new出一個來,剩下的那個只能通過向下轉型,把爹變成兒子
呵呵,為了保證變出來的是兒子類的,在變之前就需要採用 { 出來的對象名稱 intanceof 子類名稱 } 篩選一下,這樣就獲得了兩個跟題目要求類型一致的對象。
㈣ java當中向上向下轉型的作用是什麼向下轉型的語法
向上轉型和向下轉型涉及到面向對象三大特性之一的繼承,也就是子類和父類之間的關系。
這里以 父類 動物(Animal) 和子類 狗(Dog) 為例:
向上轉型:顧名思義,就是把子類強轉為父類。代碼 Animal a = new Dog();
注意,這里的a是沒有辦法執行Dog類的獨有方法的,因為JVM認為a 是Animal類型的。如果需要使用Dog類獨有的方法,就要使用向下轉型,也就是通俗意義上的強轉。
向下轉型:就是把父類強轉為子類,代碼:
Animal a = new Dog();
Dog d = (Dog)a; // 向下轉型,這種寫法是完全正確的
/** 下面這種寫法會報錯 */
Animal a = new Animal();
Dog d = (Dog)a; // 這里會報錯,無法轉換。
報錯的原因很簡單,因為你可以說狗是動物,但是你無法說動物是狗。
寫了這么多,希望你能明白
㈤ java中向上轉型和向下轉型什麼意思是用來干什麼的請高手解釋下,通俗點,謝謝!
我們在現實中常常這樣說:這個人會唱歌。在這里,我們並不關心這個人是黑人還是白人,是成人還是小孩,也就是說我們更傾向於使用抽象概念「人」。再例如,麻雀是鳥類的一種(鳥類的子類),而鳥類則是動物中的一種(動物的子類)。我們現實中也經常這樣說:麻雀是鳥。這兩種說法實際上就是所謂的向上轉型,通俗地說就是子類轉型成父類。這也符合Java提倡的面向抽象編程思想。
子類轉型成父類是向上轉型,反過來說,父類轉型成子類就是向下轉型。但是,向下轉型可能會帶來一些問題:我們可以說麻雀是鳥,但不能說鳥就是麻雀。
㈥ java的向下轉型問題
首先還是給出解決辦法吧:
package d;
import c.F;
public class A extends F
{
public static void main(String[] args)
{
A temp = new A();
F f = (F) temp;
if (f instanceof A)
{
A a = (A) f;
System.out.println(a.a());
}
}
輸出結果:
還有不理解可以追問。
㈦ JAVA中關於向下轉型
下轉型就是你上轉型後才能做的操作;
例如:Map map = new HashMap(); 上轉型
HashMap hmap = map;下轉型
一般上轉型都是實現介面編程的,減少兩個類之間的偶合;
下轉型一般是封裝好的對象在解封而已。
㈧ java向下轉型有什麼用
呵呵,這個問題有意思了。
最大的用處是java的泛型編程,用處很大,java的集合類都是這樣的,不過由於是向下轉型,所以不是安全的。 下面是向下轉型的例子:
子類轉型成父類是向上轉型,反過來說,父類轉型成子類就是向下轉型。但是,向下轉型可能會帶來一些問題:我們可以說麻雀是鳥,但不能說鳥就是麻雀。來看下面的例子:
A類:
package a.b;
public class A {
void aMthod() {
System.out.println("A method");
}
}
A的子類B:
package a.b;
public class B extends A {
void bMethod1() {
System.out.println("B method 1");
}
void bMethod2() {
System.out.println("B method 2");
}
}
C類:
package a.b;
public class C {
public static void main(String[] args) {
A a1 = new B(); // 向上轉型
a1.aMthod(); // 調用父類aMthod(),a1遺失B類方法bMethod1()、bMethod2()
B b1 = (B) a1; // 向下轉型,編譯無錯誤,運行時無錯誤
b1.aMthod(); // 調用父類A方法
b1.bMethod1(); // 調用B類方法
b1.bMethod2(); // 調用B類方法
A a2 = new A();
B b2 = (B) a2; // 向下轉型,編譯無錯誤,運行時將出錯
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
}
從上面的代碼我們可以得出這樣一個結論:向下轉型需要使用強制轉換。運行C程序,控制台將輸出:
Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at
a.b.C.main(C.java:14)
A method
A method
B method 1
B method 2
其實黑體部分的向下轉型代碼後的注釋已經提示你將發生運行時錯誤。為什麼前一句向下轉型代碼可以,而後一句代碼卻出錯?這是因為a1指向一個子類B的對象,所以子類B的實例對象b1當然也可以指向a1。而a2是一個父類對象,子類對象b2不能指向父類對象a2。那麼如何避免在執行向下轉型時發生運行時ClassCastException異常?使用5.7.7節學過的instanceof就可以了。我們修改一下C類的代碼:
A a2 = new A();
if (a2 instanceof B) {
B b2 = (B) a2;
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
這樣處理後,就不用擔心類型轉換時發生ClassCastException異常了。
㈨ java向下轉型,有啥作用。求解
向下轉型
將超類的引用強制轉換為子類類型就叫做向下轉型。
注意:將超類的引用賦給為子類類型的變數(沒有進行顯示地強制轉換)是一個編譯
錯誤。
例子:
還是上面的for循環代碼
for(int i=0;i<x.length;i++)
{
if(x[i] instanceof MoreUseful2) // 判斷instanceof左邊的對象是否是右邊的類的實例。
{
MoreUseful2 moreuseful2 = (MoreUseful2)x[i]; // 向下轉型
moreuseful2.u();
}
x[i].g();
}
分析:x[i]可以代表具體的Useful對象類型,當它是MoreUseful2或ExtendsMoreUseful2
對象類型時,就可以調用該對象的額外方法u(),v(),w(),也就是當對象x[i]和Moreusful對
象存在is-a關系時,才可以進行向下轉型,如果要轉換的對象類型與指定的對象類型不
存在is-a關系時,會產生一個ClassCastException異常。
總之:
向下轉型時,對象只能強制轉換為其本身類型或者其超類類型。比如,
當x[i]ExtendsMoreUseful2對象時,可以把他轉換為其本身ExtendsMoreUseful2對象類
型,也可以把它轉換為其基類MoreUseful2類型。但是在編譯時候還不知道這個x[i]是代
表那個具體對象類型只知道這個x[i]是基類類型引用,所以要用這樣的形式" (想要要得
到的類型)x[i] " 進行轉換。x[i]在這里是就我這個例子來說明的,你也可以使用其它的
英文代替,其意義是一切符合規定的需要被轉換的對象。
下面還有個關於向上轉型和向下轉型的例子,
abstract class ClassAbstract1{}
class ClassDerived1 extends ClassAbstract1
{
public void play1()
{
System.out.println("play1() is in the ClassDerived1");
}
}
abstract class ClassAbstract2{public abstract void play2();}
class ClassDerived2 extends ClassAbstract2
{
public void play2()
{
System.out.println("play2() is in the ClassDerived2");
}
}
public class E14_UnCast {
public static void playDemo1(ClassAbstract1 ObjectParameter)
{
((ClassDerived1)ObjectParameter).play1();//向下轉型,可以調用導出類中的擴展方法
}
public static void playDemo2(ClassAbstract2 ObjectParameter)
{
ObjectParameter.play2();//向上轉型,可以調用導出類中的覆蓋方法
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassAbstract1 classabstract = new ClassDerived1();
playDemo1(classabstract);
ClassAbstract2 classabstract2 = new ClassDerived2();
playDemo2(classabstract2);
}
}
運行結果:
play1() is in the ClassDerived1
play2() is in the ClassDerived2
㈩ java中對象的向上向下轉型在開發中用於實現什麼功能
無論是上轉還是下轉都是為了讓類的使用范圍和適用范圍發生變化,以便操作不同范圍的變數或者方法。
1上轉型是指將子類對象使用父類引用進行引用。
得:上轉型對象可以操作和使用子類繼承或者重寫的方法。
失:上轉型對象喪失了對子類新增成員變數或新增的方法的操作和使用。
2與向上轉型相反,即是把父類對象轉為子類對象:作用也與上轉相反。
java
轉型問題其實並不復雜,只要記住一句話:父類引用指向子類對象。子類和父類中定義同名的變數時,僅僅是隱藏了,變數沒有多態性;而對於覆蓋的方法,Java表現出多態性,會調用更具體的子類裡面的方法,無論從哪裡調用,無論使用什麼引用類型調用。