174 votes

Y a t'il un moyen d'éviter cela ?

<pre><code></code><p>La fonction doIt s’imprimera « papa ». Y a-t-il un moyen de faire impression « fils » ?</p></pre>

104voto

Mike Points 1103

En bref, non, il n'est pas possible de supprimer une variable de classe.

Vous ne remplacent pas les variables de classe en Java vous cacher. Primordial est pour les méthodes d'instance. Le masquage est différent de primordial.

Dans l'exemple que vous avez donné, en déclarant la variable de classe avec le nom de " moi "dans la classe Fils vous cacher la variable de classe, il aurait hérité de sa super-Papa avec le même nom de "moi". Le masquage d'une variable dans cette façon de ne pas affecter la valeur de la variable de classe " moi " dans la superclasse Papa.

Pour la deuxième partie de votre question, de comment le faire imprimer "fils", j'avais définir la valeur par le constructeur. Bien que le code ci-dessous s'écarte de l'original de votre question beaucoup de choses, je voudrais écrire quelque chose comme ceci;

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println(name);
    }
}

Le JLS donne beaucoup plus de détails sur la cacher dans la section 8.3 - Champ Déclarations

31voto

romaintaz Points 32120

Oui, juste remplacer le `` méthode :

17voto

John Strickler Points 8534

Vous pouvez créer un accesseur get et puis substituer l’accesseur Get. Il est particulièrement utile si la variable que vous substituez est une sous-classe d’elle-même. Imaginez votre super classe a un membre mais dans votre classe subsidiaire, c’est maintenant plus défini pour être un .

12voto

nixxbb Points 125

J'ai toujours le code de la flexibilité, parce qu'un jour, il peut avoir une fille, ou trouver une épouse. Ma devise est, si vous allez pour le remplacer ne pas fournir une implémentation concrète pour cela, utilisez toujours des abstractions. Cet exemple va vous montrer pourquoi. Voici une manière flexible à la conception de cette:

     public interface Person {
        public abstract String getName();
       //this will be different for each person, so no need to make it concrete
        public abstract void setName(String name);
    }

Maintenant, nous pouvons ajouter le Papa:

public class Dad implements Person {

    private String name;

    public Dad(String name) {
        setName(name);
    }

    @Override
    public final String getName() {
    return name;
    }

    @Override
    public final void setName(String name) {
        this.name = name;
    }
}

le fils:

public class Son implements Person {

    private String name;

    public Son(String name) {
        setName(name);
    }

    @Override
    public final String getName() {
        return name;
    }

    @Override
    public final void setName(String name) {
        this.name = name;
    }
}

et Papa a rencontré une gentille dame:

public class StepMom implements Person {

    private String name;

    public StepMom(String name) {
        setName(name);
    }

    @Override
    public final String getName() {
        return name;
    }

    @Override
    public final void setName(String name) {
        this.name = name;
    }
}

On dirait que nous avons une famille, permet de dire au monde leurs noms:

public class ConsoleGUI {

    public static void main(String[] args) {
        List<Person> family = new ArrayList<Person>();
        family.add(new Son("Tommy"));
        family.add(new StepMom("Nancy"));
        family.add(new Dad("Dad"));
        for (Person person : family) {
            //using the getName vs printName lets the caller, in this case the
            //ConsoleGUI determine versus being forced to output through the console. 
            System.out.print(person.getName() + " ");
            System.err.print(person.getName() + " ");
            JOptionPane.showMessageDialog(null, person.getName());
    }
}

}

Système.hors de Sortie : Tommy Nancy Papa
Système.l'erreur est la même que ci-dessus(juste a police rouge)
JOption De Sortie:
Tommy alors
Nancy puis
Papa

6voto

Cela ressemble à un défaut de conception.

Supprimez le mot clé static et définissez la variable par exemple dans le constructeur. Cette façon fils définit simplement la variable à une valeur différente dans son constructeur.

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