zoukankan      html  css  js  c++  java
  • java类加载及new对象的过程

    /* 
    SubClass sub = new SubClass(); 
    这句话到底做了什么事情呢? 
    1.javac编译.java源文件形成.class字节码文件; 
    2.new SubClass()对象时,先检查有没有父类,有父类,类加载器(ClassLoader)先将父类的Class文件读入内存,创建一个java.lang.Class对象,然后加载子类,类加载器将子类的Class文件读入内存,创建一个java.lang.Class对象; 
    3.先初始化父类的静态属性,再初始化父类的静态代码块; 
    4.再初始化子类的静态属性,再初始化子类的静态代码; 
    5.在堆内存中分配内存空间,分配内存地址,此时是因为父类的特有属性才在堆内存中为父类对象分配空间。 
    6.初始化父类的特有属性。 
    7.初始化父类的构造代码块。 
    8.初始化父类对象相应的构造方法。 
    9.在堆内存中分配内存空间,分配内存地址,此时是因为子类的特有属性才在堆内存中为子类对象分配空间的。 
    10.初始化子类的特有属性。 
    11.初始化子类的构造代码块。 
    12.初始化子类相应的构造方法。 
    13.将子类的内存地址赋值给栈中的引用对象。 
    */ 
    package com.zhangyike.staticExcise;

    // 静态变量
    
        public static String staticField = "父类--静态变量";
    
        public String field = "父类--普通变量";
    
        // 静态块
        static {
            System.out.println(staticField);
            System.out.println("父类--静态块");
        }
    
        // 初始化块
        {
            System.out.println(field);
            System.out.println("父类--普通块");
        }
    
        // 构造器
        public ParentClass() {
            System.out.println("父类--构造器");
        }
    }
    
    public class SubClass extends ParentClass {
    
        // 静态变量
        public static String sstaticField = "子类--静态变量";
        // 变量
        public String sField = "子类--变量";
    
        // 静态块
        static {
            System.out.println(sstaticField);
            System.out.println("子类--静态块");
        }
    
        // 初始化块
        {
            System.out.println(sField);
            System.out.println("子类--普通块");
        }
    
        // 构造器
        public SubClass() {
            System.out.println("子类--构造器");
        }
    
        public static void main(String[] args) {
    
            System.out.println("顺序:" + "第一次new SubClass");
            SubClass sub = new SubClass();
            System.out.println("顺序:" + "第二次new SubClass");
            new SubClass();
        }
    }
    

    程序执行的结果为: 
    父类–静态变量 
    父类–静态块 
    子类–静态变量 
    子类–静态块 
    顺序:第一次new SubClass 
    父类–普通变量 
    父类–普通块 
    父类–构造器 
    子类–变量 
    子类–普通块 
    子类–构造器 
    顺序:第二次new SubClass 
    父类–普通变量 
    父类–普通块 
    父类–构造器 
    子类–变量 
    子类–普通块 
    子类–构造器

  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/shew/p/11444301.html
Copyright © 2011-2022 走看看