java sur Si vous remplacez un champ dans une sous-classe d'une classe, la sous-classe a deux champs avec le même nom(et le type différent)?




la relation doit inclure le même nombre de champs avec le même type de données (2)

Les variables membres ne peuvent pas être remplacées comme des méthodes. Les variables de number dans vos classes Beta et Gama cachent (sans surcharger) le number de variable membre de la superclasse.

En castant vous pouvez accéder au membre caché dans la superclasse.

J'ai 3 classes:

public class Alpha {
    public Number number;
}

public class Beta extends Alpha {
    public String number;
}

public class Gama extends Beta {
    public int number;
}

Pourquoi le code suivant compile-t-il? Et, pourquoi le test passe-t-il sans erreurs d'exécution?

@Test
public void test() {
    final Beta a = new Gama();
    a.number = "its a string";
    ((Alpha) a).number = 13;
    ((Gama) a).number = 42;

    assertEquals("its a string", a.number);
    assertEquals(13, ((Alpha) a).number);
    assertEquals(42, ((Gama) a).number);
}

Answer #1

Les champs ne peuvent pas être écrasés . ils ne sont pas accédés polymorphiquement en premier lieu - vous êtes juste en train de déclarer un nouveau champ dans chaque cas.

Il compile parce que dans chaque cas le type de compilation de l'expression est suffisant pour déterminer quel champ appelé number vous voulez dire.

Dans la programmation du monde réel, vous éviteriez cela par deux moyens:

  • Bon sens: les champs d'observation rendent votre code plus difficile à lire, alors ne le faites pas
  • Visibilité: si vous rendez tous vos champs privés, les sous-classes ne les connaîtront pas de toute façon




jls