Loading

AIGC标识 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() 就能通过了。

posted @ 2026-09-16 16:50  wsttask  阅读(17)  评论(0)    收藏  举报