[英]why can't i call a subclass method from a superclass object
Consider below two classes
class Parent {
public void parentMethod(){
System.out.println("inside parentMethod");
}
}
public class child extends Parent {
public void childMethod(){
System.out.println("inside childMethod");
}
public static void main(String [] args){
Parent p =new Child();
p.childMethod();
}
}
為什么我不能使用以下語法調用子類方法? 父 p = 新子 (); p.childMethod();
p 持有的對象類型是 Child 的類型,但我仍然無法調用子類方法。 為什么這樣的調用在java中無法完成?
因為變量的類型是Parent
。 這意味着它可以保存任何Parent
類型的對象,無論是Child
還是其他任何實現Parent
類的對象。 編譯器不能保證該變量將包含一個Child
,因為您告訴它使該變量成為一個Parent
。
要調用Child
上的方法,請將變量設為:
Child p = new Child();
p.childMethod();
或者,如果您可以自己保證變量指向Child
對象,則可以強制轉換它:
Parent p = new Child();
Child c = (Child)p;
c.childMethod();
盡管有一個論點是,如果您始終可以保證變量將是Child
那么它首先應該是Child
類型。
您不能調用該方法,因為Parent#childMethod
不是方法。 Child#childMethod
是一種方法。
想一想:
Parent p = new Parent();
p.childMethod();
你應該能夠做到這一點嗎? 不,因為您有一個Parent
實例。
您的左值是Parent
因此您將只能調用Parent
中定義的方法。 要執行您想要的操作,您需要將Parent
轉換為Child
,但您需要確保它實際上是Child
一個實例:
if(p instanceof Child) {
((Child)p).childMethod()
}
這是因為引用變量類型是 Parent 類型。 因此,變量只能訪問引用類的屬性和行為。 請注意,您可以覆蓋子類中的方法...例如:
public class child extends Parent {
@Override
public void parentMethod(){
System.out.println("inside childMethod");
}
public static void main(String [] args){
Parent p =new Child();
p.childMethod(); // PRINTS "inside childMethod"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.