请考虑以下两种情况,请一劳永逸地帮助我清除这个疑问。
案例1:
public class Activity {
WebView mWebview;
@Override
public void onCreate(Bundle savedInstanceState) {
initWebView();
}
public void initWebView() {
mWebView = (WebView) findViewById(R.id.webview);
}
}
findViewById()
是否实例化a
新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()
被称为a时
第二次,是旧的
MyPictureListener
对象(那是
以前分配给
mPictureListener
)自动
摧毁? (即因迷路而迷失
放在垃圾队列
集合)答案 0 :(得分:4)
案例1:无论您调用findViewById(R.id.webview)
多少次,返回的对象都是在UI框架夸大布局时创建的WebView。当你将它分配给你的变量时,你只是说“我想要一个对象的句柄”,就是这样。如果您将mWebView
设置为null
,则对象仍然存在,并且会在活动的用户界面中对其进行引用,您无法再从mWebView
访问它。
案例2:是(因为“自动销毁”在Java中有效)。你的mWebView
有一个MyPictureListener
对象的句柄(指针),当你将它分配给该类的新实例时,对旧对象的引用就会丢失,而旧的对象现在是垃圾收集候选人。
这实际上是关于指针如何工作的一个[粗略概括]的迷你解释,这是我听过一些人说Java不使用的概念。这是完全错误的,并且在C ++中使用指针时会感到很舒服,这将使您在将来更好地了解这些类型的问题。