2015-06-21 20 views
5

Ortalama hesaplayan bir geçersiz yöntem yapmaya çalışıyorum, ancak değerleri ana yönteme yöntemle aktarmak istiyorum. İşte yapmak ne çalışıyorum bir örnektir:Nesne değerlerini yöntemlere geçirme

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

    } 

Ben yöntemle birden çok bitki değerlerini elde ettiğini yaşıyorum sorunu. .get, döngüler, static ve diğer birçok şeyi kullanmayı denedim ve henüz çözemedim. İstediğim, toplamını bulmak için yönteme plantA.leaves ve plantB.leaves değerini vermektir.

cevap

4

Plant sınıfında tanımlanan averageLeaves()'a sahip olduğunuzdan, aslında, yöntem örneğini bitki örneğinden birinden çağırmanız gerekir. İşte nasıl yapmalısın. Eğer burada yapıyoruz

plantA.averageLeaves(); 

Bir büyük hata,

sumLeaves = leaves + leaves;   

Bu aslında özgü bitkilerin (bir) örneğinin yaprakları ekler, bu yanlıştır. Aslında fark örneklerinden yaprak sayısını geçmek zorunda.

Geters & setters kullanarak bunu yapmak için daha iyi bir yol. Ayrıca averageLeaves() yöntemini statik yapmak çok mantıklı olur. Bu şekilde yöntemi çağırmak için bir örneğe ihtiyacınız yoktur.

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

elbette, "ortalamaLeaves'in" statik olması için sözdizimsel olarak en anlamlı olanı yapmaz mı? –

+0

Evet, ben de düşünüyordum. bunu cevaba eklemeliyim. – Fawzan

+0

OP'ye kafa karıştırıcı olabilir (ama belki bir şeyler öğrenir ...) –

0

Böyle yapmak zorunda kalacaktır: yalnızca (parantez içinde) yöntem haline girmek istediğiniz ve size yöntemini kullandığınızda sahip değişken bildirimi zorunda

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

bak Yöntemin kullanacağı değerleri (yönteminde yönteminde bildirme sırasına göre iletmek).

Size yardımcı olacağını umuyorum!

+0

Bir nesne referansı olmadan statik olmayan bir metodu çağırmanın zor olduğunu düşünürsünüz ... –

+0

@BenKnoble Ne demek istiyorsun? –

+0

'averageLeaves',' Plant' sınıfının bir örnek yöntemidir, bu nedenle 'Plant''in bir örneğini çağırması gerekir. "Ana" nızda, yöntemi çağırmak için bir nesneyi çağırmadan yönteme başvurursunuz. Ya yöntemi statik yapın ya da 'plantA' ya da' plantB' buna sahip olsun. –

0

Ne demek istediğinizi biraz net değil. Bitkinin kendisi ortalaması mıdır? İki bitkinin ortalaması. İkincisini kabul ediyorum. Sonra bunu yapmanın bir yolu, yöntemi statik bir üye olarak çağırmak ve yapraklara argüman olarak geçmek.

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

Aşağıda, değişken sayıda bitkiyi geçirmenize ve ortalamasını hesaplamanıza olanak veren basit bir sürüm bulunmaktadır.

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

... yoksa biraz meraklısı almak ve, böyle ortalamasını hesaplamak için akarsuları kullanabilirsiniz yeni Java 8 özelliklerden bazılarını denemek istiyor isterseniz:

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