类加载和实例化

news/2024/10/20 20:32:39/

类初始化和实例初始化

一个实例对象的创建包括:类初始化和实例初始化1. 一个类要创建实例需要先加载并初始化该类,main方法所在的类需要先加载和初始化2. 一个子类要初始化需要先初始化父类3. 一个类初始化就是执行<clinit>()方法<clinit>方法由静态变量显示赋值代码和静态代码块组成类静态变量显示赋值代码和静态代码块代码从上到下顺序执行<clinit>方法只执行一次4.实例初始化就是执行<init>方法<init>方法由非静态实例变量显示赋值代码和非静态代码块,对应构造器代码组成。非静态实例变量显示赋值代码和非静态代码块从上到下顺序执行,而对应构造器代码最后执行每次创建实例对象,调用对应的构造器,执行的就是对应的<init>方法<init>方法的首行是super()或super(实参列表),即对应父类的<init>方法

类加载过程

类加载过程(类初始化):1、类加载就是执行Java程序编译之后在字节码文件中生成的clinit()方法(称之为类构造器),clinit()方法由静态变量和静态代码块组成。2、子类的加载首先需要先加载父类,如果父类为接口。则不会调用父类的clinit方法。一个类中可以没有clinit方法。3、clinit方法中的执行顺序为:父类静态变量初始化,父类静态代码块,子类静态变量初始化,子类静态代码块。4、clinit()方法只执行一次。对象实例化过程(实例初始化):1、对象实例化过程就是执行Java程序编译之后在字节码文件中生成的init()方法(称之为实例构造器),init()方法由非静态变量、非静态代码块以及对应的构造器组成。2、init()方法可以重载多个,有几个构造器就有几个init()方法,每次创建实例,调用哪一个构造器,就会调用相应的init()方法。3、init()方法中的执行顺序为:父类变量初始化,父类代码块,父类构造器,子类变量初始化,子类代码块,子类构造器。clinit()方法优先于init()方法执行,所以整个顺序就是:父类静态变量初始化,父类静态代码块,子类静态变量初始化,子类静态代码块,父类非静态变量初始化,父类非静态代码块,父类构造器,子类非静态变量初始化,子类非静态代码块,子类构造器。类加载时只会加载静态代码块和静态变量。只有创建对象的实例时: 变量和初始化代码块和构造函数才会执行(创建对象实例会先触发类加载)类加载:执行<clinit>创建对象实例:执行<<init>,但是创建类实例之前会先类加载执行<clinit>。类初始化:执行<clinit>方法,<clinit>方法由静态变量显示赋值代码和静态代码块组成,<clinit>方法只执行一次实例初始化:执行<init>方法,<init>方法由非静态实例变量显示赋值代码和非静态代码块,对应构造器代码组成。触发类加载:1. 为一个类型创建一个新的对象实例时(比如new、反射、序列化)只有这个会触发 变量和初始化代码块和构造函数执行,这个是实例初始化,其他6个都是类初始化2. 调用一个类型的静态方法时(即在字节码中执行invokestatic指令)3. 调用一个类型或接口的静态字段,或者对这些静态字段执行赋值操作时(即在字节码中,执行getstatic或者putstatic指令),不过用final修饰的静态字段已经赋值了(String和基本类型,不包含包装类型)的除外,它被初始化为一个编译时常量表达式4. 调用JavaAPI中的反射方法时(比如调用java.lang.Class中的方法(Class.forName),或者java.lang.reflect包中其他类的方法)5. 初始化一个类的派生类时(Java虚拟机规范明确要求初始化一个类时,它的超类必须提前完成初始化操作,接口例外)6. JVM启动包含main方法的启动类时。7. 对于静态字段,只有直接定义这个字段的类才会被初始化,因此通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。加载顺序: 静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。1. 父类--静态变量2. 父类--静态初始化块3. 子类--静态变量4. 子类--静态初始化块5. 父类--变量6. 父类--初始化块7. 父类--构造器8. 子类--变量9. 子类--初始化块10. 子类--构造器
多态方法重写@Override哪些方法不可以被重写1、final方法2、静态方法3、private等子类中不可见的方法对象的多态性1、子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码2、非静态方法默认的调用对象是this3、this对象在构造器或者说<init>方法中就是正在创建的对象,所以通过子类实例化时触发的父类加载调用的非静态方法,调用对象this是子类对象,调用的方法是子类重写的方法。子类实例化时如果有父类,会触发父类加载 在初始化过程中如果父类方法被子类重写了,会调用子类的方法。通过父类的引用类型变量指向子类类型对象,访问成员变量时是访问的父类的成员变量。

