Java - access private instance variables

2019-01-26 02:37发布

问题:

I need to access the private variables from the following class listing (Species.java) in order to use them in the KlingonOx.java class.

The purpose of the KlingonOx.java class is to determine after how many years the population of the Elephant species will be larger than the population of the Klingon Ox species.

Here is the Species.java class:

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

Here is the KlingonOx.java class:

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

The KlingonOx.java class gives me the error that "population" and "growthRate" are private instance variables in Species and therefore cannot be accessed. I've tried to use the getPopulation and getGrowthRate method calls to retrieve the variables but I'm not sure how to do so correctly.

Any feedback is appreciated.

回答1:

In class with variable:

class Foo {
  private int variable;

  public int getVariable() { return variable; }
}

in client class:

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

That's pretty much everything.



回答2:

Instead of using klingonox.population, you should use klingonox.getPopulation()- the same goes for your other Species objects as well.

That should be the only change you need to make in order to use the getPopulation method.



回答3:

First,

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

if you are setting up the population pass the value klingonox.setPopulation(20) and why are you trying to assign population to population. There is no field population in KlingonOx. Your population name and growthRate should be already assigned when you called readInput();

Same goes with the elephant object.



回答4:

Use

klingonox.getPopulation();


回答5:

private access modifier allows us to hide a variable so that the class declaring it can only be accessed. You class -

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

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

This concept is also called encapsulation where we use public methods to access and modify private variables.



回答6:

- You want to access the instance variable of the Super-Class from the Sub-Class.

- Use the super keyword, with the Getter-Setter methods.

Eg:

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

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


}