非静态内部类不能有静态成员
2014-10-18 20:14
423 查看
1 非静态内部类为什么不能有静态成员,
如下代码 Java代码
public class OuterClass{
class InnerClass{
private static int i;
}
}
对于java类加载顺序我们知道,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量i初始化,
那么必须先执行加载OuterClass,再加载Innerclass,最后初始化静态变量i,问题就出在加载Innerclass上面,我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
2 静态内部类可以有静态成员:
我们可以把静态内部类作为外部类OuterClass的一个静态成员,在执行类加载过程中,静态内部类在加载OuterClass后会进行初始化,同样的原理,静态内部类的静态成员也将被初始化,进行内存的分配,注意到,这时无论是内部类还是外部类,对象都没有实例化,这也说明了非静态内部类为什么不能有静态成员的原因。 Java代码
public class OuterClass{
static class InnerClass{
private static int i;
}
}
如下代码 Java代码
public class OuterClass{
class InnerClass{
private static int i;
}
}
对于java类加载顺序我们知道,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量i初始化,
那么必须先执行加载OuterClass,再加载Innerclass,最后初始化静态变量i,问题就出在加载Innerclass上面,我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
2 静态内部类可以有静态成员:
我们可以把静态内部类作为外部类OuterClass的一个静态成员,在执行类加载过程中,静态内部类在加载OuterClass后会进行初始化,同样的原理,静态内部类的静态成员也将被初始化,进行内存的分配,注意到,这时无论是内部类还是外部类,对象都没有实例化,这也说明了非静态内部类为什么不能有静态成员的原因。 Java代码
public class OuterClass{
static class InnerClass{
private static int i;
}
}
相关文章推荐
- 为何非静态内部类不能有静态成员
- Java非静态内部类为什么不能有静态成员
- java非静态内部类为何不能有静态的成员?
- 非静态内部类不能有静态成员?
- Java非静态内部类为什么不能有静态成员
- java非静态内部类为何不能有静态的成员?
- c++静态成员函数为什么不能为虚函数?
- 为什么静态成员不能访问非静态成员
- 为什么内联函数,构造函数,静态成员函数不能为virtual函数
- 为什么静态成员不能访问非静态成员
- 类中有引用需要注意——非静态的引用成员错误提示,不能使用默认的赋值运算符
- 为什么静态成员、静态方法中不能用this和super关键字
- 为什么静态成员不能访问非静态成员
- C++之静态成员函数为什么不能为虚函数
- C++里的静态成员函数(不能用const的原因+static在c++中的第五种含义)(转)
- 为什么静态方法不能直接访问非静态成员?
- 为什么静态成员、静态方法中不能用this和super关键字
- 为什么内联函数,构造函数,静态成员函数不能为virtual函数
- 为什么静态成员、静态方法中不能用this和super关键字