You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:35:29