Java 为什么静态嵌套类会出现实例字段?
考虑Java 8中的以下代码: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没有理由限制这一点 这里有一个链接可以更好地理解什么是静态类:
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