zoukankan      html  css  js  c++  java
  • Java 类加载、调用构造器、执行方法的过程

    注:整理到这部分知识点时候发现有很多问题还没搞清楚,所以这里可能会存在很多不够详细甚至错误的理解,准备翻一遍编程思想再来更新,

    欢迎评论交流

    当JVM执行到这么一句代码:  new Person().setName("superzhao")

    它会做这么几件事

    类加载

    JVM会用类加载器加载xxx.Person这个class文件

    加载(class){

      if(class有父类){

        加载(superclass);

      }

      1.静态域申明,默认初始化为0,false,null

      2.按照申明顺序(从上而下书写顺序)执行静态域(赋值)和静态代码块(执行代码块体),

        二者等价,因此不可在静态代码块中使用位于代码块之后申明的静态域,但是可以初始化

      3.按照申明顺序加载静态方法

    }

    构造器被调用(对象初始化)

    1.所有实例域初始化为默认值0,false,null

    2.按照申明顺序执行域初始化及块初始化

    3.如果构造器"第一行"调用了其他构造器,则执行

    4.执行构造器体

    调用方法

    1.编译器查看对象的申明类型,找到它所有与方法名相同的方法

    2.根据参数类型,找到相应"最合适"的父类方法可能会出现类型转换(向上转型)

    3.如果是private,static,final,构造器 方法,那么已经确定就是该方法(这四种类型的方法没有多态特征),

      因为没有多态所以也叫静态绑定

    4.如果是其他方式,采用动态绑定:JVM去寻找改类的实际类型中对应的最合适方法

    5.执行调用

  • 相关阅读:
    Java 数组的浅拷贝和深拷贝
    Java 传递可变参数和方法重载
    Java 数组排序
    Java 一维数组作为参数和返回值
    Java 运算符及优先级
    MySQL 由 5.7 升级为 8.0 之后,Laravel 的配置改动
    Lavarel
    Laravel框架中Blade模板的用法
    php-fpm 配置文件检测
    Laravel Blade 模板 @section/endsection 与 @section/show, @yield 的区别
  • 原文地址:https://www.cnblogs.com/superzhao/p/4597883.html
Copyright © 2011-2022 走看看