public class Demo {
public static void main(String[] args) {
Person fred = new Person("Fred");
Person.Property p1 = fred.new Property("last name", "Flintstone");
Person wilma = new Person("Wilma");
Person.Property p2 = wilma.new Property("spouse", fred);
System.out.println(p1);
System.out.println(p2);
}
}
class Person {
private String name;
public Person(String name) { this.name = name; }
public class Property {
private static int count; // Only since Java 17
private String name;
private Object value;
public Property(String name, Object value) {
count++;
this.name = name;
this.value = value;
}
public String toString() { return "I am a property (one of " + count + ") of " + Person.this.name + " with name " + name + " and value " + value; }
}
}
输出:
I am a property (one of 2) of Fred with name last name and value Flintstone
I am a property (one of 2) of Wilma with name spouse and value Person@4e25154f
点是one of 2。其中一个Property对象属于fred,另一个属于wilma。静态变量count并不关心。Person.Property类有一个静态count变量。
6条答案
按热度按时间piah890a1#
基本上是一个武断的决定。没有理由不支持它,但也没有任何好的理由支持它。在外部类中声明静态字段。
此外,这句话可能并不完全正确:我相信你可以在内部类中声明一个静态serialVersionUID。
更新,听起来这在Java 16中是可能的。
0yycz8jy2#
因为Java语言规范是这样说的:
内部类是未显式或隐式声明为静态的嵌套类。内部类不能声明静态初始化器(§8.7)或成员接口。内部类不能声明静态成员,除非它们是编译时常量字段(§15.28)。
至于 * 为什么 * 这样指定,我不知道。我的猜测是,内部类被设计为小型助手类,其复杂性应该非常有限。
mutmk8jj3#
为什么内部类不能声明静态成员?
内部类包含在 外类。因此,在内部类中,不允许声明静态成员。另一方面,静态内部类包含在 外类。因此,只允许声明静态成员,而不允许声明示例成员。
cbjzeqam4#
从Java 17开始,非静态内部类 * 可以 * 声明静态成员。该成员用于整个类。哪个对象示例化它并不重要。下面是一个示例程序来演示这一点。
输出:
点是
one of 2
。其中一个Property
对象属于fred
,另一个属于wilma
。静态变量count
并不关心。Person.Property
类有一个静态count
变量。e4yzc0pl5#
内部
class
不能声明static
字段,除非它们是编译时常量。因此,如果将static
字段声明为final
,它将工作。将完美地编译和运行
static
字段只能在static
或顶级类型中声明。因此,(纯)static
变量只能在static
class
中声明。krugob8w6#
这将导致在内部类中拥有静态成员变量的利益冲突。一般来说,内部类在被示例化之前需要有外部类或封闭类的对象示例。静态成员变量表明,您甚至不需要该特定类(在本例中为内部类)的对象示例,但内部类依赖于该类,并且只能与外部类示例共存。你看到争论中利益冲突的地方了吗?但是,你可以通过将内部类声明为静态来在内部类中创建静态成员变量,这意味着内部类不再需要与外部类对象共存。