Автоматически ли при назначении нового объекта уничтожается объект, ранее назначенный тому же элементу данных?

#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);
  }

}
  
  1. findViewById() Создает экземпляр
    новый WebView объект во второйраз
    это вызывается?
  2. Если ответ «да», автоматически ли уничтожается старый 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);
  }

}
  
  1. Когда initWebView() вызывается
    второй раз, это старый
    MyPictureListener объект (который был
    ранее назначенный на
    mPictureListener ) автоматически
    уничтожен? (т.е. теряется, будучи
    поставленный в очередь за мусором
    коллекция)

Ответ №1:

Случай 1: Независимо от того, сколько раз вы вызываете findViewById(R.id.webview) , возвращаемый объект является тем же WebView, который был создан, когда макет был расширен платформой пользовательского интерфейса. Когда вы присваиваете его своей переменной, вы просто говорите «Я хочу дескриптор для этого объекта», и это все, что есть. Если вы установите mWebView значение null , объект все еще существует со ссылками на него из пользовательского интерфейса Activity, вы просто больше не сможете получить к нему доступ mWebView .

Случай 2: Да (поскольку ‘automatically destroyed’ работает в Java). У вашего mWebView есть дескриптор (указатель) на MyPictureListener объект, когда вы назначаете его новому экземпляру этого класса, ссылка на старый объект теряется, и старый объект теперь является кандидатом на сборку мусора.

На самом деле это [грубо обобщенное] мини-объяснение того, как работают указатели, концепция, которую, как я слышал, некоторые люди говорят, что Java не использует. Это совершенно ошибочно, и освоение указателей в том виде, в каком они используются в C , даст вам гораздо лучшее представление о такого рода вопросах в будущем.