l'orienté objet avec java: problème de code

code java avec des classes,objets,...

a marqué ce sujet comme résolu.

Bonjour.

Je fait ce sujet en espérant trouver réponse à mon problème de code. J’ai un projet éclipse avec quatre fichiers: (main.java, cube.java, form.java , VolumeCalculator.java).

bon je sais pas comment mettre des fichiers .java ?

Excusez de ce premier message un peu brouillon… Cordialement,

Marius

+0 -0

Bon encore désolé C’est pas trop comme ça que je voyait mon message!!

marius007

Salut
Tu peux éditer ton message pour lui donner un meilleur format. En effet, j’ai eu du mal à trouver facilement la définition de la variable t; j’ai même failli répondre en ce sens au départ.

Je ne suis malheureusement pas expert en Java donc je vais peut être dire des bêtises mais dans tous les exemples que j’ai pu voir de variable de classe (j’ai parcourus les premiers résultats donnés par google ! ), on attribut une valeur à la variable par défaut. A vérifier !

+0 -0

Bon encore désolé C’est pas trop comme ça que je voyait mon message!!

marius007

Salut
Tu peux éditer ton message pour lui donner un meilleur format. En effet, j’ai eu du mal à trouver facilement la définition de la variable t; j’ai même failli répondre en ce sens au départ.

Je ne suis malheureusement pas expert en Java donc je vais peut être dire des bêtises mais dans tous les exemples que j’ai pu voir de variable de classe (j’ai parcourus les premiers résultats donnés par google ! ), on attribut une valeur à la variable par défaut. A vérifier !

Angelo

merci

J’ai enlevé le code car il s’affichait mal, si vous savez comment l’afficher ?

je corrige la variable par défaut en attendant….

Sans code, il sera difficile de t’aider :)

D’autant plus que l’affichage n’était pas si mal. Il suffisait de remettre les premières lignes de tes scripts dans la balise code.

Pour mettre du code, le plus simple est de cliquer sur la balise code, sélectionner la langage désiré, en l’occurrence java et copier ton code entre les chevrons

Bon je refait une dernière tentative…

Maintenant, j’ai bien défini t merci Angelo!!

Reste que pour y arriver, j’ai enlever la propriété static et l’erreur de compilation me demande de remettre static. Si je remet, ben le compilateur me dit de l’enlever ???

bon voici les codes j’espère que ça marchera!!!

MAIN.JAVA

package example;

public class Main{
    public double t = 2;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Cube a=new Cube(5);
        Cube b=new Cube(3);
        VolumeCalculator.addForm(a);
        VolumeCalculator.addForm(b);
        t=VolumeCalculator.getTotalVolume();
        System.out.println(t);
    }

}

CUBE.JAVA

package example;

public class Cube extends Form {
    
    public double c;
    
    public Cube(double c) {
        this.c = c;
    }

    public double getVolume() {
        return c * c * c;
    }
    
}

FORM.JAVA

package example;

public abstract class Form {
    public abstract double getVolume();
}
VolumeCalculator.JAVA


package example;

import java.util.ArrayList;

public class VolumeCalculator {
    private static ArrayList<Form> forms = new ArrayList<Form>();
        public static void addForm(Form f) {
        forms.add(f); // ajouter les formes ici

    }
        
        public static double getTotalVolume() {
            double totalVolume = 0;
            for (Form f: forms) {
                totalVolume += f.getVolume();
            }
            return totalVolume;
        }
}

encore merci du temps passer à m’aider. Donc ici ça compile pas car Cannot static reference to a not-static field. :(

edition : enfin ça m’affiche comme je veux :)

edition 2 : et prenez plus en compte le premier post

+0 -0

getTotalVolume retourne une variable de type public static double d’après sa signature

public static double getTotalVolume()

je suppose donc que t doit être déclaré static également
Quel est l’erreur lorsque tu fais ça ?

package example;

public class Main{
    public static double t = 2;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Cube a=new Cube(5);
        Cube b=new Cube(3);
        VolumeCalculator.addForm(a);
        VolumeCalculator.addForm(b);
        t=VolumeCalculator.getTotalVolume();
        System.out.println(t);
    }

}
+0 -0

Le problème est dans ta classe Main.

public class Main {
    public double t = 2;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Cube a=new Cube(5);
        Cube b=new Cube(3);
        VolumeCalculator.addForm(a);
        VolumeCalculator.addForm(b);
        t=VolumeCalculator.getTotalVolume();
        System.out.println(t);
    }
}

