簡體   English   中英

將子對象作為父參數發送

[英]sending a child object as a parent parameter

我遇到了這段代碼:

public class B extends A
{....}

public class C extends A
{...
 public boolean f(A a)
   {...}
}
//driver
...
A y1=new B();
B y2=new B();
A z1=new C();
C z2=new C();
//1 System.out.println(z1.f(z2));
//2 y1.dosmth()==((B)(z1).dosmth());

我最初認為#1是不正確的,因為f只能接收定義為A的對象,但顯然它也適用於A對象(z2被定義為C並且是C的對象)。 是否繼承限制使用接收方法的方法定義與方法相同?

關於#2:我知道只有在對象具有任何繼承關系時才能進行轉換。 即,我不能做(Animal)table但它似乎在這里工作。 是因為B像A一樣延伸A嗎? 雖然它看起來像我(Dog)cat或類似的東西。

非常感謝您的投入!

好問題!

a表示a的類型為A.由於C是A的Child,因此System.out.println(z1.f(z2))有效。 這就像說:

A =新C()

f(z2) - > f(a)。

如果dosmth()在A中,或者它在B和C中,則語句#2也應該運行。 我在下面的解釋應該有助於解釋原因:

如果B和C擴展A,它們都具有A的所有非私有屬性。

例如,如果A有一個公共方法getMe(),那么B和C將有一個公共方法getMe(),無論你是否在B和C中放置了一個getMe()方法。

但是,如果在B和C類中有getMe(),則可能會發生覆蓋。 當重寫發生時,Child Class的getMe()方法中的屬性將優先於Parent Class的getMe()方法。 如果Child Class getMe()的屬性與Parent Class getMe()不同,則覆蓋可能會影響在對象上調用getMe()時發生的情況。 如果你沒有在B和C類中放入getMe(),B和C將自動接收A的getMe()。

當您將Child Class對象設置為Parent Class類型的變量並在Parent Class變量上調用Parent Class變量時,需要將Parent Class強制轉換為其子類。

動物var1 =新狗()

動物var2 =新貓()

(狗)var1.bark()//因為並非所有動物都吠叫!

通過強制轉換,你告訴編譯器,“相信我!我知道這是一只狗。只要順其自然!”,因為編譯器不知道你正在使用哪種類型的Animal。 編譯器只知道它正在使用Animal。 由於Animal類沒有bark()方法,編譯器會認為在不進行強制轉換時會發生錯誤。 通過將Animal轉換為Dog,您告訴編譯器假設Animal的這個特定實例是Dog。

希望這可以幫助!

  1. 您應該能夠通過OOP原則以與父類相同的方式使用子類

  2. Java允許您在Compile-Time中的同一繼承樹中將某些內容轉換為任何內容。 但是如果你試圖將一只變成狗,你可能會在運行時獲得java.lang.ClassCastException 它就像“嘿Java,相信我, 顯然是一只狗 !沒有任何問題。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM