为何在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
相关产品推荐
相关产品推荐

