Java 为什么静态嵌套类会出现实例字段?

Java 为什么静态嵌套类会出现实例字段?,java,class,static,nested,Java,Class,Static,Nested,考虑Java 8中的以下代码: class OuterClass { static class MyStaticClass { static int staticInt = 5; int instanceInt = 6; } } 为什么静态嵌套类可以声明似乎是实例字段的instanceInt?我假设您会问为什么instanceInt可以声明而不是静态字段?答案很简单,因为Java没有理由限制这一点 这里有一个链接可以更好地理解什么是静态类:

考虑Java 8中的以下代码:

class OuterClass {

    static class MyStaticClass {

        static int staticInt = 5;
        int instanceInt = 6;
    }
}

为什么静态嵌套类可以声明似乎是实例字段的instanceInt?

我假设您会问为什么instanceInt可以声明而不是静态字段?答案很简单,因为Java没有理由限制这一点

这里有一个链接可以更好地理解什么是静态类:


静态嵌套类可以通过对象引用引用在其中定义的实例变量或方法

下面的代码完全有效

public class OuterClass {

    public static void main(String[] args) {
        OuterClass.MyStaticClass myStaticClassOne = new OuterClass.MyStaticClass();
        OuterClass.MyStaticClass myStaticClassTwo = new OuterClass.MyStaticClass();
        OuterClass.MyStaticClass myStaticClassThree = new OuterClass.MyStaticClass();
        myStaticClassOne.setInstanceInt(10);
        myStaticClassTwo.setInstanceInt(20);
        System.out.println("staticInt: " + MyStaticClass.staticInt);
        System.out.println("instanceIntOne: " + myStaticClassOne.getInstanceInt());
        System.out.println("instanceIntTwo: " + myStaticClassTwo.getInstanceInt());
        System.out.println("instanceIntThree: " + myStaticClassThree.getInstanceInt());

    }

    static class MyStaticClass {
        static int staticInt = 5;
        int instanceInt = 6;

        public int getInstanceInt() {
            return instanceInt;
        }

        public void setInstanceInt(int instanceInt) {
            this.instanceInt = instanceInt;
        }
    }
}
输出:

静态整数:5

instanceIntOne:10

实例二:20

实例三:6


由于可以创建静态嵌套类的实例,因此进程结束时退出代码为0

。为什么要在这里限制实例字段?“静态类”只是一个不保留对父类实例引用的类声明。因此,这没有什么错。仅供参考:它们“看起来”没有实例字段,实际上它们有实例字段。通常当我们问“为什么[某件事]可能?”时,最好包括我们认为不可能的原因。通过这种方式,其他人可以更容易地看到并指出我们的错误或不正确的假设。如果您实际显示两个不同的实例可以为
instanceInt
提供不同的值,那么这将是一个更好的示例。您试图显示静态嵌套类不仅“看起来”有实例字段,而且实际上确实有实例字段。您已经通过显示您可以创建嵌套类的实例来完成了,但是您还没有实际显示该实例确实有实例字段。例如,如果OP认为类上的
static
隐式地使所有字段
也成为static
,那么您并没有用您的示例反驳OP的误解。@Andreas:谢谢您的建议。我已经包括了实例的getter和setter