Как работает этот код

Всем привет, изучаю java с книжги, такой вот код, программа выводит 25 1. Самостоятельно допереть у меня не получается, не понимаю как работает цикл, объясните как оно рабоатет.

package test214;
public class Mix4 {
    int counter = 0;        
    public static void main (String []args) {
    int count = 0;
    Mix4 [] m4a = new Mix4[20];
    int x = 0;
    while (x<20) {
        m4a[x]= new Mix4();
        m4a[x].counter = m4a[x].counter + 1; 
        count = count +1; 
        count = count + m4a[x].maybeNew(x); 
        x=x+1;
    }
    System.out.println(count + " " +m4a[1].counter);
}

public int maybeNew(int index) {
    if(index<5) {
        Mix4 m4 = new Mix4();
        m4.counter= m4.counter+1;
        return 1;
    }
    return 0 ;
}
}


Сейчас опишу , то что я понимаю... Mix4 [] m4a = new Mix4[20]; создаем массив размером 20 с именем m4a. while (x<20) { пока x<20, в массиве в элементе по индексу х создается новый Mix4 и присваеваем его значение. m4a[x].counter = m4a[x].counter + 1; для каждого элемента массива складываем// 0+1//1+1// 2+1 и так далее . count = count + m4a[x].maybeNew(x); вот , с этого момента я уже плыву, count присваивает значение count + m4a[x].maybeNew(x). самое интересное что я не понимаю как этот метод работает maybeNew. пока index< 5 , как понять чему равно индекс, сколько раз будет выполнятся if мы создаем ссылку экземпляра m4 . Mix4 m4 = new Mix4(); m4.counter = m4.counter +1 ; 0+1// 1+1// и так далее return 1; return 0; И по поводу return, в моем предстовление метод return возвращает значение, сначало он возврщает значение 1, потом 0. какой смысл возвращать 0,смысл тогда этого метода. как видите плыву очень сильно..


Ответы (1 шт):

Автор решения: DmitryK

Метод maybeNew(int index) работает просто - если index < 5 возвращает 1, иначе - возвращает 0. Все остальные операции делаются над локальными переменными и не имеют значения за пределами функции. Этот метод можно переписать так:

public int maybeNew(int index) {
    if(index<5)
        return 1;
    return 0 ;
}

А вообще код очень искусственный. Функция maybeNew() не использует в работе данных конкретных экземпляров класса, её можно сделать static и вызывать не от объекта, а от имени класса

count = count + Mix4.maybeNew(x);

В общем, если коротко:

  • создается массив ссылок m4a
  • цикл на 20 итераций. На каждой итерации:
  • создается объект класса Mix4 и назначается ссылке в массиве
  • внутри созданного элемента увеличивается на единицу counter. Всё, больше операций с объектами нет
  • увеличивается на единицу локальная в main() переменная count
  • если итерация меньше 5, то локальная переменная count ещё раз увеличивается на единицу, возвращаемую функцией maybeNew()
  • после цикла выводится на печать значение локальной переменной count и значение поля counter второго объекта из массива.
→ Ссылка