Java 内部类使用问题
问题不在“内部类能不能这么写”,而在于 Solution_2 是非静态内部类,而 main 是静态方法,所以 new Solution_2() 会编译不过。
你现在的结构(假设都在同一个外部类里)
public class Main {
public static void main(String[] args) {
Solution_2 solution2 = new Solution_2(); // ❌ 编译错误
}
class Solution { ... } // 非静态内部类
class Solution_2 { ... } // 非静态内部类
}
报错信息类似:
non-static variable this cannot be referenced from a static context
原因:非静态内部类(成员内部类)必须依附于外部类的实例才能创建。而 main 是 static 的,没有 Main 的实例,所以不能直接 new Solution_2()。
改法一:把内部类改成 static(最推荐)
public class Main {
public static void main(String[] args) {
Solution_2 solution2 = new Solution_2(); // ✅
}
static class Solution { ... }
static class Solution_2 { ... }
}
加 static 后,它就变成静态嵌套类,不依赖外部类实例,可以直接 new。这也是 LeetCode 里常见的写法。
改法二:先创建外部类实例,再创建内部类实例
public class Main {
public static void main(String[] args) {
Main main = new Main();
Solution_2 solution2 = main.new Solution_2(); // ✅ 注意语法
}
class Solution { ... }
class Solution_2 { ... }
}
语法是 外部类实例.new 内部类(),比较别扭,一般不推荐。
改法三:把 Solution / Solution_2 直接写成顶层类
如果你是在一个 .java 文件里写多个类,只要最多一个是 public,且 public 的那个和文件名一致,其他可以写成包级私有的顶层类:
// 文件名 Main.java
public class Main {
public static void main(String[] args) {
Solution_2 solution2 = new Solution_2(); // ✅
}
}
class Solution { ... } // 顶层类,包级私有
class Solution_2 { ... } // 顶层类,包级私有
这样也能直接 new,因为它们是并列的顶层类,不是内部类。
三种方式怎么选?
| 方式 | 写法 | 适用场景 |
|---|---|---|
| 静态嵌套类 | static class Solution_2 |
最推荐,LeetCode 常用 |
| 内部类 + 外部实例 | main.new Solution_2() |
很少用 |
| 顶层类 | 直接写 class Solution_2 放在同一文件 |
一个文件放多个类时方便 |
顺带提一句 Solution 里的写法
你代码里 nums_map.put(nums[i], new ArrayList<>(Arrays.asList(i))); 这行没问题,Arrays.asList(i) 会把 int i 装箱成 Integer,得到 List<Integer>,再传给 ArrayList 构造器,可以正常编译。
真正要改的就是内部类的 static 问题。加两个 static 上去,new Solution_2() 就能通过了。

浙公网安备 33010602011771号