Ici, ligne 10, tu utilises la variable t que tu as définie comme un attribut d’instance (non statique, donc) depuis une méthode statique (la méthode main). Les attributs d’instance sont attachés à une instance (comme tes instances de Cube) et ne sont pas accessibles ici car le code n’est pas exécuté depuis une instance de la classe Main. D’ailleurs, vu que tu sembles être sous IntelliJ sauf erreur1, il est probable que ce dernier te souligne la ligne où tu tentes d’utiliser t en te précisant cela.

Si c’est un peu obscur, je te conseille de re-voir la différence entre champs statiques et non-statiques en Java.

Ici, la solution pour corriger cela, ce serait ou de changer l’attribut t afin qu’il soit statique, et donc accessible depuis la méthode main :

public static double t;

…ou, mieux vu que tu ne t’en ressers pas, supprimer l’attribut et se contenter d’une variable dans la méthode main (sauf s’il est prévu que ça change bien entendu) :

public static void main(String[] args) {
    // […]
    final double t = VolumeCalculator.getTotalVolume();
    System.out.println(t);
}

Et si le code est définitif (que tu ne prévoies pas d’utiliser autrement la valeur récoltée) tu peux même te passer complètement d’une variable :

public static void main(String[] args) {
    // […]
    System.out.println(VolumeCalculator.getTotalVolume());
}

Remarque indépendante sur l’ensemble du code et sa logique

Sur une note indépendante, je pense que tu gagnerais, en terme de logique de code, à stocker les volumes de ton calculateur dans une instance et non au niveau de la classe, ce qui permettrait aussi d’en utiliser plusieurs simultanément, et de ne pas partager un état sur tout le programme alors que ce n’est pas forcément utile ou souhaitable (sauf si c’est réellement volontaire, alors je ne dis rien). Quelque chose comme ça, pour l’utilisation (ce qui ne change pas grand chose au code de la classe VolumeCalculator d’ailleurs, mais qui est je trouve plus logique) :

final VolumeCalculator calculator = new VolumeCalculator();

// Ou `addShape` ? `form` en anglais se traduit par “formulaire”, pas “forme” :)
calculator.addForm(a);
calculator.addForm(b);

final double t = calculator.getTotalVolume();

@Angelo : le retour d’une méthode statique peut sans aucun problème être stocké dans une variable non-statique, le problème ne venait pas de là :) Strictement parlant, le type de retour de getTotalVolume c’est juste double, public static n’étant que des précisions sur la méthode elle-même et non ce qu’elle renvoie.

La solution que tu proposes fonctionne, mais pas pour la raison que tu indiques ^^ .


  1. Cf. le commentaire typique du code généré d’IntelliJ IDEA

+0 -0

symptomes : Ce commentaire est assez révélateur :

Bon je refait une dernière tentative… Reste que pour y arriver, j’ai enlever la propriété static et l’erreur de compilation me demande de remettre static. Si je remet, ben le compilateur me dit de l’enlever ???

marius007

Diagnostic : tu bricoles au pif

en espérant tomber sur du code que le compilateur accepte. Tu as probablement eu un message comme quoi "on ne peut pas appeler une méthode non statique dans un contexte statique", tu as collé le mot-clé static pour essayer d’arranger ça, et tu ne t’en sors pas.

Reprenons calmement,

en reconstituant l’énoncé.

  1. Tu as des Formes diverses, dont des Cubes (c’est probablement un exercice sur interfaces/classes abstraites/polymorphismes) qui ont chacun un volume.

  2. On te demande de faire un Calculateur de volume : on lui donne des formes, il fait la somme des volumes.

(Le but pédagogique, c’est de faire constater que, si chaque Forme concrète (Cube, etc) doit avoir une méthode qui retourne le volume, on a besoin que cette méthode soit déclarée au niveau de Form.

Remarque : A priori c’est bizarre d’avoir un seul calculateur pour tout le programme. Pourquoi ne pas avoir plusieurs instances ?

Solution

ce sont des objets comme les autres. Rien de statique dedans

class Calculateur {
    ...
    void ajouter(Form f) { .... }
    double volumeTotal() { ..... }
}

et ça s’utiliserait comme ça

static void Main(...) {
   Cube a = ...;
   Sphere b = .... ;
  
   Calculateur calc = new Calculateur();
   calc.ajouter(a);
   calc.ajouter(b);
   System.out.format("Volume total = %f\n", calc.volumeTotal());
}
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte