Java 递归方法是否允许创建多个同名变量?

Java 递归方法是否允许创建多个同名变量?,java,file,recursion,directory,Java,File,Recursion,Directory,我必须想出一种方法,递归地遍历一个目录,列出其中的所有文件和子目录文件。我很确定我已经想出了一个可靠的方法来实现这一点,但是我需要一个文件数组来临时保存当前目录中的文件和目录列表。 我的问题是,一旦程序再次调用自身,该临时数组是否会被重写到现在打开的目录中的文件和目录列表中,或者是否创建了某种新数组 代码还没有完成,我只是把它包括进来,让大家知道我在用什么。当再次调用临时数组时,如果存在子目录,当程序最终返回到第一次调用时,该程序是否仍然拥有临时数组? 如果没有,我可以做些什么来解决这个问题?我

我必须想出一种方法,递归地遍历一个目录,列出其中的所有文件和子目录文件。我很确定我已经想出了一个可靠的方法来实现这一点,但是我需要一个文件数组来临时保存当前目录中的文件和目录列表。 我的问题是,一旦程序再次调用自身,该临时数组是否会被重写到现在打开的目录中的文件和目录列表中,或者是否创建了某种新数组

代码还没有完成,我只是把它包括进来,让大家知道我在用什么。当再次调用临时数组时,如果存在子目录,当程序最终返回到第一次调用时,该程序是否仍然拥有临时数组? 如果没有,我可以做些什么来解决这个问题?我曾想过创建一个列表,但在类型转换方面一直遇到麻烦

private void enumerateDirectory(File f)
    {
        if(f.isDirectory()){                
            File[] temp = f.listFiles();

            for(int i = 0; i<temp.length; ++i){
                if(temp[i].isDirectory()){
                    enumerateDirectory(temp[i]);
                }
                else{
                    items[i].add(temp[i]);
                }
            }

        }
            else{
                 //error message to go here
            }
    }
私有目录(文件f)
{
if(f.isDirectory()){
File[]temp=f.listFiles();

对于(int i=0;i,每次方法递归时,就好像它是一个全新的方法调用--您不必担心变量名冲突,因为您只能访问当前方法执行中的变量。例如

public void a() {
    int v = 1;
    b();
}

public void b() {
    // can't access v;
}
方法
b()
无法访问变量
v
。对于您来说情况相同,除了
a()
调用
b()
之外,它是
enumerateDirectory()
调用自身

此外,编译程序时会丢弃局部变量名,并在堆栈上用偏移量替换它们。在这种情况下,它是指向数组的指针,因此在每个帧中只是一个小指针引用

编辑
但是,
items
中的元素将被重写,因为它不是局部变量。我不确定这是否是您想要的。每次方法对
items
起作用时,内容都保持不变,因为它是类中的一个字段(我猜,因为我在代码中没有看到它)。这意味着如果
a()
null
s填充它,然后当
b()
到达那里时,那里仍然会有
null
s。

当进行递归调用时,该方法会克隆自身,生成以下内容的新副本: 代码、局部变量(及其初始值)和参数

对于第一次调用,您将所有文件保存在一个数组temp中(如果f是目录):

然后在temp中迭代文件,并为每个文件再次递归调用传递文件名的方法。现在我们有了一个新的方法副本,其中传递的文件将是该方法的参数
f
。当该方法副本结束时,控件将在循环后返回到下一个语句

如果存在子目录,则再次调用临时数组时 当程序最终返回时,它仍然拥有临时数组 第一个电话? 是的


文件数组不会被覆盖,因为它将被下推到堆栈中。我会使用
items
数组的列表进行覆盖,因为它是可扩展的,并且避免了可能出现的
ArrayIndexOutOfBound
。谢谢,是的,我在发布后不久就意识到了这一点。可能只是要添加一个计数器f类范围中的某种类型,每次添加项时都会增加,而不是将其绑定到i
File[] temp = f.listFiles();