2017-08-23 98 views
4

我在绕过递归时遇到了困难,更具体地说,是我的教科书中提供的语法。它看起来像这样:递归调用一个方法

public int sum (int num) 
{ 
    int result; 

    if (num == 1) 
     result =1; 
    else 
     result = num +sum(num -1); 
    return result; 
} 

我很困惑专门与行:

result = num + sum(num - 1); 

,保持跳闸我是在任何其他程序每次一部分,我们从调用一个方法两种方式。这个方法是一个静态方法,并且通过类名跟一个句点,然后是方法名来调用。 (例如:Math.random();) 或者,该方法已通过同一类的对象引用变量进行调用。 (我们首先必须独立创建) 这个语法似乎不遵循前面两个例子中的任何一个,我想知道这是为什么?仅仅是因为我们从方法本身内部调用方法,并且在语法上它是如何完成的或者我错过了什么?

+3

突出显示的行相当于'result = num + this.sum(num - 1);'。 –

+0

不知道这与递归有什么关系......你可以在这个语法之后调用同一个类的任何方法* –

回答

3

如果调用者在与方法相同的类中,则可以通过其名称调用方法而没有任何点或导入。这是因为Java只使用点来导航到方法的类位置,但是如果方法被调用时没有任何点,那么程序就会知道该方法在调用者的类中。你可以使用这种方法调用所有类型的的方法,只要它们在同一个类中或超类

以区号为例,当您在手机上拨打号码时,您将拨打1,然后拨打3位数区号,然后拨打7号码。但是,如果您的电话在您拨打的号码的3位数区号内登记,则只需键入不带区号的7位数字号码。

3

当一个方法简单地通过它的名字被调用并且不是静态的,这意味着你正在调用this上的方法。所以,你的代码等同于以下情况:

public int sum (int num) { 
    int result; 

    if (num == 1) 
     result =1; 
    else 
     result = num + this.sum(num -1); 
    return result; 
} 

这是一类定义的任何实例方法真实的,而不仅仅是递归方法(这是语法上不以任何特定的方式特殊)。

0

在Java中,你不能让你莫名其妙地被迫把它写一个类内部进行课外功能。现在,你有两种类型的方法:

静态 - 你可以把它看作'放在容器/命名空间(类是容器在这种情况下)的'自由'功能。

非静态 - 这是一个具有被Java通过一个特殊的参数方法:self包含实例数据,例如:

Foo a = new Foo(); 
a.bar(); // calls method bar from class Foo with a instance 

现在,当你在里面一个静态的还是非静态方法你有一个周围类的范围,这意味着你可以使用其他类成员,而不需要添加selfClassName