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