Как обстоят дела с массивом объектов в Java? - PullRequest
0 голосов
/ 19 сентября 2019

Я знаю, что Java передается по значению, точка.Тем не менее, я все еще не могу понять это.

public static void changeTheName(String obj){
 obj.toUpperCase();
}

Этот метод не повлияет на исходный строковый объект, довольно понятно.Поскольку строки неизменяемы, а изменение в строковых литералах означает, что ссылочная переменная теперь будет ссылаться на новый объект, а старый будет оставлен для сборщика мусора.Но когда я передаю строковый массив, я могу изменить строковые литералы, что означает, что я могу изменить ссылки.Почему это происходит с массивом, потому что если мы сделаем obj [] = new String [] {}, это не повлияет на исходный массив, а оригинал все еще ссылается на старый массив, и это похоже на прямое изменение строковых литералов

public static void ChangeTheName(String obj[]){
 for(int i=0;i<obj.length();i++) obj[i]=obj[i].toUpperCase;
}

Редактировать: Ответ, который я искал, заключается в том, что ссылки на obj и obj [0] уникальны, и поэтому второй метод может изменять все содержимое моего массива.Поскольку я из C-фона и подумал, что obj и obj [0] имеют одинаковые ссылки, но в java это точно не так.

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

@ karthikdivi сказал - toUpperCase () не меняет строку.он возвращает новую строку в верхнем регистре.

Но, насколько я понимаю, вы хотите знать, почему значение объекта изменяется в методе, а не примитивное значение типа данных?

Хотя Java строго обойденазначение, точный эффект зависит от того, передан ли примитивный тип или ссылочный тип.

.

Когда мы передаем примитивный тип методу, он передается по значению.Но когда мы передаем объект методу, ситуация резко меняется, потому что объекты передаются посредством того, что эффективно вызывается по ссылке.Java делает эту интересную вещь, которая является своего рода гибридом между передачей по значению и передачей по ссылке.По сути, параметр не может быть изменен функцией, но функция может попросить параметр изменить себя, вызвав некоторый метод внутри него.

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

Это фактически означает, что объекты действуют так, как если бы они были переданы в методыиспользование call-by-reference.

Изменения объекта внутри метода отражаются в объекте, используемом в качестве аргумента.

1 голос
/ 19 сентября 2019

toUpperCase не изменяет строку, она возвращает новую строку в верхнем регистре.

0 голосов
/ 19 сентября 2019

, если вы делаете, как показано ниже, только изменит значение.

public static void(String obj[]){
 for(String s:obj) {
   s=s.toUpperCase();
  }
}

Я думаю, таким образом, внести изменения.

...