2 votes

Héritage des classes Java

Aquí il est dit que :

MountainBike dispose ainsi des mêmes champs et méthodes que Bicycle, tout en permettant à son code de se concentrer exclusivement sur les caractéristiques qui le rendent unique. Cela rend le code de vos sous-classes facile à lire. Cependant, vous devez veiller à documenter correctement l'état et le comportement que chaque superclasse définit, car ce code n'apparaîtra pas dans le fichier source de chaque sous-classe.

Cependant, dans mon code, l'héritage ne fonctionne pas correctement, probablement à cause d'une faille dans mon code ?

package java1;

class bicycle {
    int speed = 0;
    int gear = 1;

    void accelerate(int incr) {
        speed = speed + incr;
    }

    void decelerate(int incr) {
        speed = speed - incr;
    }

    void changeGear(int val) {
        gear = val;
    }

    void printInfo() {
        System.out.println("Speed: " + speed + " Gear: " + gear);
    }
}

class mountainbike extends bicycle {
    int speed = 10;
}

public class Main {

    public static void main(String[] args) {

        mountainbike mb1 = new mountainbike();

        mb1.accelerate(20);
        mb1.accelerate(10);

        mb1.printInfo();

    }

}

La classe mountainbike devrait hériter de toutes les caractéristiques de la classe bicycle, non ? J'ai ajouté une propriété unique qui est int speed = 10 La vitesse de départ devrait donc être de 10. Cependant, lors de l'exécution, le compilateur considère que la vitesse de départ est de 0.

Des idées ?

6voto

Gregory Pakosz Points 35546

Non, votre Mountainbike ne doit pas redéfinir une classe speed variable. Vous devez passer la vitesse initiale ( 10 ) au constructeur de sa super classe en utilisant super dans le cadre de l'appel au constructeur :

package java1;

class Bicycle
{

  Bicycle(int speed, int gear)
  {
    this.speed = speed;
    this.gear = gear;
  }

  public void accelerate(int incr)
  {
    speed = speed + incr;
  }

  public void decelerate(int incr)
  {
    speed = speed - incr;
  }

  void changeGear(int val)
  {
    gear = val;
  }

  public String toString()
  {
    return "Speed: " + speed + " Gear: " + gear;
  }

  private int speed = 0;
  private int gear = 1;

}

class Mountainbike extends Bicycle
{
  public Mountainbike()
  {
    super(10, 1);
  }
}

public class Main {

  public static void main(String[] args)
  {    
    Mountainbike mb1 = new Mountainbike();

    mb1.accelerate(20);
    mb1.accelerate(10);

    System.out.println(mb1);
  }
}

Je vous déconseille d'utiliser protected variables pour la vitesse et le rapport. Une bonne pratique consiste à renforcer l'encapsulation en déclarant la variable speed y gear variables private dans la classe de base.


EDIT :

Apparemment, vous débutez avec la programmation Java. Je vous suggère de jeter un coup d'oeil à ce livre gratuit en ligne écrit par Bruce Eckel : Penser en Java .

5voto

r3zn1k Points 973
public class Bicycle {
   private int speed;

   public Bicycle (int speed) {
      this.speed = speed;
   }
}

public class Mountainbike extends Bicycle {
   public Mountainbike() {
      super(10);
   }
}

4voto

Michael Borgwardt Points 181658

Vous ne pouvez pas modifier les champs, mais uniquement les méthodes. Ce que vous devez faire, c'est marquer le champ speed comme protected Pour cela, ajoutez un constructeur à votre sous-classe et définissez la valeur du champ dans ce constructeur, comme ceci :

class Mountainbike extends Bicycle {
    public Mountainbike()
    {
        speed = 10;
    }
}

BTW, notez que j'ai corrigé les noms de vos classes : Java a une convention très forte pour les noms de classe en majuscules ; utiliser des noms de classe en minuscules ne fera qu'embrouiller les personnes qui regardent votre code.

3voto

Jon Skeet Points 692016

Vous avez introduit un nouveau speed variable dans mountainbike qui cache celui de bicycle . C'est une mauvaise idée - avoir deux variables avec le même nom à différents niveaux de la hiérarchie des types entraînera une confusion, en particulier lorsqu'elles sont toutes deux accessibles.

Au lieu de cela, vous voulez changer la valeur de l'élément existente variable à 10. Par exemple :

class mountainbike extends bicycle {
    mountainbike() {
        speed = 10;
    }
}

IMO le champ devrait vraiment être privé dans la classe de base, accessible via une propriété à la place - et comme d'autres ont posté, avoir un constructeur dans la classe de base qui accepte la vitesse initiale serait également une bonne idée.

1voto

Patrick Points 12559

En fait, vous redéfinissez la vitesse sur le terrain dans votre classe de VTT.

Par exemple, vous pouvez définir la vitesse dans le constructeur de la classe mountainbike.

class mountainbike extends bicycle {
 mountainbike() {
   speed=10;
 }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X