Probème de variable
Résolu
speedzealot
Messages postés
19
Statut
Membre
-
speedzealot Messages postés 19 Statut Membre -
speedzealot Messages postés 19 Statut Membre -
bonjour a tous, en simplifiant mon code, cela donne ca :
Pourquoi ? et comment y remedier ?
merci de vos reponses
public class Mere {
protected Integer integer;
private Thread t;
public Mere() {
integer = 1;
t = new Thread(new ClasseFille());
}
public void update() {
if (t.getState() == State.NEW) t.start();
}
}
public class ClasseFille extends Mere implements Runnable {
public ClasseFille() {
}
public void run() {
System.out.println(integer); //et au lieu de m'afficher 1, il m'affiche null...
}
}
Pourquoi ? et comment y remedier ?
merci de vos reponses
A voir également:
- Probème de variable
- Le fichier contient un programme écrit en python. le programme construit un mot secret mais il ne l'affiche pas. modifiez ce programme afin que à chaque itération de la boucle : la variable a augmente de 2 la variable b diminue de 1 ajoutez une instruction pour faire afficher le mot secret construit. quel est ce mot secret ? ✓ - Forum Python
- Variable objet ou variable de bloc with non définie - Forum VB / VBA
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp ✓ - Forum Microsoft Office
- Vba range avec variable ✓ - Forum VB / VBA
- Variable objet ou bloc "with" non définie - Forum VB / VBA
je vais developper mon probleme :
J'utilise Slick2D et ma classe mere c'est ma fenetre de jeu.
je voudrai creer un nouveau thread depuis cette classe mere et, que ce nouveau thread hérite des variables de classes de ClasseMere (parce que je n'ai pas vraiment envis de creer des accesseurs pour ces 10 parametres, ni meme de changer la portee de ces parametres à "package", ca me compliquer trop le travail de maintenance et ce serai plus lourd a l'execution, sachant que ce thread va faire une grosse serie d'action assez lourde, sans s'arreter)
Donc ce thread j'ai voulu le faire implementer l'interface Runnable.
public class Mere extends BasicGame{ protected Integer integer; //d'autres variables de classes protected private Thread t; public Mere() { super("mon jeu"); } @Override public void init(GameContainer container) { integer = 1; //initialisation des variables de classe t = new Thread(new ClasseFille()); } @Override public void render(GameContainer container) { if (t.getState() == State.NEW) t.start(); } }public class ClasseFille extends Mere implements Runnable { public ClasseFille() { } public void run() { System.out.println(integer); //et au lieu de m'afficher 1, il m'affiche null... //idem pour les autres variables de classe.. } }peut-on vraiment creer un heritage de cette maniere en passant par la classe mere qui est deja instanciée ou dois-je revenir sur une methode moins subtile ?
L'héritage c'est pour des classes afin qu'elles génèrent des objets qui ont des comportement communs, plus une spécificité pour l'objet de la classe fille.
On parle donc de deux objets totalement distincts, qui n'interagissent pas entre eux, c'est leur code qui est commun, pas leurs états.
Avec :
public Mere() { integer = 1; t = new Thread(new ClasseFille()); }public ClasseFille() { super(); // appel du constructeur Mere() qui fait integer=1 }Ici ça va fonctionner, on va bien avoir integer==1 dans l'objet ClasseFille car le constructeur a appelé le code de Mere.Avec :
public void init(GameContainer container) { integer = 1; }public ClasseFille() { }Ici ça ne fonctionne pas, car l'objet de ClasseFille est construit sans rien faire, il faudrait appeler la méthode init() pour l'objet fille - de la même manière que pour l'objet Mere - afin que cela fonctionne.Si j'ai bien compris ce que tu cherches à faire, c'est suivre dans tous les objets de ClasseFille l'évolution de l'état d'un objet Mere en particulier. Mais ce n'est pas de l'héritage.
Passer en paramètre l'objet Mere à ClasseFille (qui n'est de toute façon pas une classe fille puisque l'héritage ne sert à rien dans ton cas) est pour moi la manière la plus propre de faire. Il en existe une manière plus directe mais si tu peux éviter c'est mieux, voici un exemple (on appelle ça des inner classes) :
public class Mere extends BasicGame { private Integer integer; // plus besoin de protected // ... public Mere() { super("mon jeu"); } @Override public void init(GameContainer container) { integer = 1; // ... } public class Fille implements Runnable { @Override public void run() { System.out.println(integer); } } public static void main(String[] args) { Mere m1 = new Mere(); Mere m2 = new Mere(); Fille f11 = m1.new Fille(); f11.run(); // null m1.init(null); f11.run(); // 1 Fille f12 = m1.new Fille(); f12.run(); // 1 Fille f2 = m2.new Fille(); f2.run(); // null } }Remarque : je te conseilles de renommer tes classes Mere et Fille, car il n'y a vraiment aucune relation d'héritage ici.
Une troisième manière de faire, serait de mettre les deux classes en une (à ne pas utiliser si BasicGame implémente déjà Runnable, c'est à dire si la classe Mere hérite d'une méthode run() que ce code viendrait remplacer à tort).
public class Mere extends BasicGame implements Runnable { private Integer integer; //d'autres variables de classes private private Thread t; public Mere() { super("mon jeu"); } @Override public void init(GameContainer container) { integer = 1; //initialisation des variables de classe t = new Thread(this); } @Override public void render(GameContainer container) { if (t.getState() == State.NEW) t.start(); } @Override public void run() { System.out.println(integer); } }(mes classes ne s'appelles pas du tout ClasseMere et ClasseFille, c'etait juste pour les rendre plus explicite dans ma demande ^^)
enfin la ca marche tres bien :) et les threads fonctionnent bien simultanément :)