繁体   English   中英

为什么我们必须将方法声明为java中递归调用的静态方法?

[英]Why do we have to declare method as static for recursive call in java?

谁能告诉我为什么 Java 中的递归调用方法应该是静态的?

class abc {
    static void fun(int n) {
        if (n > 0) {
            System.out.println(n);
            fun(n - 1);
        }
    }

    public static void main(String args[]) {
        int x = 3;
        fun(x);
    }
}

不,他们不应该。 您可能是这种情况的原因仅仅是因为您开始从作为main的静态方法调用您的方法,并且可能在另一个之后开始修复错误。

main是静态的,因此不能隐式地假设this引用。 写这个的另一种“非静态”是

class abc {
   void fun(int n) {
    if (n > 0) {
        System.out.println(n);
        fun(n - 1);
    }
}

public static void main(String args[]) {
    int x = 3;
    abc a = new abc();
    a.fun(x);
}
}

您实际上不需要将递归函数设为静态。 大多数教程将其保持为静态,以便他们很容易演示它的用法,而无需创建定义递归函数的类的新实例。

如果是非静态递归函数,则需要创建一个新实例来调用该函数。 而静态函数可以由类本身访问,而无需创建相同的实例。

查找阶乘的递归函数的一个简单示例如下:

public class Main {

    public static void main(String[] args) {
        System.out.println(new Main().getFactorial(5));
    }

    public int getFactorial(int n) {
        if (n <= 1) {
            return 1;
        }

        return n * getFactorial(n - 1);
    }
}

我认为你的问题从一个好的类设计指南的角度来看是有道理的,它应该是静态的,因为让我们看看计算阶乘 n 的 factorial(int n) 方法,它应该被定义为静态,因为它独立于任何特定实例。 定义一个应该是静态的实例方法是一个常见的设计错误。 如果一个方法不依赖于一个特定的实例,它应该是一个静态方法。 参考:Java 编程简介,Daniel Liang

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM