2015-06-21 5 views
5

Я пытаюсь сделать метод void, который вычисляет среднее значение, но я хотел бы передать значения методу из основного метода. Вот пример того, что я пытаюсь сделать:Передача значений объектов методам

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(); 

    } 

Проблема у меня получает значения нескольких растений в метод. Я пробовал использовать .get, петли, static и многое другое, но пока не понял. То, что я хочу, - это значение plantA.leaves и plantB.leaves, чтобы найти их сумму.

ответ

4

Поскольку у вас есть averageLeaves(), определенный в классе Plant, вы должны фактически вызвать метод из одного из экземпляров растения. Вот как вы должны это делать.

plantA.averageLeaves(); 

Одна большая ошибка, которую вы делаете здесь,

sumLeaves = leaves + leaves;   

Это фактически добавляет листья определенного (одного) экземпляра растений, это не так. вы должны фактически передать количество листьев из разностных экземпляров.

Здесь более удобный способ сделать это с помощью геттеров & сеттеров. Также было бы целесообразно сделать статический метод averageLeaves(). Таким образом, вам не нужен экземпляр для вызова метода.

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

, конечно, не синтаксически ли смысл иметь 'averageLeaves'' статичный'? –

+0

Да, я тоже думал об этом. Возможно, я должен добавить это к ответу. – Fawzan

+0

Это может смутить ОП (но, может быть, он что-то узнает ...) –

0

Вы должны будете сделать это следующим образом:

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); 
     } 
} 

Посмотрите, что у вас есть только объявить переменные, которые вы хотите, чтобы ввести в метод (в скобках), и когда вы используете метод вы имеете для передачи значений, которые метод будет использовать (в порядке декларации в методе).

Я надеюсь, это будет полезно для вас!

+0

Я думаю, вы найдете вызов нестатического метода без ссылки на объект сложно ... –

+0

@BenKnoble Что вы имеете в виду? –

+0

'averageLeaves' - это метод экземпляра класса' Plant', поэтому для его вызова требуется экземпляр 'Plant'. В вашем 'main' вы вызываете метод без экземпляра объекта, вызывающего его. Либо сделайте метод статическим, либо вызовите 'plantA' или' plantB'. –

0

Немного непонятно, что вы имеете в виду. Является ли среднее значение самого растения? Среднее количество двух растений. Я предполагаю последнего. Тогда один из способов сделать это - вызвать метод как статический член и передать его в качестве аргументов.

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

Здесь представлена ​​простая версия, которая позволяет передавать переменное количество растений и рассчитывать их среднее значение.

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); 
    } 
} 

... или если вы хотите, чтобы получить немного любитель, и хотите попробовать некоторые из новых Java 8 функций, вы можете использовать потоки для расчета среднего значения, как это:

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"); 
    } 
}