首先要明白以下三点:
- static类型的属性和方法,在类加载的时候就会存在于内存中。
- 要想使用某个类的static属性和方法,那么这个类必须要加载到虚拟机- 中。
- 非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载。
现在考虑这个情况:在外部类并没有实例化,内部类还没有加载,这时候如果调用内部类的静态成员或方法,内部类还没有加载,却试图在内存中创建该内部类的静态成员,这明显是矛盾的。所以非静态内部类不能有静态成员变量或静态方法。
内部类也会生成class文件
非静态内部类例子:
非静态内部类是依赖于外部的实例化对象的,
在方法中创建非静态内部类的问题
public class TestNormalInnerCalss {
public int method() {
//这个是实例方法,调用实例方法必有一个外部类的对象,所以可以直接new Element(99, 10)。
Element e = new Element(10, 99);
return e.ch;
}
public static void main(String[] args) {
//非静态内部类对象依赖于外部类对象,这里是static方法,没有创建外部类对象,所以不能直接new Element(99, 10)
Element e = new TestNormalInnerCalss().new Element(99, 10);
}
class Element{
int ch;
int count;
public Element(int ch, int count) {
this.ch = ch;
this.count = count;
}
}
}