Java方法内重复定义变量sblst报错,while循环中重复定义为何无错?
为什么Java中方法内重复定义变量报错,但循环内重复定义却不报错?
这其实是Java**作用域(Scope)**规则在起作用,我来给你拆解清楚:
1. 作用域的核心规则
Java里的变量是有「有效范围」的:
- 方法级作用域:在方法体直接定义的变量(没有被
{}包裹的),整个方法内都能访问。同一个方法作用域里,绝对不能有两个同名的变量,否则会触发「variable is already defined」的错误。 - 块级作用域:被
{}(比如循环、if语句的代码块)包裹的区域是独立的块作用域。每个块里的变量只在当前块内有效,块执行结束后这个变量就相当于「消失」了。不同块之间的同名变量互相不干扰,就像两个不同房间里的同名物品,彼此碰不到面。
2. 结合你的代码具体分析
看你写的代码:
- 第一个
List<Integer> sblst = new ArrayList<Integer>();是在generate方法的最外层定义的,属于方法作用域,整个方法都能访问到它。 - 紧接着在
if(numRows==1) return lst;之后,你又写了List<Integer> sblst = new ArrayList<Integer>();——这时候这个变量和第一个sblst处于同一个方法作用域里,重名了,编译器自然会报错。 - 而
while(i<numRows){}里面的List<Integer> sblst = new ArrayList<Integer>(0);是在循环块的作用域里定义的:每次循环都会创建一个新的块,这个块里的sblst只在当前循环周期内有效,循环结束后这个块的作用域就销毁了。下一次循环是一个全新的块,再定义同名的sblst完全没问题,因为它们属于不同的块,互相看不到对方。
3. 给你的修改建议
你已经发现把方法里重复的sblst改成其他名字就不报错了,这是最直接的解决方式。另外也可以用块作用域隔离,比如把第二个sblst的代码包在独立的{}里:
{ List<Integer> sblst = new ArrayList<Integer>(); if(numRows>=2) sblst.add(1); sblst.add(1); lst.add(sblst); //i=1 }
这样这个sblst就属于这个小块的作用域,和方法外层的sblst彻底不冲突了。
内容的提问来源于stack exchange,提问作者Gagandeep Singh
相关产品推荐
相关产品推荐

