• Java类的初始化过程


    初始化过程:

    1. 初始化父类中的静态成员变量和静态代码块 ;

    2. 初始化子类中的静态成员变量和静态代码块 ;

    3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;

    4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;

    案例:

    1. public class Z extends X{
    2. Y y = new Y();
    3. Z () {
    4. System.out.println("Z");
    5. }
    6. public static void main(String[] args) {
    7. new Z();
    8. }
    9. }
    1. public class X {
    2. Y y = new Y();
    3. X(){
    4. System.out.println("X");
    5. }
    6. }
    1. public class Y {
    2. Y(){
    3. System.out.println("Y");
    4. }
    5. }

    程序运行时,控制台输出信息:

    Y
    X
    Y
    Z

    类初始化过程

    1. 一个类要创建实例需要先加载并初始化该类
      1. main方法所在的类需要先加载和初始化
    2. 一个子类要初始化需要先初始化父类
    3. 一个类初始化就是执行()方法
      1. ()方法由静态类变量显示赋值代码和静态代码块组成
      2. 类变量显示赋值代码和静态代码块代码从上到下顺序执行
      3. ()方法只执行一次

    实例初始化过程

    实例初始化就是执行()方法

    • ()方法可能重载有多个,有几个构造器就有几个()方法
    • ()方法由非静态实例变量显示赋值代码和非静态代码块代、对应构造器代码组成
    • 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应构造器的代码最后执行
    • 每次创建实例对象,调用对应构造器,执行的就是对应的()方法
    • ()方法的首行是super()或者super(实参列表),即对应父类的()方法

    方法的重写Override

    哪些方法不可以被重写?

    • final方法、静态方法、private等子类中的不可见方法

    对象的多态性

    • 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
    • 非静态方法默认的调用对象是this
    • this对象在构造器或者说方法中就是正在创建的对象

    方法的参数传递机制

    形参是基本数据类型:传递数据值

    实参是引用数据类型:传递地址值;特殊的类型:String、包装类等对象不可变性

    1. public static void main(String[] args) {
    2. int i = 1;
    3. String str = "hello";
    4. Integer num = 200;
    5. int[] arr = {1, 2, 3, 4, 5};
    6. MyData my = new MyData();
    7. change(i, str, num, arr, my);
    8. System.out.println("i = " + i);
    9. System.out.println("str = " + str);
    10. System.out.println("num = " + num);
    11. System.out.println("arr = " + Arrays.toString(arr));
    12. System.out.println("my.a = " + my.a);
    13. }
    14. private static void change(int j, String s, Integer n, int[] a, MyData m) {
    15. j += 1;
    16. s += "world";
    17. n += 1;
    18. a[0] += 1;
    19. m.a += 1;
    20. }
    21. static class MyData {
    22. int a = 10;
    23. }
    24. /*输出结果
    25. * i = 1
    26. str = hello
    27. num = 200
    28. arr = [2, 2, 3, 4, 5]
    29. my.a = 11
    30. * */

     成员变量与局部变量的区别

    当局部变量与xx变量重名时,如何区分:

    局部变量与实例变量重名:

    在实例变量前面加'this.'

    局部变量与类变量重名:

    在类变量前面加'类名.' 

     

  • 相关阅读:
    前后端分离的项目——图书管理系统(下)
    【控制】模型预测控制,公式推导,数值仿真,有程序有图
    探秘亚马逊云科技海外服务器 | 解析跨境云计算的前沿技术与应用
    深度解析RocketMq源码-持久化组件(四) CommitLog
    ENVI IDL:MODIS SWATH产品的点位-像元提取(另附Python代码)
    vue学习笔记
    微服务项目:尚融宝(24)(后端搭建:JWT令牌测试)
    TaskManager的启动流程
    CAS客户端对接
    HANA SQL 的Union和Union All
  • 原文地址:https://blog.csdn.net/inexaustible/article/details/126709829