我知道在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));
}
我的问题是:创建实例的确与此处声明变量完全相同吗?
答案 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);
所以我希望从这个例子中你看到声明变量与创建实例不同。