Java类初始化过程/类加载器Q;A
2021-11-27 10:16:03 26 举报
AI智能生成
Java类初始化过程/类加载器 Q&A
作者其他创作
大纲/内容
类加载顺序
Q: 什么时候会进行静态变量的赋值和静态代码块的执行?(即类初始化)
A:
A:
- 第一次创建某个类或者某个类的子类的实例(new)
- 访问类的静态变量、调用类的静态方法
- 使用反射方法forName
- 调用主类的main方法
Q:初始化某个子类时,也会对父类做静态初始化吗?顺序呢?
A:如果父类之前没有被静态初始化过,那就会进行, 且顺序是先父类再子类。 后面的非静态成员初始化也是如此。即:
静态现行,先父后子,同级看定义,顺序构造函数最后
A:如果父类之前没有被静态初始化过,那就会进行, 且顺序是先父类再子类。 后面的非静态成员初始化也是如此。即:
静态现行,先父后子,同级看定义,顺序构造函数最后
Q: 为什么父类的静态method不会被子类的method重写?
A: 静态方法是类方法,不会被子类重写。毕竟类方法调用时,是必定带上类名的。
A: 静态方法是类方法,不会被子类重写。毕竟类方法调用时,是必定带上类名的。
Q: 没有在子类的构造器中调用super()时,也会进行父类对象的实例化吗?
A: 会的。会自动调用父类的默认构造器。 super()主要是用于需要调用父类的特殊构造器的情况。
A: 会的。会自动调用父类的默认构造器。 super()主要是用于需要调用父类的特殊构造器的情况。
类加载过程
Q:类加载的3个必经阶段是:
A:
加载(类加载器读取二进制字节流,生成java类对象)
链接(验证,分配静态域初始零值)
初始化(前面的题目讲的其实就是初始化时的顺序)
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数组时,不会引发类初始化。什么都不输出。
像下面输出什么
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就会引发了。
(如果是基本类型常量,不会引发。 如果是引用类型产量,则会引发类初始化)
像下面输出什么?
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:子类不会初始化, 但是父类会初始化。
A:子类不会初始化, 但是父类会初始化。
0 条评论
下一页