#java #android #garbage-collection
#java #Android #сборка мусора
Вопрос:
Пожалуйста, помогите мне раз и навсегда устранить это сомнение, которое у меня в голове, учитывая следующие два случая.
Случай 1:
public class Activity {
WebView mWebview;
@Override
public void onCreate(Bundle savedInstanceState) {
initWebView();
}
public void initWebView() {
mWebView = (WebView) findViewById(R.id.webview);
}
}
findViewById()
Создает экземпляр
новыйWebView
объект во второйраз
это вызывается?- Если ответ «да», автоматически ли уничтожается старый
WebView
объект (которому ранее был присвоенmWebView
)? (т.е. теряется из-за помещения в очередь на сборку мусора)
Случай 2:
public class Activity {
WebView mWebview;
MyPictureListener mPictureListener;
@Override
public void onCreate(Bundle savedInstanceState) {
initWebView();
}
public void initWebView() {
mWebView = (WebView) findViewById(R.id.webview);
mPictureListener = new MyPictureListener(mWebView);
mWebView.setPictureListener(mPictureListener);
}
}
- Когда
initWebView()
вызывается
второй раз, это старый
MyPictureListener
объект (который был
ранее назначенный на
mPictureListener
) автоматически
уничтожен? (т.е. теряется, будучи
поставленный в очередь за мусором
коллекция)
Ответ №1:
Случай 1: Независимо от того, сколько раз вы вызываете findViewById(R.id.webview)
, возвращаемый объект является тем же WebView, который был создан, когда макет был расширен платформой пользовательского интерфейса. Когда вы присваиваете его своей переменной, вы просто говорите «Я хочу дескриптор для этого объекта», и это все, что есть. Если вы установите mWebView
значение null
, объект все еще существует со ссылками на него из пользовательского интерфейса Activity, вы просто больше не сможете получить к нему доступ mWebView
.
Случай 2: Да (поскольку ‘automatically destroyed’ работает в Java). У вашего mWebView
есть дескриптор (указатель) на MyPictureListener
объект, когда вы назначаете его новому экземпляру этого класса, ссылка на старый объект теряется, и старый объект теперь является кандидатом на сборку мусора.
На самом деле это [грубо обобщенное] мини-объяснение того, как работают указатели, концепция, которую, как я слышал, некоторые люди говорят, что Java не использует. Это совершенно ошибочно, и освоение указателей в том виде, в каком они используются в C , даст вам гораздо лучшее представление о такого рода вопросах в будущем.