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

为何在Java中创建内部类实例需将其设为static?

为什么内部类不加static就无法在main方法中实例化?

核心区别:静态内部类 vs 非静态内部类

Java里把定义在另一个类内部的类分为两种,本质区别在于是否依赖外部类的实例:

  • 非静态内部类(不加static):它是外部类的「成员」,和外部类的实例绑定。就像外部类的非static字段/方法一样,必须先有外部类的对象,才能创建这个内部类的对象。
  • 静态内部类(加static):它属于外部类本身,和外部类的实例无关,相当于一个独立的类,只是放在外部类的命名空间里而已。

你的代码为什么不加static会报错?

main方法是static的,static方法属于类级别,不需要创建外部类的实例就能执行。当你在main里直接new person()时,如果person是非静态内部类,Java会要求你先提供一个MyProgram的实例(因为非静态内部类必须依附于外部类实例),但static方法里没有这个实例,所以编译器直接报错。

加static后的运行原理

给person类加上static后,它就变成了静态内部类,不再依赖MyProgram的实例。此时它和普通的顶级类几乎一样,只是被放在MyProgram的命名空间下,所以在static的main方法里可以直接创建它的实例,不需要任何外部类对象。

要是不加static,怎么才能正常运行?

如果不想给person加static,你需要先创建外部类MyProgram的实例,再通过这个实例来创建内部类对象:

public class MyProgram{
    public static void main(String[] args){
        // 先创建外部类实例
        MyProgram outer = new MyProgram();
        // 通过外部类实例创建内部类对象
        person jim = outer.new person(36);
        person bob = outer.new person(16);
        System.out.println(jim.getAge());
        System.out.println(bob.getAge());
    }
    // 非静态内部类
    public class person{
        private int age;
        public person(int a){
            age = a;
        }
        public void setAge(int a){
            age = a;
        }
        public int getAge(){
            return age;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:36