Java - 访问私有实例变量

时间:2012-12-10 02:46:15

标签: java instance-variables private-members

我需要从以下类列表(Species.java)访问私有变量,以便在KlingonOx.java类中使用它们。

KlingonOx.java类的目的是确定大象物种的种群数量将大于克林贡牛种的数量。

这是Species.java类:

import java.util.Scanner;

public class Species
{
private String name;
private int population;
private double growthRate;

public void readInput()
{
    Scanner keyboard = new Scanner(System.in);
    System.out.println("What is the species' name?");
    name = keyboard.nextLine();

    System.out.println("What is the population of the species?");
    population = keyboard.nextInt();

    while(population < 0)
    {
        System.out.println("Population cannot be negative.");
        System.out.println("Reenter population:");
        population = keyboard.nextInt();
    }

    System.out.println("Enter growth rate (% increase per year):");
    growthRate = keyboard.nextDouble();
}

public void writeOutput()
{
    System.out.println("Name = " + name);
    System.out.println("Population = " + population);
    System.out.println("Growth rate = " + growthRate + "%");
}

public int predictPopulation(int years)
{
    int result = 0;
    double populationAmount = population;
    int count = years;

    while( (count>0) && (populationAmount>0) )
    {
        populationAmount = (populationAmount + (growthRate/100) * populationAmount);
        count --;
    }

    if (populationAmount > 0)
        result = (int)populationAmount;
    return result;
}

public Species(String name)
{
    name = name;
    population = 0;
    growthRate = 0.0;
}

public Species(int population)
{
    name = "";
    if (population > 0)
        population = population;
    else
    {
        System.out.println("ERROR: using a negative" + "population.");
        System.exit(0);
    }
    growthRate = 0.0;
}

public Species(double growthRate)
{
    name = "";
    population = 0;
    growthRate = growthRate;
}

public Species(String name, int population, double growthRate)
{
    name = name;
    if (population > 0)
        population = population;
    else
    {
        System.out.println("ERROR: using a negative" + "population.");
        System.exit(0);
    }
    growthRate = growthRate;
}

public Species()
{
    name = "";
    population = 0;
    growthRate = 0;
}

public void setSpecies(String newName, int newPopulation, double newGrowthRate)
{
    name = newName;
    if (newPopulation >= 0)
        population = newPopulation;
    else
    {
        System.out.println("ERROR: using a negative " + "population.");
        System.exit(0);
    }

    growthRate = newGrowthRate;
}

public void setName(String name)
{
    name = name;
}

public void setPopulation(int population)
{
    if (population > 0)
        population = population;
    else
    {
        System.out.println("ERROR: using a negative" + "population."); 
        System.exit(0);
    }
}

public void setGrowthRate(double growthRate)
{
    growthRate = growthRate;
}

public String getName()
{
    return name;
}

public int getPopulation()
{
    return population;
}

public double getGrowthRate()
{
    return growthRate;
}

public boolean equals(Species otherObject)
{
    return (name.equalsIgnoreCase(otherObject.name)) &&
           (population == otherObject.population) &&
           (growthRate == otherObject.growthRate);
}
}

这是KlingonOx.java类:

import java.util.Scanner;
public class KlingonOx extends Species
{
public static void main(String[] args) 
{
    new KlingonOx().run();
}

public void run()
{     
    Species klingonox = new Species();
    Species elephant = new Species();

    System.out.println("Please enter data on the species Klingon Ox."); 
    klingonox.readInput();
    klingonox.writeOutput();
    klingonox.setPopulation(int population);
    population = population;
    klingonox.setGrowthRate(double growthRate);
    growthRate = growthRate;

    System.out.println("Please enter data on the species Elephant.");
    elephant.readInput(); 
    elephant.writeOutput();
    elephant.setPopulation(population);
    population = population;
    elephant.setGrowthRate(growthRate);
    growthRate = growthRate;

    int year = 0;
    if(klingonox.population < elephant.population)
    {
        while(klingonox.population < elephant.population)
        {
            klingonox.population = (int)(klingonox.population + (klingonox.population * (klingonox.growthRate/100) ) );
            elephant.population=(int)(elephant.population + (elephant.population * (elephant.growthRate/100) ) );
            year++;
        }

        System.out.println("KLINGON OX EXCEEDS ELEPHANT IN" + year + "YEARS");
    }

    else
    {
        while(klingonox.population > elephant.population)
        {
            klingonox.population=(int)(klingonox.population+(klingonox.population*(klingonox.growthRate/100)));
            elephant.population=(int)(elephant.population+(elephant.population*(elephant.growthRate/100)));
            year++;
        }
    System.out.println("ELEPHANT EXCEEDS KLINGON OX IN" + year + "YEARS");
    }
}
}

KlingonOx.java类给出了一个错误,即“population”和“growthRate”是Species中的私有实例变量,因此无法访问。我曾尝试使用getPopulation和getGrowthRate方法调用来检索变量,但我不确定如何正确地执行此操作。

感谢任何反馈。

6 个答案:

答案 0 :(得分:6)

在带变量的课程中:

class Foo {
  private int variable;

  public int getVariable() { return variable; }
}

在客户端类中:

class Bar {
   void method() {
     ...
     Foo foo = new Foo();
     int population = foo.getVariable();
     ...
   }
}

这几乎就是一切。

答案 1 :(得分:1)

您应该使用klingonox.population而不是klingonox.getPopulation(),而您的其他Species对象也是如此。

这应该是您使用getPopulation方法所需进行的唯一更改。

答案 2 :(得分:1)

首先,

klingonox.setPopulation(int population);
population = population;
klingonox.setGrowthRate(double growthRate);
growthRate = growthRate;

如果您设置的人口通过值klingonox.setPopulation(20),为什么要尝试将人口分配给人口。 KlingonOx没有现场人口。调用readInput();

时,应已分配您的填充名称和growthRate

与象物相同。

答案 3 :(得分:0)

使用

klingonox.getPopulation();

答案 4 :(得分:0)

private访问修饰符允许我们隐藏变量,以便只能访问声明它的类。你上课 -

public class Species {
 private String name;
 private int population;
 private double growthRate;

 public int getPopulation(){return population;}
 public double growthRate(){return growthRate;}
}

这个概念也称为封装,我们使用public方法来访问和修改private变量。

答案 5 :(得分:0)

- 您想要从instance variable - 类访问Super - 类的Sub

- 使用super关键字和Getter-Setter方法。

<强>例如

public class Species
{
private String name;
private int population;
private double growthRate;

public int getPopulation(){

return this.population;

}

public double getGrowthRate(){

return this.growthRate;

}

public String getName(){

return this.name;

}

// Setters...........

}


public class KlingonOx extens Spices{

.......
.......

  public static void main(String[] args){


       int p = super.getPopulation();

       ........
       ........
    }


}