下面这段解释不知你是否满意呢?
inner class的问题,inner class是否能够有static的变量?
一般的说法是,static inner class能够有static的变量,而non-static inner
class则不能有static的变量。但是,如果这样:
class outer {
class inner {
static final int i = 999;
}
}
编译通过。而你不能这么写:
static final int i;
就是说,一定要在声明它的时候赋予初值, 因为i是final的,它的值不能再被改变。
关于inner class, 还有一个代码也很能说明一些问题。
public class TestClass
{
public TestClass(int i) { } public void m1()
{
TestClass al = new TestClass(10)
{
public void actionPerformed(ActionEvent e)
{
}
};
}
}
这说明了一下四个问题:
1. 类中的方法也可以有inner classes.(但是他们不能有static inner classes).
2. Inner class 能够继承包含它的外部class.
3. 匿名 inner class 可以继承一个 class 或者 implements 一个 interface。
4. 匿名 inner class 可以有初始化参数。(如果这个class继承的基类有相应的 constructor 的话。)
inner class的问题,inner class是否能够有static的变量?
一般的说法是,static inner class能够有static的变量,而non-static inner
class则不能有static的变量。但是,如果这样:
class outer {
class inner {
static final int i = 999;
}
}
编译通过。而你不能这么写:
static final int i;
就是说,一定要在声明它的时候赋予初值, 因为i是final的,它的值不能再被改变。
关于inner class, 还有一个代码也很能说明一些问题。
public class TestClass
{
public TestClass(int i) { } public void m1()
{
TestClass al = new TestClass(10)
{
public void actionPerformed(ActionEvent e)
{
}
};
}
}
这说明了一下四个问题:
1. 类中的方法也可以有inner classes.(但是他们不能有static inner classes).
2. Inner class 能够继承包含它的外部class.
3. 匿名 inner class 可以继承一个 class 或者 implements 一个 interface。
4. 匿名 inner class 可以有初始化参数。(如果这个class继承的基类有相应的 constructor 的话。)
我的问题的关键就是这句:为什么non-static inner class不能包含static字段和方法(编译时常量除外).
别不是你在inner class 里面的static 方法里面包含了non-static 方法或者变量吧。
非静态类中,可以有静态方法,但是也可以有非静态方法,如果两者都有的话,
在调用非静态方法的时候,就会发生new的冲突,所以java为了避免这种混淆,所以就不允许在非静态方法中使用静态的方法和变量
语义上说的通的。
只不过是个name space, 和一些access control方面的东西罢了。
为什么这样说呢?
我们都知道,一个inner class, 只不过是个隐士拥有一个对outer class得引用而已。
所以,
class A{
public void f();
class I{
public void g(){f();}
}
}
里的I, 可以模拟为:
class A{
public void f();
}
class I{
private final A outer;
public void g(){outer.f();}
I(A a){this.outer = a;}
public static int i;
}
这里,除了inner class能自动拥有对outer class私有成员的访问权,以及名字空间上的区别,语义上真是太一样了。
而这个新的I类,就是可以拥有静态成员的。之所以Java不支持这样做,我想原因是
1。 语法上,即使有non-static inner class的静态成员,也没什么用。
为什么呢?
对上面例子中的inner class I类, 我们语法上怎么使用呢?A.I是肯定不行的。因为I是non-static的。
所以,就一定要一个A的instance. 如new A().new I()之类。那么此时,你已经不需要静态成员了。因为无论如何,你还是被迫要生成实例。
这里, Java对non-static inner class的语法,决定了它很难清楚简洁地表达一个静态成员的概念。除非Java针对这个需求,修改或增加它的语法规则。2。 对non-static inner class拥有静态成员的需求并不理直气壮。你为什么一定要这么个东西呢?你有那么多还不错的work-around嘛。而显然,Java并不想为了一个似乎没什么用的feature去增加语言的复杂度。