我看到了下一堂课:
public static class DetailsFragment extends Fragment {
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
}
我不明白为什么你可以返回DetailsFragment类型,即使你只是定义了DetailsFragment是什么。对我来说(新手),就像在字典中搜索单词一样,定义使用单词本身来定义它。
请解释一下。 提前谢谢。
答案 0 :(得分:1)
newInstance
方法上的static
modifier是关键。该修饰符将方法定义为独立,只需将代码自行运行,而不是定义属于对象(实例)的行为。
静态方法是不 object-oriented的Java部分之一。长话短说,有时只需运行一大块代码而不将其绑定到对象就很方便。
如果遵循常见的Java命名约定,其中一个类以初始的大写字符命名,并且该类的实例以初始小写字母命名,那么您可以轻松地发现静态方法的调用。
DetailsFragment.newInstance() // A static method call made on a class. Not object-oriented.
detailsFragment.someMethod() // Instance method, invoked on one instance (one object) of type DetailsFragment named 'detailsFragment'.
因此,您的newInstance
方法不是构造函数方法。 喜欢构造函数方法,因为它旨在创建一个对象。这种方法有时被称为工厂方法。
你的思路是正确的。为同一个类调用new
的构造函数会导致无限循环的对象创建一个创建对象的对象,依此类推,直到您的应用程序执行失败。这种对自身的重复调用称为recursion。如果不受控制,递归是不好的,导致您的应用程序失败。工厂方法的递归也会以同样的方式变坏,无休止地运行直到失败。
但是我们有一个工厂方法通过调用new
来调用构造函数。所以,没有不受控制的递归,根本没有递归。
如果您对这些概念不熟悉,那么将它们包裹起来可能会很棘手。对我来说,关键是当我的眼睛使用static
修饰符时,我认为"不是面向对象的"并将我的大脑从OOP模式转移出来,转而考虑简单的程序代码。
在视觉上,我认为一个类是一个cookie切割器,对象/实例是正在生成的cookie,静态方法是一个由字符串绑定到cookie切割器的注释。这个静态方法实际上与类无关,但是将它绑定到类给了我们一个可以保存的地方,这是我们以后查找和调用该方法的一种方式。