Comment appeler la méthode de sous-classe (Java)


Kebster

Je suis assez nouveau sur Java. Je travaillais sur une mission où j'ai une superclasse et plusieurs sous-classes, où certaines sous-classes ont des attributs que les autres n'ont pas. Essentiellement, je dois créer un tableau d'objets SuperClass, puis initialiser chaque élément du tableau avec l'une des sous-classes.

Cependant, lorsque j'essaie d'utiliser l'une des méthodes spécifiques des sous-classes, j'obtiens une erreur de compilation m'indiquant que la méthode .getY () n'a pas été trouvée dans la SuperClass , alors qu'elle est clairement définie comme une méthode de SuperClass . J'ai résumé le problème au code suivant (en m'assurant que j'obtiens toujours la même erreur):

public class StackOverFlow {
public static void main(String[] args) {
    /*
    SubClass obj = new SubClass(4, 5); 
    System.out.println(obj.getX()); 
    System.out.println(obj.getY()); 
    */
    SuperClass[] arr; 
    arr = new SuperClass[5]; 
    arr[0] = new SubClass(5, 10); 
    System.out.println(arr[0].getX());  
    System.out.println(arr[0].getY()); 
}}

public class SuperClass {
private int x; 
public SuperClass(int x){
    this.x = x; 
}
public int getX() {
    return x;
}
public void setX(int x) {
    this.x = x;
}}


public class SubClass extends SuperClass{
private int y; 
public SubClass(int x, int y){
    super(x); 
    this.y = y; 
}
public int getY() {
    return y;
}
public void setY(int y) {
    this.y = y;
}}

Lorsque j'utilise le code commenté, je n'obtiens pas d'erreur, ce qui signifie probablement que l'erreur provient d'une utilisation incorrecte du tableau de classes. Quelqu'un peut-il m'aider?

Stephen P

Votre tableau déclaré arrest un tableau d' objets SuperClass de type (classe) . Tout ce qui se trouve dans le tableau doit être une chose qui est une SuperClasse .

Votre sous-classe nommée SubClass EST une chose de type SuperClass - c'est une extension de cette classe, en ajoutant yet getY, mais elle est toujours conforme à SuperClass . Tout ce que vous pouvez faire avec SuperClass, vous pouvez également le faire avec SubClass, vous êtes donc autorisé à ajouter des objets SubClass au tableau de type SuperClass .

Là où se trouve votre erreur, à arr[0].getY(), la chose qui est à l'endroit arr[0]est, en fait, une sous-classe, parce que vous venez de la mettre là, mais il n'y a aucune garantie que ce soit le cas - la seule garantie est que les choses dans le tableau sont du type SuperClass , et les choses de type SuperClass n'ont pas de getY()méthode.

Lorsque vous savez qu'une chose est de type SubClass, vous pouvez la caster , comme :, et vous (SubClass) arr[0]devez la mettre entre parenthèses pour appliquer la distribution avant d'attacher l'appel de méthode, de sorte que ((SubClass) arr[0]).getY()
Casting a ses propres erreurs potentielles, si vous essayez de lancer quelque chose à SubClass lorsque cette chose n'est pas réellement une sous- classe, cela provoquera une erreur (mais c'est une autre discussion).

Donc, la réponse à la question "Comment appeler une méthode de sous-classe" est de convertir l'objet en sous-classe:

// Direct replacement for your line of code:
System.out.println( ((SubClass) arr[0]).getY() );

// or assign it to another variable first:
SubClass sc = (SubClass) arr[0];
System.out.println( sc.getY() );

Articles connexes