本文目錄一覽:
java 向上轉型 向下轉型
1.
引用a的類型是animal,是cat的父類。所以是“父類引用指向子類對象”。如果是“子類引用指向父類對象”,那應該寫成
cat
a
=
new
animal();但這顯然是不和邏輯的。
2.
你說的沒錯——“向上轉型後,父類也只能調用父類已經有的方法”。但是子類如果覆蓋了父類的方法,那麼即使向上轉型,方法的行為也表現為覆蓋後的行為。這也是多態的一種體現。向上轉型更多的用來體現一種編程上的“約定”。所有繼承某個類或者實現某個接口的類,一定包含某個方法,這樣在調用的時候,使得你也不必關係具體的實現細節,只要知道“這個類型中的某個方法能幫我完成工作”就可以了。
3.
向下轉型,是“引用的類型”的變化,不是對象實例類型的變化。new什麼,就是什麼。不會因為向上或者向下轉型而改變自己的類型。
4.
最後一個問題,不管向上還是向下轉型,調用的都是實際類型中的那個方法。比如,animal
a
=
new
cat(); a.叫()。那這個叫就是cat類型實例中的“叫”方法。
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());
}
}
輸出結果:
你的要求無法實現。因為在你的例子中,f本身並不是由A類型向上轉型為F得來的,所以本身是不會帶有A的特性的,強制轉換為A會失敗,因為f在堆中的內容並未包括A類型的特性。即使你強制轉換為A,A的新構造函數並不會調用,所有A額外的特性不會在堆中聲明,所以會報錯。Java中的向下轉型是有條件的,你向下轉型的對象必須原本在堆中包含了目的類型的內容,也就是說這個對象必須原本就是目的類型或其子類,只不過是通過向上轉型現在不是目的類型或其子類罷了(但是堆中還是由該目的類型的特性存在,理解這一點很重要!)
有一個簡單的辦法驗證這一點,就是你向下轉型的時候,目的類型的構造函數並不會再一次調用,這樣一來也就不會有目的類型的特性了,調用目的類型的特性自然而然就會失敗了:
class Parent
{
public Parent()
{
System.out.println(“This is Parent”);
}
}
public class Child extends Parent
{
public Child()
{
System.out.println(“This is Child”);
}
public static void print()
{
System.out.println(“print()”);
}
public static void main(String[] args)
{
Child test1 = new Child();
Parent temp1 = (Parent) test1;
Child target1 = (Child) temp1;
target1.print();
Parent test2 = new Parent();
Child target2 = (Child) test2;
target2.print(); // 報錯
}
}
輸出結果:
還有不理解可以追問。
java中向上轉型,向下轉型,強制類型轉換的原理?
向上或者向下轉型
就要說到繼承
比如有2個類
a
b
b繼承a
先
b
b
=
new
b();
這個時候
a
a
=
b;
這種用法就是向上轉型
使用父類的引用
引用子類對象
向上轉型是自動的不需要其他操作
然後在上邊的基礎上
b
=
(b)a
這個就是向下轉型
當用父類引用
引用子類對象
現在想不使用父類的引用
而使用子類的引用
就是向下轉型
向下轉型必須強制轉型
必須確定對象確實是子類對象
如果是父類對象那就會報錯
java多態向上轉型向下轉型的問題
引用a的類型是Animal,是Cat的父類。所以是“父類引用指向子類對象”。如果是“子類引用指向父類對象”,那應該寫成 Cat a = new Animal();但這顯然是不和邏輯的。
你說的沒錯——“向上轉型後,父類也只能調用父類已經有的方法”。但是子類如果覆蓋了父類的方法,那麼即使向上轉型,方法的行為也表現為覆蓋後的行為。這也是多態的一種體現。向上轉型更多的用來體現一種編程上的“約定”。所有繼承某個類或者實現某個接口的類,一定包含某個方法,這樣在調用的時候,使得你也不必關係具體的實現細節,只要知道“這個類型中的某個方法能幫我完成工作”就可以了。
向下轉型,是“引用的類型”的變化,不是對象實例類型的變化。new什麼,就是什麼。不會因為向上或者向下轉型而改變自己的類型。
最後一個問題,不管向上還是向下轉型,調用的都是實際類型中的那個方法。比如,Animal a = new Cat(); a.叫()。那這個叫就是Cat類型實例中的“叫”方法。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/129913.html