Инициализация массива со значениями из параметра конструктора - невозможно инициализировать? - PullRequest
2 голосов
/ 19 февраля 2012

Я задавал этот же вопрос на javaprogrammingforums.com, но похоже, что их сайт сейчас недоступен.Так что я не мог видеть, какие ответы (если таковые имеются) я получил.В любом случае, я сильно застрял на этом задании Java HW.То, что у меня пока есть, выглядит хорошо с точки зрения завершения, теперь оно просто показывает правильные значения.Притворись, у меня есть это:

(Это только часть 2-го класса из двух с конструктором, другой - "тестер")

//private variables
boolean myP;
boolean myPla;
boolean myGl;
boolean myCa;

double myPlot;
int myCrust;

double myReduct;
double myNet;
double myGross;

boolean [] trshIt = {myP, myPla, myGl, myCa};
double [] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca)
{
    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;
}

Моя проблема в том, что логический массив Тршит .Поскольку я помещаю переменные в массив, которые еще не были инициализированы, для этих переменных по умолчанию заданы значения false.Если я сначала помещу его в конструктор, то получаю ошибку, сообщающую, что переменная trshIt не может быть найдена;указывая на экземпляр, который я называю этой переменной.Поэтому я пробовал разные формы в разных областях, и я словно попал в лабиринт прямо сейчас, пытаясь заставить этот массив работать правильно.Мне нужна вся помощь, которую я могу получить.Идеи?

Ответы [ 3 ]

2 голосов
/ 19 февраля 2012

Это не работает, потому что trshIt получит свои значения из полей, прежде чем они будут инициализированы в конструкторе.

Инициализация trshIt в конструкторе после того, как все остальные переменные должны работать.

Также, поскольку CO2TrashEmissions является постоянной величиной (и, может быть, и myPlot тоже?), вы, вероятно, должны объявить его статическим и окончательным, чтобы предотвратить его изменение.Хотя это не помешает модификации самих элементов.

private static final double[] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};
//Fields....
boolean[] trshIt;

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca)
{
    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;

    trshIt = new boolean[]{myP, myPla, myGl, myCa};
}

Кроме того, обратите внимание, что, поскольку логические значения являются литералами, изменение одной из ваших переменных my * не изменит соответствующий элемент в массиве, который может бытьпроблема в зависимости от того, что делает ваша программа.

0 голосов
/ 19 февраля 2012

Любая причина, по которой вы не можете сделать это:

//private variables
boolean myP;
boolean myPla;
boolean myGl;
boolean myCa;

double myPlot;
int myCrust;

double myReduct;
double myNet;
double myGross;

boolean [] trshIt;
double [] CO2TrashEmissions;

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca){

    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;
    trshIt = new boolean[4];
    trshIt[0] = myP; trshIt[1] = myPla;
    trshIt[2] = myGl; trshIt[3] = myCa;

    double [] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};
}

В Java примитивы (int, char, boolean) назначаются по значению, поэтому, если вы делаете

boolean b = true;
boolean[] a = { b };
b = false;

System.out.println( ( a[0] == true ) ? "true" : "false" );

выведет «true», потому что b = false; не изменяет значение в массиве a (потому что не сохраняет «указатель» в b, а значение, которое было в b.

0 голосов
/ 19 февраля 2012

Объявите trshIt как член класса, но инициализируйте его в конструкторе, например:

boolean [] trshIt;
double [] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca)
{
    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;

    trshIt = new boolean[4];
    trshIt[0] = myP;
    trshIt[1] = myPla;
    trshIt[2] = myGl;
    trshIt[3] = myCa;
}
...