Помогите понять работу return

104
08 августа 2021, 20:10

Хотел бы понять как работает return, в принципе я понимаю как он работает. Но встал вопрос, в примере ниже я запускаю метод с пустым массивом, в методе массив заполняется, и возвращается массив, этот массив занимает место пустого? и получается если запускать метод с параметром, то return вернет значение этому аргументу? А если без аргумента?

import java.util.Scanner;
class ex{
    public static void main(String[] args) {
        Scanner scr=new Scanner(System.in);
        int arrSize=0;
        int []ourArray;
        System.out.print("Enter size of array ");
        arrSize=scr.nextInt();
        ourArray=new int[arrSize];
        arrayLength test = new arrayLength();
        test.enterValue(ourArray);

            /*for (int i=0;i<ourArray.length ;i++ ) {
                System.out.print(ourArray[i]+" ");
            }*/
            maxminavr test2=new maxminavr();
            test2.maxNum(ourArray);
            test2.minNum(ourArray);
            test2.avrNum(ourArray);
        }
    }

класс с заполнением массива

import java.util.Scanner;
class arrayLength{
    Scanner scr=new Scanner(System.in);
    private int [] newArray;
    public int[] enterValue(int []arrEnt){
        newArray=arrEnt;
        for (int i=0;i<newArray.length;i++ ) {
            newArray[i]=scr.nextInt();
        }
        return newArray;
    }
}
Answer 1

Но встал вопрос, в примере ниже я запускаю метод с пустым массивом, в методе массив заполняется и возвращается массив, этот массив занимает место пустого?

Нет, это и есть тот пустой массив.

В enterValue:

public int[] enterValue(int []arrEnt){
    newArray=arrEnt;
    for (int i=0;i<newArray.length;i++ ) {
        newArray[i]=scr.nextInt();
    }
    return newArray;
}
  • Вы передаете ссылку на arrEnt
  • В переменную newArray записываете ссылку на arrEnt: newArray = arrEnt;. Т.е. выражение newArray = arrEnt; не сделает копию массива, а сохранит ссылку на массив в переменную newArray
  • Заполняете массив по ссылке, т.е. arrEnt: newArray[i] = ...
  • Возвращаете ссылку на arrEnt: return newArray;

Таким образом, вы в этом коде заполняете ourArray и только его:

    ourArray=new int[arrSize];
    arrayLength test = new arrayLength();
    test.enterValue(ourArray);

и получается если запускать метод с параметром, то return вернет значение этому аргументу?

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

А если без аргумента?

Будет ошибка при компиляции

Т.е. смысл вам возвращать массив в текущем виде нет, поэтому можно переписать функцию как:

public void enterValue(int []arrEnt){
    newArray=arrEnt;
    for (int i=0;i<newArray.length;i++ ) {
        newArray[i]=scr.nextInt();
    }
}

Случай, когда нужно возвращать массив -- это если в аргумент вы передаете массив, внутри функции создаете новый массив, что-то с ним делаете на основе массива из аргумента, а после из функции возвращаете новый массив.

Answer 2

относительно поставленного вопроса gil9red ответил.

Но я бы хотел посоветовать избегать изменения переданных объектов внутри функции(в том числе и массивов)

То есть данный код лучше переписать так:

import java.util.Scanner;
class ex{
    public static void main(String[] args) {
        Scanner scr=new Scanner(System.in);
        int arrSize=0;
        System.out.print("Enter size of array ");
        arrSize=scr.nextInt();
         ourArray=new int[arrSize];
        arrayLength test = new arrayLength();
        int[] ourArray = test.enterValue(arrSize);

            /*for (int i=0;i<ourArray.length ;i++ ) {
                System.out.print(ourArray[i]+" ");
            }*/
            maxminavr test2=new maxminavr();
            test2.maxNum(ourArray);
            test2.minNum(ourArray);
            test2.avrNum(ourArray);
        }
    }
import java.util.Scanner; 
class arrayLength{
    Scanner scr=new Scanner(System.in);
    private int[] newArray;
    public int[] enterValue(int size){
        newArray=new int[size];
        for (int i=0;i<newArray.length;i++ ) {
            newArray[i]=scr.nextInt();
        }
        return newArray;
    }}
READ ALSO
Правильно ли так изменять state?

Правильно ли так изменять state?

У меня есть массив объектов, у них нет точного распорядка и идентификации , но мне нужно найти объект с определенным id и изменить в нем свойство...

177
Redux вопрос архитектуры

Redux вопрос архитектуры

Я осваиваю веб разработку и у меня созрел вопрос:

105
Выпадающее меню vue.js

Выпадающее меню vue.js

Нужна помощь в реализации выпадающего меню в vuejs

203
Консоль выдает ошибку Uncaught SyntaxError: Unexpected token )

Консоль выдает ошибку Uncaught SyntaxError: Unexpected token )

Идея в том , что бы код считал сколько есть слов в массиве , которые заканчиваются "у" "іе"

218