Классы объектов и массивы - почему он возвращает 'null'? [Джава]
Я написал небольшой класс, который создает объект отчета, содержащий 3 массива. При создании объекта эти массивы инициализируются значениями. Однако когда я тестирую класс, чтобы увидеть, например, что находится в массиве департаментов, он выводит, что элементы массива равны нулю. Зачем?
class Report
{
// declare instance variables (arrays)
public String[] departments = new String[4] ;
public double[] grossTotals = new double[4] ;
public double[] taxTotals = new double[4] ;
// constructor
public Report(){
// declare, create and initialise all in one statement
String[] departments = {"Accounting", "Sales", "HR", +
"Administration"} ;
double[] grossTotals = {0.0, 0.0, 0.0, 0.0} ;
double[] taxTotals = {0.0, 0.0, 0.0, 0.0} ;
} // END constructor
} // class Report
Тестовый класс:
class TestReport
{
public static void main(String[] args) {
// create report object
Report r = new Report();
for (int i = 0; i <= 3 ; i++ )
{
System.out.println(r.departments[i]) ;
}
} //end main
} // end test class
Спасибо
ромовая баба
2 ответа
Сделай так
public Report(){
// declare, create and initialise all in one statement
this.departments = {"Accounting", "Sales", "HR", +
"Administration"} ;
this.grossTotals = {0.0, 0.0, 0.0, 0.0} ;
this.taxTotals = {0.0, 0.0, 0.0, 0.0} ;
} // END constru
На самом деле вы создаете новые объекты массивов, локальные для вашего конструктора, которые инициализируются в конструкторе.
поля вашего класса будут инициализированы с помощью кода выше.
**
Обновить
:** Выше кода даст вам незаконное начало выражения
Вот рабочий код
class Report
{
// declare instance variables (arrays)
public String[] departments = null;
public double[] grossTotals = null;
public double[] taxTotals = null;
// constructor
public Report(){
this.departments = new String[]{"Accounting", "Sales", "HR", "Administration"} ;
this.grossTotals = new double[]{0.0, 0.0, 0.0, 0.0} ;
this.taxTotals = new double[]{0.0, 0.0, 0.0, 0.0} ;
} // END constructor
}
Как отмечали другие ответы, ваш конструктор создал новые локальные переменные, "затеняя" переменные экземпляра, вместо того, чтобы заполнять переменные экземпляра данными.
Тем не менее, код популяции немного отличается, если вы отделяете декларацию от заполнения, и они не совсем правильно поняли. У вас также был символ "+", который не принадлежал.
Этот код компилируется и работает (проверено), и делает в основном то, что вы ищете.
class Report
{
// declare instance variables (arrays)
public String[] departments;
public double[] grossTotals;
public double[] taxTotals;
// constructor
public Report(){
// populate instance variables
departments = new String[]{"Accounting", "Sales", "HR",
"Administration"} ;
grossTotals = new double[]{0.0, 0.0, 0.0, 0.0} ;
taxTotals = new double[]{0.0, 0.0, 0.0, 0.0} ;
} // END constructor
} // class Report
В качестве альтернативы вы можете создать массивы в объявлении, а затем заполнить записи массива в конструкторе или в другом месте.
При таком подходе код может выглядеть примерно так:
class Report
{
// declare instance variables (arrays)
public String[] departments = new String[4];
public double[] grossTotals = new double[4];
public double[] taxTotals = new double[4];
// constructor
public Report(){
// populate instance variable entries
departments[0] = "Accounting";
departments[1] = "Sales";
departments[2] = "HR";
departments[3] = "Administration";
for (int i = 0; i < 4; i++) {
grossTotals[i] = 0.0;
taxTotals[i] = 0.0;
}
} // END constructor
} // class Report
В качестве третьего варианта вы можете выполнить всю инициализацию в объявлении поля следующим образом:
class Report
{
// declare and populate instance variables (arrays)
public String[] departments = new String[]{"Accounting", "Sales", "HR",
"Administration"} ;
public double[] grossTotals = new double[]{0.0, 0.0, 0.0, 0.0} ;
public double[] taxTotals = new double[]{0.0, 0.0, 0.0, 0.0} ;
} // class Report
В этом случае вам вообще не нужно определять конструктор, так как он ничего не делает. Пустой будет предоставлен Java.