2015-06-21 11 views
5

Sto tentando di creare un metodo di annullamento che calcola la media, ma vorrei passare valori al metodo dal metodo principale. Ecco un esempio di quello che sto cercando di fare:passaggio di valori oggetto ai metodi

public class Plant { 

    int leaves; 
    int age; 
    int sumLeaves; 
    double average; 

    void averageLeaves() { 

     sumLeaves = leaves + leaves; //here is where I need help 
     average = (double) sumLeaves/2; 
     System.out.println("The average number of leaves is: " + average); 

    } 

    public static void main(String[] args) { 

     Plant plantA = new Plant(); 
     plantA.leaves = 5; 

     Plant plantB = new Plant(); 
     plantB.leaves = 3; 

     averageLeaves(); 

    } 

Il problema che sto avendo è ottenere i valori di più impianti nel metodo. Ho provato a utilizzare .get, loop, static e molte altre cose e non l'ho ancora capito. Quello che voglio è il valore di plantA.leaves e plantB.leaves per il metodo per trovare la loro somma.

risposta

4

Dato che il valore averageLeaves() è definito nella classe Plant, è necessario richiamare il metodo da una delle istanze di impianto. Ecco come dovresti farlo.

plantA.averageLeaves(); 

Un grosso errore che state facendo qui è,

sumLeaves = leaves + leaves;   

Questo in realtà aggiunge le foglie di una specifica (uno) istanza di piante, è sbagliato. devi effettivamente passare il numero di foglie da istanze di differenza.

Ecco un modo più bello per farlo utilizzando getter & setter. Inoltre avrebbe molto senso rendere statico il metodo averageLeaves(). In questo modo non hai bisogno di un'istanza per invocare il metodo.

public class Plant { 

    int leaves; 
    int age; 
    //int sumLeaves; you do not need them now, as the averageLeaves method is static 
    //double average; 

    static void averageLeaves (int leaves1, int leaves2) { 

     int sumLeaves = leaves2 + leaves1;    //here is where I need help 
     double average = (double) sumLeaves/2; 
     System.out.println("The average number of leaves is: " + average); 
    } 

    void setLeaves(int leaves){ 
     this.leaves = leaves; 
    } 

    int getLeaves(){ 
     return this.leaves; 
    } 
} 

    public class Main { 

    public static void main(String[] args) { 

     Plant plantA = new Plant(); 
     plantA.setLeaves(5); 

     Plant plantB = new Plant(); 
     plantB.setLeaves(3); 

     Plant.averageLeaves(plantA.getLeaves(), plantB.getLeaves()); 
    } 
} 
+1

ovviamente, non sarebbe più sintatticamente logico che 'averageLeaves' sia' static'? –

+0

Sì, lo stavo pensando anch'io. forse dovrei aggiungerlo alla risposta. – Fawzan

+0

Potrebbe essere confuso con OP (ma forse imparerà qualcosa ...) –

0

Si dovrà fare in questo modo:

public class Plant 
{ 
    int age; 
    int sumLeaves; 
    double average; 

    void averageLeaves (int leaves) 
    { 
     sumLeaves = leaves + leaves;    //here is where I need help 
     average = (double) sumLeaves/2; 
     System.out.println("The average number of leaves is: " + average); 
    } 
} 

public class Example 
{ 
     public static void main(String[] args) 
     { 
      Plant plantA = new Plant(); 
      plantA.leaves = 5; 

      Plant plantB = new Plant(); 
      plantB.leaves = 3; 

      plantA.averageLeaves(plantA.leaves); 
      plantB.averageLeaves(plantB.leaves); 
     } 
} 

Guardate che hai solo per dichiarare le variabili che si desidera introdurre nel metodo (all'interno della parentesi) e quando si utilizza il metodo che hanno per passare i valori che il metodo utilizzerà (in ordine di dichiarazione nel metodo).

Mi aspetto che sia utile per voi!

+0

Penso che trovare la chiamata a un metodo non statico senza riferimento a un oggetto sia complicato ... –

+0

@BenKnoble Cosa intendi? –

+0

'averageLeaves' è un metodo di istanza della classe' Plant', quindi è richiesta un'istanza di 'Plant' per invocarlo. Nel tuo 'main' hai una chiamata al metodo senza un'istanza di un oggetto che la invoca. O rendi il metodo statico o chiamalo 'plantA' o' plantB'. –

0

È poco chiaro cosa intendi. La media della pianta stessa? La media delle due piante. Sto assumendo quest'ultimo. Quindi un modo per farlo è invocare il metodo come membro statico e passare le foglie come argomenti.

public class Plant { 

    int leaves; 

    static void averageLeaves (int leaves1, int leaves2) { 
     int sumLeaves = leaves1 + leaves2; //here is where I need help 
     double average = (double) sumLeaves/2; 
     System.out.println("The average number of leaves is: " + average); 
    } 

    public static void main(String[] args) { 

     Plant plantA = new Plant(); 
     plantA.leaves = 5; 

     Plant plantB = new Plant(); 
     plantB.leaves = 3; 

     Plant.averageLeaves(plantA.leaves, plantB.leaves); 

} 
0

Ecco una versione semplice che consente di passare un numero variabile di piante e calcolare la loro media.

public class Plant { 
    private int leaves; 

    public Plant(int leaves) { 
     this.leaves = leaves; 
    } 

    public int getLeaves() { 
     return this.leaves; 
    } 

    public static void main(String[] args) { 
     PrintLeavesAverage(
      new Plant(5), 
      new Plant(10), 
      new Plant(15), 
      new Plant(12) 
     ); 
    } 

    private static void PrintLeavesAverage(Plant... plants) { 
     int totalLeaves = 0; 
     for (Plant p : plants) { 
      totalLeaves += p.getLeaves(); 
     } 
     double average = (double)totalLeaves/plants.length; 
     System.out.println("The average number of leaves is: " + average); 
    } 
} 

... o se si vuole ottenere un po 'più elaborato, e volete provare alcune delle Java 8 nuove funzionalità, è possibile utilizzare i flussi per calcolare la media in questo modo:

private static void PrintLeavesAverage(Plant... plants) { 
    OptionalDouble average = Arrays.stream(plants).mapToInt(p -> p.leaves).average(); 

    if (average.isPresent()) { 
     System.out.println("The average number of leaves is: " + average.getAsDouble()); 
    } else { 
     System.out.println("No plants, no average"); 
    } 
} 
Problemi correlati