Kew*_*ang 10 java static static-members inner-classes non-static
可能重复:
为什么我们在内部类中没有静态方法?
我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象自动拥有一个对外部类对象的隐藏引用.但为什么非静态内部类不能有静态成员呢?Java设计者只需要禁止在内部类的静态方法内访问非静态外部类字段,它会更有意义,非?
如果在内部类中使用静态成员没有意义,为什么内部类可以通过继承具有静态成员的类来继承静态成员?
我也读了这篇文章.如上所述:
内部类可以继承非编译时常量的静态成员,即使它们可能不会声明它们.不是内部类的嵌套类可以根据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() {
};
}
Run Code Online (Sandbox Code Playgroud)
Kum*_*tra 15
1.一种object
的Non-static inner class
与相关联的instance/object
其的Outer Class
(即封闭类).
2.在的整个身体 Non-static inner class
是不是一个静态的范围之内,因此,你不能有静态成员在那里.
3. Instance variables
并methods
在non-static inner class
是相对于所述封闭类的一个实例,因此被与对象相关的,静态就不会保持他们真实(即内部类),
4. 当我们创建Instance
的非静态的 inner class
,我们需要的Object of Outer enclosing class
.所述内non-static class
具有隐式引用到它outer enclosing class
.
例如:
Outer o = new Outer();
Outer.Inner i = o.new Inner();
Run Code Online (Sandbox Code Playgroud)
从技术上讲,我不知道为什么语言限制内部类使用静态元素的任何原因.可以使用普通类来模拟非静态内部类,该普通类将(以前)封闭的实例作为构造函数的参数.当然,在可见性规则和可见性范围方面存在许多细微差别.
我认为这是一个语言设计决策,主要是因为非静态内部类中的静态访问令人困惑且不直观(Outer.Inner.StaticMember).
归档时间: |
|
查看次数: |
8872 次 |
最近记录: |