1. java 中一个普通类是不可以定义为 static 的, 只有内部类可以为静态类。
而 C# 中是可以直接定义一个静态类的。
2. java 中的静态内部类中可以定义静态成员也可以定义非静态成员,静态成员可以用类名直接访问,
而非静态成员只有 new 一个静态内部类的实例才可以访问到。
java 静态内部类中只能访问外部类的静态成员,因为如果可以访问外部类的非静态成员,这时候外部类
可能还没有实例化,这时就会出错。
很多人疑惑为什么 java 静态类内部类中可以有非静态成员,还有为什么可以 new 一个静态类。(特别是 c# 程序员)
java 中应该说没有所谓的静态类, 静态内部类其实就是一个普通的类, 所以既可以有静态成员也可以有非静态成员,当然也可以 new 一个实例。
但是如果直接引用静态内部类的静态成员而不实例化,这时静态内部类中的非静态成员还没有分配内存而被忽略了,这就没什么意义了。 所以静态
内部类中最好只定义静态成员。
个人认为 java 应该强制静态内部类中只能定义静态成员而不能定义非静态成员, 就像 c# 一样增加 static 类的设计。
c# 中的静态类中只能定义静态成员,且不能 new 一个静态类的实例 。普通类中的静态成员只能用类名进行引用,不能用类的实例进行引用。
(本人水平太菜,有错误还请大 N 指出。)
3. java 中非静态内部类必须用外部类的对象来实例化,且非静态内部类中不能有静态成员,但可以有常量。
这主要是因为非静态内部类中可能会引用外部类的成员, 所以必须保证外部类先实例化,才能正确的实例化非静态内部类。
非静态内部类可以看成外部类的一个实例成员。
非静态内部类对象隐含地保存了一个指向外部类对象的引用,每一个非静态内部类的实例都链接到一个外部类的实例上。
而静态内部类不会链接到外部类的实例上。