классы объектов и массивы - почему он возвращает 'null'?[Джава] - PullRequest
0 голосов
/ 14 ноября 2010

Я написал небольшой класс, который создает объект отчета, содержащий 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 ]

4 голосов
/ 14 ноября 2010

Сделай так

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
 } 

1 голос
/ 14 ноября 2010

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

Однако код заполнения немного отличается, если отделить объявление от заполнения, и они не совсем поняли это. У вас также был символ «+», который не принадлежал.

Этот код компилируется и работает (проверено), и делает в основном то, что вы ищете.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...