示例代码


Public class TM {public static void main(String[] args) {
//        System.out.println(TM.ccccccc);
//        TM.ss();
//        TM.ccccccc="333";
//        System.out.println(TM.ccccccc);
//        TM.sss();TM t = new TM();System.out.println("new 后 ccccccc = "+t.ccccccc);TM t2 = new TM();System.out.println("new 后 ccccccc = "+t2.ccccccc);}private static void sss() {System.out.println("初始化类块-静态值 ccccccc="+ccccccc);
}public  TM(){System.out.println("构造器");
}static {System.out.println("初始化类块-静态");
}
public static void ss(){System.out.println("初始化类块-静态方法");
}
{System.out.println("初始化类块-非静态");
}
public static String ccccccc= "222";}


http://www.ppmy.cn/news/51744.html

相关文章

算法——分布式——一致性哈希、一致性hash图解动画

分布式算法——一致性哈希、一致性Hash 概述传统Hash算法算法步骤生成Hash环定位服务器定位数据和映射服务器 服务器变更Hash环倾斜虚拟节点总结 概述 一致性哈希算法在1997年由麻省理工学院提出&#xff0c;是一种特殊的哈希算法&#xff0c;目的是解决分布式缓存的问题。在移…

带你打开GCC的大门

START hi&#xff0c;大家好&#xff01; 今天带大家了解一下GCC。 首先说一句&#xff1a;大写的GCC和小写的gcc不是一个东西呦&#xff0c;下面我们慢慢道来... 1. GCC是什么&#xff1f; GNU Compiler Collection (GCC)是GNU项目开发的编译工具集&#xff0c;支持各种编…

DATAFAKER 使用方法记录

DATAFAKER 使用方法记录 win10 64位 Python 3.10.11 参考网址 datafaker的使用–详细教程 https://blog.csdn.net/A15517340610/article/details/105623103 https://github.com/gangly/datafaker python 版本 It is compatible with python2.7 and python3.4 也就是说 他…

Python 读写 CSV 数据

问题 你想读写一个 CSV 格式的文件 解决方案 对于大多数的 CSV 格式的数据读写问题&#xff0c;都可以使用 csv 库。 例如&#xff1a;假设你在一 个名叫 stocks.csv 文件中有一些股票市场数据&#xff0c;像这样&#xff1a; Symbol,Price,Date,Time,Change,Volume "…

为什么企业要做大规模敏捷?

背景 软件工程里一个重要的指标就是“可用的软件”&#xff0c;敏捷宣言里也同样告诉我们“工作的软件高于详尽的文档”&#xff0c;那“可用的软件”、“工作的软件”意味着什么呢&#xff1f;在我的理解里&#xff0c;可以经历用户 “千锤百炼”的软件就是一个“可用的软件”…

黑盒测试过程中【测试方法】详解4-因果图

在黑盒测试过程中&#xff0c;有9种常用的方法&#xff1a;1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类&#xff0c;边界值&#xff0c;判定表_朝一…

《ChatGPT开发应用指南》,Datawhale开源了!

Datawhale发布 开源教程&#xff1a;HuggingLLM&#xff0c;Datawhale团队 随着ChatGPT的爆火&#xff0c;我们相信未来会有越来越多的大模型及类似OpenAI提供的服务出现&#xff0c;AI 正在逐渐平民化&#xff0c;将来每个人都可以利用大模型轻松地做出自己的AI产品。 Huggin…

利用ArcGIS软件赋予tif影像空间参考坐标系

问题&#xff1a; 在处理数据时有一幅没有任何空间参考坐标信息的tif影像&#xff0c;实质上为一个照片。现在需要将其与一个有空间地理参考坐标信息的shp文件叠加在一起。如何解决这个问题呢&#xff1f; 已知信息&#xff1a; shp文件的空间地理参考 shp文件的边界与tif影像的…