我知道创建非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象自动拥有对外部类对象的隐藏引用。但为什么非静态内部类有静态成员呢? Java设计者只需要禁止在内部类的静态方法中访问非静态外部类字段,它会更有意义吗,非?
如果在内部类中使用静态成员没有意义,为什么内部类可以通过继承具有静态成员的类来继承静态成员?
我也读过这个post。如上所述:
内部类可以继承非编译时的静态成员 常数,即使他们可能不会声明它们。嵌套类 不是内部类可以按照自由声明静态成员 使用Java编程语言的通常规则。
这是惯例吗?
这是我的代码:
public class OuterClass {
private int outerClassField;
public void doSomethingOuterClass() {
outerClassField = 1;
}
public static void doSomethingStaticOuterClass() {
// outerClassField = 2; // Error: Because static method cannot access an specific object's field
}
public class InnerClass extends ClassWithStaticField {
// Error: Why a non-static inner class cannot have static fields ?
// public static int innerClassStaticField = 1;
public void doSomethingInnerClass() {
outerClassField = 3;
staticField = 1;
}
// Error: Why a non-static inner class cannot have static methods ?
// public static void doSomethingStaticInnerClass() {
// outerClassField = 4;
// }
}
public static void main(final String[] args) {
// If it does not make sense to have static members in an inner class, why inner class can inherit statis members by inheriting a class who has static
// members?
OuterClass.InnerClass.staticField = 1;
OuterClass.InnerClass.staticMethod();
}
}
class ClassWithStaticField {
public static int staticField;
public static void staticMethod() {
};
}
答案 0 :(得分:15)
1。 object
Non-static inner class
与其instance/object
的{{1}}相关联(即附上课程)。
2。 <{strong> Outer Class
的整个主体不在静态范围内,因此您可以那里没有静态成员。
3。 Non-static inner class
和Instance variables
中的methods
相对于封闭类的实例,因此相关对于一个对象,静态不适合他们(即内部类),
4. 当我们创建{{1>} 非静态 non-static inner class
时,我们需要一个{{ 1}}。 内部 Instance
对inner class
有一个隐式引用。
<强>例如强>
Object of Outer enclosing class
答案 1 :(得分:8)
从技术上讲,我不知道为什么语言限制内部类使用静态元素的任何原因。 可以使用普通类来模拟非静态内部类,该普通类将(以前)封闭的实例作为构造函数的参数。当然,在可见性规则和可见性范围方面存在许多细微差别。
我认为这是一个语言设计决策,主要是因为非静态内部类中的静态访问令人困惑且不直观(Outer.Inner.StaticMember)。