① java static 初始化顺序语法并不正确
执行到Test1.a
调用了Test1所以开始对Test1中静态部分初始化
初始化a static int a=(new Test1()).aa();
因为new了Test1对象 所以线程执行实例化类Test1,实例代码块执行
之后调用int aa() , aa()执行
到这里 a的初始化完毕
又开始执行 静态代码块"
最后输出结果
你调用一个类 静态方法块或属性没有初始化的话 就进行初始化
实例化一个类 就调用构造方法实例化 并没有什么语法相悖啊
若static int a=(new Test1()).aa();改为static int a=10;则该程序实例初始化根本就不会执行
你有没有实例化对象 又怎么会执行"实例初始化"
② java 静态变量初始化为什么要用静态初始化
在java中用final修饰符修饰的变量表示不可以被二次赋值,且系统不会给其赋默认值。 如果单纯只是final变量,可以在定义的时候就赋默认值,也可以在构造方法中赋默认值。 但是如果同时用final static 修饰变量,因为static变量属于类而不属于对象,且在调用构造方法之前static 变量就已经被系统给赋默认值。而相应的final static 变量就只能在定义的时候就初始化,否则既无法在构造方法中初始化,系统又不会赋默认值,相当于这个变量被定义出来是毫无用处的。 因此java中final static变量必须初始化
③ 关于JAVA中static初始化问题
java虚拟机在首次主动使用类型的时候才会初始化(lazy-load的形式),主动使用包括以下6种情况
1. 创建类的实例
2. 调用类的静态方法
3. 操作类的非常量静态字段(非final static)
4. 调用特定的反射方法
5. 初始化一个类的子类
6. 指定一个类为虚拟机启动时的初始化类
所以说,你必须主动使用到这个类,这个类才会被初始化,这就能解释第一次有输出,而第二次没有输出的情况了
另外,值得一提的是,加载和初始化不是一个概念,比如,在main函数中写
Table a = null;
一样不会有输出。。Table类被加载了但是没有被初始化,因为这不属于上述6种“主动使用”情况之一,不信试试。。。
④ java中对象的初始化位置是构造器,那static修饰的对象在哪初始化
一个对象的初始化过程。建议网络一下具体信息。
static修饰的变量是静态变量,在其类被加载的时候进行初始化动作。
上图就是类进行加载初始化时机。类只加载一次直到被卸载。
你上面的代码,如果把main方法放到另一个class中,你会发现只打印hello。因为App这个类没有被用到,是不会进行加载的。
类加载的准备阶段会为类中的所有静态变量按顺序分配内存空间,并为其设置一个初始值。基本类型为0,引用类型是null。
类加载的初始化阶段会为类中的所有静态变量按顺序(从上到下,这个顺序还是比较重要的,顺序不一样结果可能就不一样了)进行赋值操作。
⑤ 高级Java开发中什么是静态初始化器
静态初始化器是由关键字static引导的一对大括号括起的语句组。它的作用与类的构造函数有些相似,都用来完成初始化的工作,但是静态初始化器与构造函数有三点根本的不同:
(1)构造函数是对每个新创建的对象初始化,而静态初始化器是对每个类进行初始化;
(2)构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用运行的;
(3)不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。
⑥ java 中静态内部类字段什么时候初始化是在外部类加载的时候就初始化吗
首先分析下名字:静态内部类
静态是static。静态的方法或者参数是随着类的加载而产生的(感觉应该是JVM启动时static属性就加载了。)。这就是为什么不用实例化类,就可以调用它的原因。
内部类:用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。其他类不会调用。所以没必要另写一个类。外部类可以调用内部类。而内部类不能调用外部类的方法。
所以我觉得
静态内部类中的属性,方法,是在外部类加载的时候初始化的。
希望对您有帮助。如果有问题请自行
谷歌
度娘.