LeetCode 965单值二叉树:为何需在方法外声明List vals?
成员变量声明与ArrayList实例化的问题解析
1. 为何要在方法外部声明List vals;
- 作用域覆盖需求:如果把
vals声明在方法内部,它就只是该方法的局部变量,只能在这个方法里使用。但原代码中vals需要被多个方法(比如添加元素的方法、计算平均值的方法)共同访问和操作,所以必须把它声明为类的成员变量,让整个类的方法都能共享这个集合实例。 - 数据持久化需求:成员变量的生命周期和类的实例绑定,只要类对象存在,
vals里存储的数据就会保留;如果是方法内的局部变量,方法执行完毕后就会被垃圾回收,之前存的数据也就丢失了。
2. List vals; 与 vals = new ArrayList(); 的写法说明
List vals;:这是变量的声明语句,仅告诉编译器要定义一个名为vals、类型为List(Java集合框架中的接口)的变量。此时vals只是一个空引用,并没有指向任何实际的集合对象,值为null。vals = new ArrayList();:这是对象实例化与赋值语句,new ArrayList()会在内存中创建一个ArrayList类的实例(真正能存储数据的集合对象),然后把这个对象的内存地址赋值给vals变量,让vals指向这个真实存在的集合。
3. 为什么允许vals = new ArrayList();这种实例化方式
这是Java多态特性的典型应用:
List是一个接口,ArrayList是实现了List接口的具体类。根据多态规则,接口类型的引用可以指向其实现类的对象。- 这种写法的优势在于解耦:如果后续需要将集合类型换成
LinkedList,只需要修改new LinkedList()这部分代码,所有使用vals的地方(只要是调用List接口定义的方法)都不需要改动,代码的灵活性更高。
与你最初写法的核心区别
你最初的写法应该是将List vals = new ArrayList();放在了方法内部,这种写法存在两个关键问题:
- 每次调用该方法都会创建一个全新的
ArrayList实例,之前存储的数据无法在方法调用之间保留,无法实现数据的持续存储。 - 其他方法无法访问这个局部的
vals变量,无法满足多个方法共同操作同一个集合的需求。
内容的提问来源于stack exchange,提问作者Mr.Frog
相关产品推荐
相关产品推荐

