zoukankan      html  css  js  c++  java
  • 静态代码块,静态方法,构造方法的执行顺序,字符串池

    一、Java初始化顺序
    类变量(静态变量)、实例变量(非静态变量)、静态代码块、非静态代码块 的初始化时机由 static 关键字修饰的(如:类变量[静态变量]、静态代码块)将在类被初始化创建实例对象之前被初始化,而且是按顺序从上到下依次被执行;

    没有 static 关键字修饰的(如:实例变量[非静态变量]、
    非静态代码块)初始化实际上是会被提取到类的构造器中被执行的,但是会比类构造器中的代码块优先执行到,其也是按顺序从上到下依次被执行。

    在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)
    在装载类时,先装载父类A,再装载子类B
    装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,按照代码中出现的顺序初始化)
    装载子类B后,完成静态动作

    类装载完成,开始进行实例化

    1. 在实例化子类B时,先要实例化父类A2,实例化父类A时,先成员实例化(非静态代码)
    2. 父类A的构造方法
    3. 子类B的成员实例化(非静态代码)
    4. 子类B的构造方法

    先初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数

    parent static 1(父类static成员变量)

    parent static 2(父类static代码块)

    child static 1(子类static成员变量)

    child static 2(子类static代码块)

    parent common 3(父类普通成员变量)

    parent common 4(父类普通代码块)

    construct parent 5(父类构造函数)

    child common 3(子类普通成员变量)

    child common 4(子类普通代码块)

    construct child 5(子类构造函数)

    func child(子类实例调用的方法)

    二、字符串池(重点)

    (1)直接赋值:String s="123456";先查找字符串池中是否有该字符串,若没有则创建一个对象,并返回。若有此字符串直接返回。【创建1个对象】

    (2)new创建:String s=new Stirng("123456");先查找字符串池中是否有该字符串,若有直接在堆中new一个对象并返回,没有就在字符串中先创建一个,然后再在堆中new一个返回。【创建2个对象】

    (3)+连接两个字符串:String s="123"+"456";分别判断字符串“123”和"456"在字符串池中是否存在,若不存在就创建一个。然后判断连接后的字符"123456"在字符串池中是否存在,若不存在就创建。【3个对象】

    (4)+连接对象和对象或连接对象和字符串:String s1="123";String s2=s1+"456"; String s3="456";String s4=s1+s3;具体情况有待证实,应该是先创建"123"对象(包括判断),然后创建“456”对象,…………

    (5)new字符串对象或+连接:String s1="123456";String s2=new(s1); String s3="123";String s4=new String(s3+"456"); 

    (6)intern()方法:若字符串池中有字符串直接返回,否则创建一个对象。

     String s="123456";                  
        String s1="123456";
        String s2=new String("123456");
        String s3="123"+"456";
        String s4="123";
        String s5=s4+"456";
        String s6="456";
        String s7=s4+s6;
        String s8=new String(s1);
        String s9=new String(s4+"456");
        System.out.println(s1==s);   //true
        System.out.println(s1==s2);  //false
        System.out.println(s1==s3);  //true
        System.out.println(s1==s5);  //false
        System.out.println(s1==s7);  //false
        System.out.println(s1==s8);  //false
        System.out.println(s1==s9);  //false
        System.out.println(s==s2.intern()); //true
        System.out.println(s2==s2.intern());//false
        System.out.println(s2.intern()==s5.intern());//true


    ————————————————
    版权声明:本文为CSDN博主「陈平寨黄山赵子龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_25615395/article/details/78294985

    https://www.cnblogs.com/lbrs/p/9017360.html

    https://www.cnblogs.com/Andya/p/14067618.html

    https://segmentfault.com/a/1190000023872310

  • 相关阅读:
    Cypress安装使用(E2E测试框架)
    AirtestIDE详解(跨平台的UI自动化编辑器)
    Linux之自动化部署
    工作笔记 之 Python应用技术
    工作笔记 之 Linux服务搭建
    工作笔记 之 互联网实用技术
    Git全面应用
    Python-Thread(通俗易懂)
    php笔记(二)PHP类和对象之Static静态关键字
    php笔记(一)面向对象编程
  • 原文地址:https://www.cnblogs.com/yuluoxingkong/p/15063180.html
Copyright © 2011-2022 走看看