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

时间:2014-04-04 07:53:39

标签: java android

我知道在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));
    }

我的问题是:创建实例的确与此处声明变量完全相同吗?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

此外,即使没有变量可以引用对象,也可以创建对象。这些对象通常是短暂的,因为如果对象的任何地方都没有引用,垃圾收集器就会对对象产生邪恶的方式。

如果您来自C ++背景并且您正在向Java过渡,那么花费大量时间来理解这种区别是值得的。很多基本的错误都是因为人们不能完全理解它。

答案 2 :(得分:0)

代码中的部分如下:

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

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

答案 3 :(得分:0)

这一行:

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

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