我认为你看错了。如果调用两种方法。例如。
public int test() {
int x = getSomeInt(1);
int y = getSomeInt(2);
return x + y;
}
您是否曾经质疑是否return x + y
已完成或x
之前是否已确定的值y
?它从上到下进行,并且语句设置在返回y
之前未开始getSomeInt(1)
,其值设置为x
. 所以对于你的例子:
protected int getArea() {
if (width <= 0) {
return 0;
} elseif (width == 1) {
return 1;
} else {
Triangle t2 = new Triangle(width - 1);
int area = t2.getArea();
return area + width;
}
}
因此,如果您有一个带宽度的三角形1
并给getArea
您1
回电。
如果你在一个有宽度的三角形上做会发生什么2
?好吧,它创建t2
了宽度1
并调用getArea
它。我们已经知道结果,因为我们已经计算过了。area
变成1
然后它返回1 + 2
。
如果你用宽度 3 来做会发生什么?它将创建t2
宽度2
并调用getArea()
它。我们知道3
从上面返回,结果是3 + 3
。
recusive 方法被调用 high with
,但它是1
首先确定的方法,然后是 2, 3, 4, ...最后你实际调用的调用有一些area
它添加with
到。
对方法的每次调用都与被调用者无关。它是相同的代码,是的,但它是一个不同的对象,并且局部变量对于调用来说是唯一的,就像这两个调用getSomeInt
也有两个不同版本的第一个参数一样。除非您正在变异或通过引用传递,否则它们不会纠缠在一起。
调用对象的方法与调用中作为参数的对象非常相似。递归调用有一个较小的对象,width
并且在某一时刻它将达到基本情况。你可以说这是一样的:
public static int getArea(Triangle t) {
if (t.width <= 0) {
return 0;
} elseif (t.width == 1) {
return 1;
} else {
Triangle t2 = new Triangle(t.width - 1);
int area = getArea(t2);
return area + t.width;
}
}
再一次.. 递归的方法不会改变任何东西。它没有特殊处理。它需要在返回值之前完成它的调用,就像你使用不同的方法来获取区域getArea
一样。完全没有区别。