Давайте посмотрим.
class simpleClass {
static int st = 0;
Переменная st
вообще не используется - это намеренно?
public Integer getObject(){
Interger i = 10;
Interger j = 10;
Interger result = 10;
Я полагаю, это должно быть Integer
.Итак, здесь вы создаете 3 переменные и присваиваете им все один и тот же объект, а именно результат из Integer.valueOf(10)
.Этот метод гарантированно возвращает один и тот же объект для одного и того же ввода, по крайней мере, для небольших значений.Я думаю, что эти значения обычно хранятся в статическом массиве в классе Integer.
try{
result = getSum(i, j);
Здесь вы вызываете метод getSum
- это (если исправлено) возвращает другой объект, который совпадает с Integer.valueOf(20)
.
}catch(Exception ex){
ex.printStackTrace();
Если было исключение (это не так, если вы не переопределяете метод sum в подклассе), вы бы здесь перехватили и напечатали объект исключения, а затем бросили егопрочь.
Итак, для сбора мусора доступен один объект (и содержащиеся в нем объекты трассировки стека).
} finally{
i = null;
Здесь вы присваиваете null
переменной i
.Если бы i
содержал объект, на который ссылались только через i
, теперь он был бы доступен для сборки мусора, но поскольку он также находится в переменной j
(и предположительно также где-то в статической переменной в Integer
), это не так.
}
return result;
Мы заканчиваем метод - так что теперь все его локальные переменные (i
, j
, result
) заканчиваются.Объект 20
(в result
) возвращается, таким образом, теперь ответственность за вызывающий метод.На объект 10
(в j
) больше не ссылаются из этого потока (по крайней мере, не в коде, который мы видим), поэтому он может быть освобожден - но, как сказано, обычно класс Integer
сохраняет ссылку на этообъект, так что здесь нет сборки мусора.
}
public Interger getSum(Interger a, Interger b){
retrun a + b;
}
Пожалуйста, при публикации кода хотя бы запускайте его через компилятор.Это Integer
и return
.
}