Улучшено для l oop и массива - PullRequest
0 голосов
/ 01 августа 2020
public class modifyALelements {
    
    public static void main(String[] args) {
    
    StringBuilder myArr [] = {new StringBuilder("One"), new StringBuilder("Two")};              
    
    for (StringBuilder val: myArr)
        System.out.println(val);
    
    for (StringBuilder val: myArr)
        val.append("Way");                                              
    
    for (StringBuilder val: myArr)
        System.out.println(val);

    StringBuilder anotherArr[] = { new StringBuilder("Java"), new StringBuilder("Loop") }; 

    for (StringBuilder element : anotherArr)
        System.out.println(element);

    for (StringBuilder element : anotherArr)
        element = new StringBuilder("Test");

    for (StringBuilder element : anotherArr)
        System.out.println(element);
    
    }
}

вывод:

One
Two
OneWay
TwoWay
Java
Loop
Java
Loop

Привет всем, Может кто-нибудь объяснить, почему значения anotherArr не изменены на Test last two for-each loop. Когда вы используете метод append (), применяются изменения, например, OneWay и TwoWay. Большое спасибо.

1 Ответ

1 голос
/ 01 августа 2020

В java типы классов являются ссылочными. Это означает, что переменная типа StringBuilder будет содержать ссылку на объект StringBuilder.

for (StringBuilder val: myArr)
    val.append("Way");

Здесь мы берем ссылки из myArr. Затем мы вызываем метод append, который меняет указанный объект.

for (StringBuilder element : anotherArr)
    element = new StringBuilder("Test");

Здесь мы также берем ссылку из массива. Однако затем мы переназначаем переменную. Это изменяет только то, к чему относится переменная element. Фактически ни один объект не изменился.

...