Java类初始化过程/类加载器Q;A
2021-11-27 10:16:03 26 举报
AI智能生成
Java类初始化过程/类加载器 Q&A
作者其他创作
大纲/内容
类加载顺序
<font color="#f57f17">Q: 什么时候会进行静态变量的赋值和静态代码块的执行?(即类初始化)</font><br>A:<br><ul><li>第一次创建某个类或者某个类的子类的实例(new)</li><li><font color="#ff0000">访问类的静态变量、调用类的静态方法</font></li><li>使用反射方法<font color="#ff0000">forName</font></li><li>调用主类的main方法</li></ul>注: 类初始化只会进行一次, 上面任何一种情况触发后,之后都不会再引起类初始化操作。
<font color="#f57f17">Q:初始化某个子类时,也会对父类做静态初始化吗?顺序呢?</font><br>A:如果父类之前没有被静态初始化过,那就会进行, 且顺序是先父类再子类。 后面的非静态成员初始化也是如此。即:<br> <font color="#ff0000">静态现行,先父后子,同级看定义,顺序构造函数最后</font>
<font color="#f57f17">Q: 为什么父类的静态method不会被子类的method重写?</font><br>A: 静态方法是类方法,不会被子类重写。毕竟类方法调用时,是必定带上类名的。
<font color="#f57f17">Q: 没有在子类的构造器中调用super()时,也会进行父类对象的实例化吗?</font><br>A: 会的。<font color="#ff0000">会自动调用父类的默认构造器</font>。 super()主要是用于需要调用父类的特殊构造器的情况。<br>
类加载过程
Q:类加载的3个必经阶段是:<br>A:<br>加载(类加载器读取二进制字节流,生成java类对象)<br>链接(验证,分配静态域初始零值)<br>初始化(前面的题目讲的其实就是初始化时的顺序)
被动引用中和类静态初始化的关系
<font color="#f57f17">Q:new某个类的数组时,会引发类初始化吗?<br>像下面输出什么</font><br><font color="#0000ff">public class Test {<br> static class A{<br> public static int a = 1;<br> static{<br> System.out.println("initA");<br> }<br> }<br> <br> public static void main(String[] args) {<br> A[] as = new A[5];<br> }<br>}</font><br>A:<font color="#ff0000">new数组时,不会引发类初始化</font>。什么都不输出。
<font color="#f57f17">Q:引用类的final静态字段,会引发类初始化吗?<br>像下面输出什么?</font><br><font color="#0000ff">public class Test {<br> static class A{<br> public static final int a = 1;<br> static{<br> System.out.println("initA");<br> }<br> }<br> <br> public static void main(String[] args) {<br> System.out.println("A.a=" + A.a);<br> }<br>}<br></font>A: 不会引发。不会输出initA。 去掉final就会引发了。<br>(<font color="#ff0000">如果是基本类型常量,不会引发。 如果是引用类型产量,则会引发类初始化</font>)
<font color="#f57f17">Q:子类引用了父类的静态成员,此时子类会做类初始化嘛?</font><br>A:子类不会初始化, 但是父类会初始化。
0 条评论
下一页