powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Test передача параметров
9 сообщений из 9, страница 1 из 1
Test передача параметров
    #39496954
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответьте на вопрос: какие из следующих параметров, после передачи их в соответствующие методы ниже, будут изменены после их завершения в вызывающем коде.

Код: java
1.
2.
3.
4.
int a = 10;
Integer b = 10;
String c = "Begin";
SimpleObject d = new SimpleObject(10); // Допусти класс  SimpleObject имеет одно поле типа int с сетераом и геттером.



Код: java
1.
2.
3.
void changePrimitives(int arg){
   arg = 20;
}



Код: java
1.
2.
3.
void changeWrappers(Integer arg){
   arg = arg*2;
}



Код: java
1.
2.
3.
void changeString(String arg){
   arg = "End";
}



Код: java
1.
2.
3.
void changeObject(SimpleObject arg){
   arg = new SimpleObject(50);
}



Думаю, новичкам будет интересно разобрать.
...
Рейтинг: 0 / 0
Test передача параметров
    #39497003
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что тут может быть интересного?
...
Рейтинг: 0 / 0
Test передача параметров
    #39497007
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе все просто, примитивы передаются по значению, объекты по значению ссылки. Но оболочки типов и строки - тоже объекты, и вроде бы их внутренне состояние можно поменять, но по факту нет, так как они не изменяемые (При их изменении создаются новые ссылки). Я когда начинал Java изучать слышал только про примитивы и объекты. Вот и подумал, что для новичков будет интересно. Мало ли кто то захочет написать, например, такой код:

void inc(Integer arg){
arg ++;
}
...
Рейтинг: 0 / 0
Test передача параметров
    #39497013
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда держи немного магии:
Код: java
1.
2.
3.
4.
5.
6.
Integer i1 = 50;
Integer i2 = 50;
Integer j1 = 500;
Integer j2 = 500;
System.out.println(i1==i2);
System.out.println(j1==j2);
...
Рейтинг: 0 / 0
Test передача параметров
    #39497015
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел пример - интересно, все числа из диапазона типа byte при упаковке получают одну и ту же ссылку. Ушел копать ...
...
Рейтинг: 0 / 0
Test передача параметров
    #39497016
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При боксинге вызывается следующий метод:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    /**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }



Поэтому фактически получается одна и та же ссылка.
При любых операциях над числами происходит дебоксинг, операция, боксинг - при котором получается новая ссылка. Именно поэтому изменять объект по ссылке не получается, просто создается каждый раз новый объект. То же касается и операций над строками (точнее операции - конкатенации).
...
Рейтинг: 0 / 0
Test передача параметров
    #39497017
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде накопал, куски из сорцов класса Integer:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private static class IntegerCache {
         private  IntegerCache(){}

         static final Integer cache[] = new Integer[-(-128) + 127 + 1];

         static {
             for(int i = 0; i < cache.length; i++)
                 cache[i] = new Integer(i - 128);
         }
}



и

Код: java
1.
2.
3.
4.
5.
6.
7.
public static Integer  valueOf(int i) {
         final int offset = 128;
         if (i >= -128 && i <= 127) { // must cache
             return IntegerCache.cache[i + offset];
         }
         return new Integer(i);
}



Получается, что при создании переменной типа Integer для значений от -128 до 127 значения берутся из кэша.
...
Рейтинг: 0 / 0
Test передача параметров
    #39497018
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
public static Integer  valueOf(int i) {
         final int offset = 128;
         if (i >= -128 && i <= 127) { // must cache
             return IntegerCache.cache[i + offset];
         }
         return new Integer(i);
}


Это какая-то старая ява
...
Рейтинг: 0 / 0
Test передача параметров
    #39497088
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett...
Это какая-то старая ява
Подозреваю, что это просто дизаассеблер (точнее диз-java)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Test передача параметров
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]