java 中静态内部类字段啥时候初始化?是在外部类加载的时候就初始化吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中静态内部类字段啥时候初始化?是在外部类加载的时候就初始化吗?相关的知识,希望对你有一定的参考价值。

不是的,只有在加载内部类的时候才初始化 //有问题可以继续交流
楼主只要看懂一下的代码
那么对于类的加载
基本上就没问题了
最后类的加载过程的解释
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()
内部类的加载过程也一样
*/
参考技术A 不一定,我觉得内部类有点像一个函数,如果外部类在加载的时候没有调用到某个函数时,它就不会执行相应的操作,内部类同样如此,外部类如果没有调用内部类的话,内部类里面的字段也不会执行相应的初始化。 参考技术B 在程序启动,也就是类加载的时候初始化。属于优先级最高的。
初始化顺序:
静态变量、静态方法、类、类变量、类方法。
参考技术C java的初始化顺序是按照 先父(类)后子(类),先静态后非静态的原则
详细的说起来就是
1.父类的静态变量和静态块 2.子类的静态变量和静态块 3.父类的非静态变量和块 4.父类构造器
5.子类的非静态变量和块 6.子类构造器
对于内部类,我觉得也可以看成该类的一个属性,至于他的执行顺序 也是遵照以上的原则的
参考技术D 首先分析下名字:静态内部类
静态是static。静态的方法或者参数是随着类的加载而产生的(感觉应该是JVM启动时static属性就加载了。)。这就是为什么不用实例化类,就可以调用它的原因。
内部类:用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。其他类不会调用。所以没必要另写一个类。外部类可以调用内部类。而内部类不能调用外部类的方法。
所以我觉得 静态内部类中的属性,方法,是在外部类加载的时候初始化的。
希望对您有帮助。如果有问题请自行 谷歌 度娘.

以上是关于java 中静态内部类字段啥时候初始化?是在外部类加载的时候就初始化吗?的主要内容,如果未能解决你的问题,请参考以下文章

java 内部类

Java基础语法09-面向对象下-内部类

内部类和匿名内部类的用法

内部类

Java入土---常用类

浅谈Java中的内部类