我知道在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);
所以我希望从这个例子中看到声明变量与创建实例不同。