Не работает Seter в массив на Java

157
19 октября 2018, 17:20

Не получается понять причину, почему не работает сетер. Выставил значение в сетере - а результат инициализации всё равно 0

import java.util.Arrays;
public class Data {
int qid, qcid, qscid, srvid, srvvar;
int[] data_quest = new int[qid];
int[] data_serv = new int[srvid];
public static void main(String[] args) {
    System.out.println("Start Main class");

    Questions questions = new Questions();
    questions.setQuestionsID(20);
    System.out.println(questions.getQuestionsID());
    Services services = new Services();
    services.setServiceID(10);
    System.out.println(services.getServiceID());

    Data data = new Data();
    System.out.println(Arrays.toString(data.data_serv));  // Почему-то в data_serv 0, вместо указаного в сетере 20.
    System.out.println(Arrays.toString(data.data_quest)); // Почему-то в data_quest 0, вместо указаного в сетере 10.
     }
  }
class Questions extends Data {
/*Getters and Setters*/
void setQuestionsID(int qid){
    this.qid = qid;
}
void setQuestionsCategory(int qcid){
    this.qcid = qcid;
}
void setQuestionsSubCategory(int qscid) {
    this.qscid = qscid;
}
int getQuestionsID() {
    return qid;
}
int getQuestionsCategory() {
    return qcid;
}
int getQuestionsSubCategory(){
    return qscid;
}
}
class Services extends Data {
/*Getters and Setters*/
void setServiceID(int srvid){
    this.srvid = srvid;
}
public void setServiceVariation(int srvvar){
    this.srvvar = srvvar;
}
int getServiceID() {
    return srvid;
}
public int getServiceVariation() {
    return srvvar;
}
}
Answer 1

Скорее всего Вам нужно сделать что-то подобное

//объявляем
int[] arr;
public void setArr(int size){
   //инициализируем
   arr = new int[size];
}

таким образом массив инициализируется только когда Вы вызовите сеттер. Хотя это не совсем сеттер. Сеттер для массива будет выглядеть следующим образом

int[] arr;
public void setArr(int[] a){
   arr = a;
}
Answer 2

Все правильно. Смотрите, что происходит

// Создали новый объект класса Questions
Questions questions = new Questions();
// В этом объекте присвоили полю qid значение 20
questions.setQuestionsID(20);
System.out.println(questions.getQuestionsID());
// Создали новый объект класса Services
Services services = new Services();
// В этом объекте присвоили полю srvid значение 10
services.setServiceID(10);
System.out.println(services.getServiceID());

// Создали новый объект класса Data
Data data = new Data();
// Пытаемся вывести значения полей по умолчанию
System.out.println(Arrays.toString(data.data_serv));
System.out.println(Arrays.toString(data.data_quest));
Answer 3

После вызова конструкторов new Questions() и new Services(), происходит инициализация состояний объектов значениями по умолчанию. Т.к. оба класса являются производными от Data, то при создании дочерних объектов, неявно вызывается конструктор класса Data и его поля тоже инициализируются начальными значениями. По умолчанию int qid = 0, значит и data_quest.length = 0, то есть у вас всегда будет массив с 0 элементами.

Для решения проблемы, присваивайте значение ссылки в сеттере, как написал Stanislav Tun, а не при объявлении

READ ALSO
Сложение значений одинаковых ключей

Сложение значений одинаковых ключей

Есть значение (Double) и ключ (String)

130
Не отображается средее арифметическое

Не отображается средее арифметическое

В общем, нужно выводить среднее арифметическое в activity 3

173
JpaRepository выборка

JpaRepository выборка

Три взаимосвязанные сущности: города (City), улицы (Street), жители (People)

170