为什么有可能声明一个返回正在创建的同一类的类型的方法?

为什么有可能声明一个返回正在创建的同一类的类型的方法?

问题描述:

我看到隔壁班:为什么有可能声明一个返回正在创建的同一类的类型的方法?

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型即使you're只是定义DetailsFragment是什么。对于我来说(一个新手),就像在字典中搜索一个词,定义使用这个词来定义它。

请解释。 在此先感谢。

+1

那么,一个类的构造函数也在类中。这就是实际用来构造类的实例的内容。那么为什么类的静态方法不能调用这个构造函数呢?没有什么可以解释的。它不仅被允许,而且是一种常见的被称为工厂方法的模式。 –

+2

您需要区分类和类本身的实例。类就像你的字典隐喻之后的定义。实例化一个类可以被看作是使用定义(更多的是模板)来创建实际的东西(例如* apple *是类* Apple *的一个实例)。 – jrook

+0

你似乎有区别声明一个类(以及类型)实例化该类(或类型)的对象的问题。 – Seelenvirtuose

构造与上newInstance方法静态工厂法

static modifier是关键。该修饰符将方法定义为分离,简单代码以独立运行,而不是定义属于对象(实例)的行为。

静态方法是Java的一部分,即而不是object-oriented。长话短说,有时只需运行一大块代码而不用捆绑到一个对象上就很方便。

如果您遵循常见的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模式转移出来,转而根据简单的过程代码进行思考。

在视觉上,我认为一个类是一个饼干,对象/实例是正在生产的饼干,而静态方法是一个由字符串绑定到饼干的注释。这种静态方法实际上与类没有任何关系,但将它与类绑在一起给我们留下了一个地方,这是我们稍后查找和调用该方法的一种方式。

+1

也就是说,狗创造了狗,猫创造了猫,并且完全允许类的实例方法创建同一类的其他实例。 –

+0

不过这不仅仅是关于'static'。有许多实例方法的例子返回同一类的实例,例如'substring','concat','subList'(和'String.toString()',但这是一种不寻常的情况!)。 –

+0

@AndyTurner&JBNizet我正在处理这个问题的具体问题,我认为这个问题是作者将静态工厂方法与构造函数混合在一起的。这两人确实很容易混淆。我们不需要在这里解释面向对象的每个方面,只有混淆作者的特定方面。 –