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

Java集合技术问询:List为接口,无需匿名类如何通过new ArrayList()创建实例

为什么能通过new创建List接口的"实例"?详解List listTry = new ArrayList();的原理

哈哈,这个问题刚学Java的时候我也纠结过!其实核心点是:你并没有直接new List接口本身——代码里真正被实例化的是ArrayList,也就是List接口的一个具体实现类,只是用List类型的引用变量去指向这个实例而已,这是Java多态特性的典型应用。

代码List listTry = new ArrayList();的工作原理

我们把这行代码拆成三部分来看:

  • new ArrayList():这部分才是真正创建实例的操作。JVM会在堆内存中为ArrayList对象分配空间,执行它的构造方法(比如初始化底层存储元素的数组),最终生成一个可以正常使用的ArrayList实例。
  • List listTry:这是声明一个List类型的引用变量,它会被存储在栈内存中,此时它还没有指向任何对象。
  • 赋值操作=:把堆中刚刚创建的ArrayList实例的内存地址,赋值给listTry这个引用变量。从此listTry就可以代表这个ArrayList对象,通过它调用List接口中定义的方法。

实例的创建机制

  1. 接口与实现类的关系:List是一个接口,它只定义了一组方法规范(比如add()、get()、remove()等),但没有具体实现。而ArrayList是List接口的一个具体实现类,它完全实现了List接口中所有的抽象方法,同时还添加了自己的一些特性(比如基于动态数组的存储)。
  2. 向上转型的合理性:Java允许将实现类的对象赋值给接口类型的引用,这叫做"向上转型"。因为ArrayList实现了List接口,所以它的实例完全符合List接口的规范,用List类型的引用指向它是完全合法的。
  3. 这样写的好处:这种写法让代码更灵活——如果之后你想把存储结构换成LinkedList(另一个List接口的实现类),只需要把new ArrayList()改成new LinkedList()就行,其他使用listTry的代码根本不需要修改,因为它们只依赖List接口的方法规范,不关心具体的实现细节。

补充一句:如果你真的尝试直接new List(),编译器会直接报错,因为接口是不能被实例化的,它只是一个规范,没有具体的构造逻辑。

内容的提问来源于stack exchange,提问作者Prasanna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:28