• java中类加载的顺序及其初始化过程


    一、什么时候会加载类?
    使用到类中的内容时加载:有三种情况
    1.创建对象:new StaticCode();
    2.使用类中的静态成员:StaticCode.num=9;  StaticCode.show();
    3.在命令行中运行:java StaticCodeDemo

    二、类所有内容加载顺序和内存中的存放位置:
    利用语句进行分析。
    1.Person p=new Person("zhangsan",20);
    该句话所做的事情:
    1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
    2.加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
    加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
    记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
    静态成员变量(类变量)  ----->方法区的静态部分
    静态方法              ----->方法区的静态部分
    非静态方法(包括构造函数)  ----->方法区的非静态部分
    静态代码块 ----->方法区的静态部分
    构造代码块 ----->方法区的静态部分

    注意:在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象
    ,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
    所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。


    3.执行类中的静态代码块:如果有的话,对Person.class类进行初始化。
    4.开辟空间:在堆内存中开辟空间,分配内存地址。
    5.默认初始化:在堆内存中建立 对象的特有属性,并进行默认初始化。
    6.显示初始化:对属性进行显示初始化。
    7.构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。
    8.构造函数初始化:对对象进行对应的构造函数初始化。
    9.将内存地址赋值给栈内存中的变量p。
    2.p.setName("lisi");
    1.在栈内存中开辟setName方法的空间,里面有:对象的引用this,临时变量name
    2.将p的值赋值给this,this就指向了堆中调用该方法的对象。
    3.将"lisi" 赋值给临时变量name。
    4.将临时变量的值赋值给this的name。
    3.Person.showCountry();
    1.在栈内存中,开辟showCountry()方法的空间,里面有:类名的引用Person。
    2.Person指向方法区中Person类的静态方法区的地址。
    3.调用静态方法区中的country,并输出。
      注意:要想使用类中的成员,必须调用。通过什么调用?有:类名、this、super
      
    三、静态代码块、构造代码块和构造函数的区别
    静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
    构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
    构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。
     创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数
     
    //利用代码进行测试 例题:06--06:StaticCodeDemo.java

     1 package home.yhs.javase.codeRunningSequence;
     2 
     3 class Person {
     4     private String name;
     5     private int age = 0;
     6     private static String country = "cn";
     7 
     8     Person(String name, int age) {
     9         this.name = name;
    10         this.age = age;
    11     }
    12 
    13     static {
    14         System.out.println("静态代码块被执行");
    15     }
    16 
    17     {
    18         System.out.println(name + "..." + age);
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24 
    25     public void speak() {
    26         System.out.println(this.name + "..." + this.age);
    27     }
    28 
    29     public static void showCountry() {
    30         System.out.println("country=" + country);
    31     }
    32 }
    33 
    34 public class StaticDemo {
    35     static {
    36         System.out.println("StaticDemo 静态代码块1");
    37     }
    38 
    39     public static void main(String[] args) {
    40         Person p = new Person("zhangsan", 100);
    41         p.setName("lisi");
    42         p.speak();
    43         Person.showCountry();
    44     }
    45 
    46     static {
    47         System.out.println("StaticDemo 静态代码块2");
    48     }
    49 }
  • 相关阅读:
    2021 0309-1 准备工作
    课程总结
    第十四周课程总结&实验报告
    第十三周课程总结
    第十二周课程总结
    第十一周课程总结
    第十周课程总结
    2019春总结作业
    第十二周作业
    第十一周作业
  • 原文地址:https://www.cnblogs.com/studyCenter/p/6406376.html
Copyright © 2020-2023  润新知