簡體   English   中英

為什么我不能從超類對象調用子類方法

[英]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.

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