Классы объектов и массивы - почему он возвращает '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.

Другие вопросы по тегам