美文网首页
类的加载初始化(助记符)

类的加载初始化(助记符)

作者: 龙剑灵 | 来源:发表于2019-12-03 22:50 被阅读0次

    对于静态字段来说,只有直接定义了该字段的类才会被初始化;
    当某个类在初始化时,要求其父类全部都已经初始化完毕了
    -XX:+TraceClassLoading,用于追踪类的加载信息并打印出来
    -XX:+<option>, 表示开启option选项
    -XX:-<option>, 表示关闭option选项
    -XX:<option>=<value>, 表示将option选项的值设置为value

    public class MyTest1 {
        public static void main(String[] args) {
            //System.out.println(MyChild1.str);
            System.out.println(MyChild1.str2);
        }
    }
    
    class MyParent1{
        public static String str = "hello world";
    
        static {
            System.out.println("MyParent1 static block");
        }
    }
    
    class MyChild1 extends MyParent1{
        public static String str2 = "welcome";
    
        static {
            System.out.println("Child1 static block");
        }
    }
    

    在编译阶段,常量会被存入调用这个常量的那个方法所在的类的常量池中.
    本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量类的初始化
    注意:这里指的是将常量存放到了MyTest2的常量池中, 之后MyTest2与MyParent2就没有任何关系了
    甚至可以将MyParent2的class文件删除.
    如上: 常量str会存入到上面类MyTest2中常量池中

    助记符:
    ldc表示将int, float或是String类型的常量值从常量池中推送至栈顶
    bipush表示将单字节(-128 - 127)的常量值推送至栈顶
    sipush表示将一个短整形常量值(-32768 - 32767)推送至栈顶
    iconst_1表示将int类型数字1推送至栈顶(iconst_m1 - iconst_5) -1到5

    public class MyTest2 {
    
        public static void main(String[] args) {
            System.out.println(MyParent2.d);
            System.out.println(MyParent2.ss);
            System.out.println(MyParent2.sa);
        }
    }
    查看反编译
    E:\gitSpace\jdk8\out\production\classes>javap -c jvm.classloader.MyTest2
    
    class MyParent2{
        public static String str = "hello world";
        public static final int s = -1;
        public static final int ss = 128;
        public static final int sa = 127;
    
        public static final int d = 6;
    
        static {
            System.out.println("MyParent2 static block");
        }
    }
    

    对于数组实例来说,其类型是由JVM运行期动态生成的,表示为class [Ljvm.classloader.MyParent4
    这种形式,动态生成的类型,其父类就是Object

    对于数组来说,JavaDoc经常将构成数组的元素为Component,实际上就是将数组降低一个维度后来的类型.

    助记符:
    anewarray: 表示创建一个引用类型的(如类,接口,数组)数组,并将其引用压入栈顶
    newarray: 表示创建一个指定的原始类型(如int, float, char等)的数组,并将其引用值压入栈顶

    public class MyTest4 {
    
        public static void main(String[] args) {
            //MyParent4 myParent4 = new MyParent4();
            MyParent4[] arr = new MyParent4[1];
            System.out.println(arr.getClass()); //class [Ljvm.classloader.MyParent4
    
            MyParent4[][] arr2 = new MyParent4[1][1];
            System.out.println(arr2.getClass()); //class [[Ljvm.classloader.MyParent4;
    
            System.out.println(arr.getClass().getSuperclass()); //class java.lang.Object
            System.out.println(arr2.getClass().getSuperclass()); //class java.lang.Object
    
            System.out.println("===================");
    
            int[] ints = new int[1];
            System.out.println(ints.getClass()); //class [I
            System.out.println(ints.getClass().getSuperclass()); //class java.lang.Object
    
            char[] chars = new char[1];
            System.out.println(chars.getClass()); //class [C
    
            boolean[] booleans = new boolean[1];
            System.out.println(booleans.getClass()); //class [Z
    
            byte[] bytes = new byte[1];
            System.out.println(bytes.getClass()); //class [B
        }
    }
    
    class MyParent4 {
        static {
            System.out.println("MyParent4 static block");
        }
    }
    

    相关文章

      网友评论

          本文标题:类的加载初始化(助记符)

          本文链接:https://www.haomeiwen.com/subject/inohgctx.html