不是的,只有在加载内部类的时候才初始化 //有问题可以继续交流
楼主只要看懂一下的代码
那么对于类的加载
基本上就没问题了
最后类的加载过程的解释
public class Test6 {
public static void main(String[] args){
new B();
new A.C();
}
}
class A{
private P p1 = new P("A--p1");
static P p3 = new P("A--p3");
public A(){
System.out.println("A()");
}
private P p2 =new P("A--p2");
static{
new P("A--static");
}
{new P("A{...}");}
public static class C {
private P p1 = new P("C--p1");
static P p3 = new P("C--p3");
public C(){
System.out.println("C()");
}
private P p2 =new P("C--p2");
static{
new P("C--static");
}
{new P("C{...}");}
}
}
class B extends A {
private P p1 = new P("B --p1");
static P p3 = new P("B -- p3");
public B() {
System.out.println("B()");
}
public P p2 = new P("B -- p2");
static {
new P("B -- static");
}
{new P("B{...}");}
}
class P {
public P(String s) {
System.out.println(s);
}
}
/*
有父类的情况
1. 加载父类
1.1 为静态属性分配存储空间并赋初始值
1.2 执行静态初始化块和静态初始化语句(从上至下)
2. 加载子类
2.1 为静态属性分配存储空间
2.2 执行静态初始化块和静态初始化语句(从上至下)
3. 加载父类构造器
3.1 为实例属性分配存数空间并赋初始值
3.2 执行实例初始化块和实例初始化语句
3.3 执行构造器内容
4. 加载子类构造器
4.1 为实例属性分配存数空间并赋初始值
4.2 执行实例初始化块和实例初始化语句
4.3 执行构造器内容
5 回到main()
内部类的加载过程也一样
*/
不一定,我觉得内部类有点像一个函数,如果外部类在加载的时候没有调用到某个函数时,它就不会执行相应的操作,内部类同样如此,外部类如果没有调用内部类的话,内部类里面的字段也不会执行相应的初始化。
在程序启动,也就是类加载的时候初始化。属于优先级最高的。
初始化顺序:
静态变量、静态方法、类、类变量、类方法。
java的初始化顺序是按照 先父(类)后子(类),先静态后非静态的原则
详细的说起来就是
1.父类的静态变量和静态块 2.子类的静态变量和静态块 3.父类的非静态变量和块 4.父类构造器
5.子类的非静态变量和块 6.子类构造器
对于内部类,我觉得也可以看成该类的一个属性,至于他的执行顺序 也是遵照以上的原则的
首先分析下名字:静态内部类
静态是static。静态的方法或者参数是随着类的加载而产生的(感觉应该是JVM启动时static属性就加载了。)。这就是为什么不用实例化类,就可以调用它的原因。
内部类:用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。其他类不会调用。所以没必要另写一个类。外部类可以调用内部类。而内部类不能调用外部类的方法。
所以我觉得 静态内部类中的属性,方法,是在外部类加载的时候初始化的。
希望对您有帮助。如果有问题请自行 谷歌 度娘.