gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:17:45 25 4
gpt4 key购买 nike

考虑以下两种情况,请帮我一劳永逸地消除我脑海中的这个疑问。

案例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. 如果答案是"is",则为旧的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:无论调用 findViewById(R.id.webview) 多少次,返回的对象都是 UI 框架膨胀布局时创建的同一个 WebView。当您将它分配给变量时,您只是说“我想要该对象的句柄”,仅此而已。如果将 mWebView 设置为 null,该对象仍然存在,并从 Activity 的 UI 引用它,只是无法从 mWebView 访问它不再了。

情况 2:是的(只要“自动销毁”在 Java 中有效)。您的 mWebView 有一个指向 MyPictureListener 对象的句柄(指针),当您将其分配给该类的新实例时,对旧对象的引用将丢失,并且旧对象现在是垃圾回收的候选对象。

这实际上是对指针如何工作的[粗略概括]迷你解释,这是我听到有些人说 Java 不使用的概念。这是完全错误的,熟悉 C++ 中使用的指针将使您将来更好地了解此类问题。

关于java - 分配新对象是否会自动销毁先前分配给同一数据成员的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5862985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com