分配新对象是否会自动销毁先前分配给同一数据成员的对象?

时间:2011-05-02 22:06:14

标签: java android garbage-collection

请考虑以下两种情况,请一劳永逸地帮助我清除这个疑问。

案例1:

public class Activity {
  WebView mWebview;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    initWebView();
  }

  public void initWebView() {
    mWebView = (WebView) findViewById(R.id.webview);
  }

}
  1. findViewById()是否实例化a 新WebView对象第二时间 它被称为?
  2. 如果答案是'是',那就是旧的 WebView对象(之前是 自动分配给mWebView) 摧毁? (即因迷路而迷失 放在垃圾队列 集合)
  3. 案例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()被称为a时 第二次,是旧的 MyPictureListener对象(那是 以前分配给 mPictureListener)自动 摧毁? (即因迷路而迷失 放在垃圾队列 集合)

1 个答案:

答案 0 :(得分:4)

案例1:无论您调用findViewById(R.id.webview)多少次,返回的对象都是在UI框架夸大布局时创建的WebView。当你将它分配给你的变量时,你只是说“我想要一个对象的句柄”,就是这样。如果您将mWebView设置为null,则对象仍然存在,并且会在活动的用户界面中对其进行引用,您无法再从mWebView访问它。

案例2:是(因为“自动销毁”在Java中有效)。你的mWebView有一个MyPictureListener对象的句柄(指针),当你将它分配给该类的新实例时,对旧对象的引用就会丢失,而旧的对象现在是垃圾收集候选人。

这实际上是关于指针如何工作的一个[粗略概括]的迷你解释,这是我听过一些人说Java不使用的概念。这是完全错误的,并且在C ++中使用指针时会感到很舒服,这将使您在将来更好地了解这些类型的问题。