创建实例是否完全符合声明变量的作用



我知道在Java中,作为一种强类型语言,每个变量都应该被声明。

另一方面,Java是一种面向对象的语言,每个变量都必须创建一个实例。(为变量分配内存)

在这里,我有一个我们没有声明的代码ArrayAdapter

@Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, presidents));
    }

我的问题是:创建实例是否完全符合声明变量在这里的作用?

在 Java 中,只有在需要存储对对象的引用时,才能声明变量。这是可选的,例如

new ArrayList<String>(); // just throws away the reference (pointless, really)

在您的代码示例中,不需要存储对ArrayAdapter的本地引用;该引用仅在setListAdaptor()方法中需要。因此,没有声明局部变量。

你可以写它:

@Override
public void onCreate(Bundle savedInstanceState) 
{
  super.onCreate(savedInstanceState);
  ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), 
      android.R.layout.simple_list_item_1, presidents);
  setListAdapter(adapter);
}

但在这种情况下没有真正的优势。

这是一个很好的问题,因为它指出了Java和C++之间最重要的区别之一,也是程序员从其中一种语言过渡到另一种语言的最大障碍之一。

在C++中,您只需声明一个变量即可创建对象。 也就是说,如果您声明对象类型的变量(而不是引用变量),则当执行到达变量声明时,将创建一个对象;当变量超出范围时,对象将被销毁。

Java不是这样工作的 - 变量独立于它们引用的对象而存在。 如果声明对象类型的变量并且未指定要引用的对象,则它最初将为 null(如果它是类的成员),或者编译器将强制您在使用它之前对其进行初始化(如果它是局部变量)。 但关键是,即使没有对象,变量也可以在范围内。

此外,即使没有变量可以引用对象,也可以创建对象。 此类对象的生存期通常很短,因为如果任何地方都没有对对象的引用,垃圾回收器将对该对象采取邪恶的方式。

如果你来自C++背景,并且正在向Java过渡,那么花很多时间来理解这种区别是值得的。 许多基本错误之所以出现,是因为人们没有完全理解它。

代码中的部分如下所示:

new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, presidents)

"声明"变量的实例,但是您没有保留对它的引用。您也可以这样做:

    ArrayAdapter<String> myArrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, presidents);
    setListAdapter(myArrayAdapter);

然后,它将被声明和引用以供将来使用。

这一行:

setListAdapter(new ArrayAdapter<String>(...));

创建 ArrayAdapter 的实例,并将对该实例的引用传递给方法 setListAdapter'。在这种情况下没有单独的声明步骤(它是一个匿名引用)。

您还可以在单独的步骤中声明、初始化和传递引用:

// declare variable
ArrayAdapter adapter;
// initialize (create an instance and assign it to the declared variable)
adapter = new ArrayAdapter<String>(...);
// pass reference
setListAdapter(adapter);

所以我希望从这个例子中看到声明变量与创建实例不同。

最新更新