Member 12702056 Ответов: 1

Почему я получаю эту ошибку? "На нестатический метод change () нельзя ссылаться из статического контекста". И после того, как я изменил этот метод на статический, почему он дает что-то вроде этого - >[I@4554617c ?


package arraysınmethods;


public class ArraysInMethods {

    
    public static void main(String[] args) {
        int bucky[] = {3,4,5,6,7};
        change(bucky);
        for(int x:bucky)
            System.out.println(x);
    }
    public void change(int arr[]){
        for(int counter=0;counter<arr.length;counter++){
            arr[counter]+=5;
            System.out.println(arr);
        }
    }
}


Что я уже пробовал:

Почему я получаю эту ошибку? "нестатический метод change() не может быть сослан из статического контекста".
А выход есть:
[I@4554617c
[I@4554617c
[I@4554617c
[I@4554617c
[I@4554617c
8
9
10
11
12

И после того,как я изменил этот метод на статический, почему он дает что-то вроде этого - >[I@4554617c ?

Prifti Constantine

Это потому, что на принтере вы печатаете массив и, вероятно,это место расположения массива. Чтобы извлечь значение массива, вы также должны указать индекс массива, чтобы получить значение, которое хранится внутри. Системы.из.код println(Арр[индекс]);

Member 12702056

Большое спасибо,я все понял :)

1 Ответов

Рейтинг:
12

OriginalGriff

Нестатические объекты - то есть все, что объявлено без static ключевые слова-являются частью "тела" класса и существуют только в экземпляре этого класса: каждый раз, когда вы создаете новый экземпляр, вы создаете новую версию каждого из нестатических объектов внутри него.

Это как автомобиль: когда вы покупаете новый автомобиль, он поставляется с собственным бардачком - и вы не ожидаете, что все вещи из вашего последнего автомобиля волшебным образом появятся в нем!
Старый автомобиль-это один экземпляр автомобиля класса, Новый автомобиль-второй: и у каждого из них есть отдельные нестатические бардачки. Чтобы получить доступ к нужному ящику, вы должны указать, в каком экземпляре автомобиля вы смотрите:

Car myNewCar = new Car();
myNewCar.Glovebox.Items.ListToConsole();
Car myOldCar = myGarage.GetCar("the red one");
myNewCar.Glovebox.Items.AddRange(myOldCar.Glovebox.Items);

Для статических объектов вы не используете экземпляр, вы используете имя класса:
Console.WriteLine("A car has {0} wheels", Car.GetWheelsCount());

Если вы находитесь в статическом методе, вы не можете получить доступ к объектам экземпляра, потому что для статического метода не указан экземпляр - они работают вообще без какого-либо экземпляра.

В вашем примере, main это статический метод-как и должно быть, - но change это не так-это метод экземпляра, и для работы требуется intance класса.
Измените его на этот:
public static void change(int arr[]){
    for(int counter=0;counter<arr.length;counter++){
        arr[counter]+=5;
        System.out.println(arr);
    }
}
И это сработает.


Member 12702056

Это означает, что для вызова некоторых методов внутри другого статического метода эти методы также должны быть статическими, могу ли я это получить?это правда?

OriginalGriff

Да-если только вы не создадите (или не получите доступ) экземпляр класса.

Member 12702056

Большое спасибо :)

Member 12702056

При создании объекта другого класса мы используем этот объект для вызова методов этого класса, и он не должен быть статичным. Не будучи статичным с использованием имени метода object dot и парантезиса в основном методе основного класса, мы можем вызвать метод этого класса, как вы показали выше. Я понял. Спасибо снова :)

OriginalGriff

Пожалуйста!