牛客30道Java专项练习-错题-01

news/2024/10/25 16:30:03/

一、Java初始化过程:

  • 初始化父类种的静态成员变量和静态代码块,顺序执行
  • 初始化子类种的静态成员变量和静态代码块,顺序执行
  • 初始化父类的普通成员变量和代码块,再执行父类的构造函数
  • 初始化子类的成员变量和代码块,在执行子类的构造函数

在Java中,如果父类既有无参构造函数又有有参构造函数,并且子类没有显式调用父类的构造函数,则执行父类的无参构造函数。这是因为子类的构造函数会式地调用父类的无参构函数作为第步操作,以确保父类的初始化完成。只有在类的构造函数中显式调用了父类的有参构造函数时,会执行指定的父类构造函数。

二、类加载过程

类从加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。其中加载、验证和解析三个部分统称为连接。
加载、验证、准备、初始化和卸载这5个部分是确定的,类的加载过程必须按照这个顺序执行,而解析不一定,解析可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称之为动态绑定或者晚期绑定)

  • 加载阶段:

    • 通过一个类的全限定名(包名在内的类的整名称)来获取此类的二进制字节流
    • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
    • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类各种数据的访问入口

    加载阶段和连接阶段(Linking)的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段的开始时间仍然保持着固定的先后顺序。

  • 验证阶段:

    • 验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
    • 验证阶段大致会完成4个阶段的检验动作:
      • 文件格式验证:验证字节流是否符合Class文件格式的规范
      • 元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求
      • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的,符合逻辑的
      • 符号引用验证:确保解析动作能正确执行
    • 验证阶段非常重要但不是必须的
  • 准备阶段:

    • 准备阶段是正式为类变量分配内存并设置类初始值阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(static修饰的),不包括实例变量,实例变量在对象实例化时随着对象一起分配在堆中。
  • 解析阶段:

    • 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或者接口、字段、类方法、方法类型、方法句柄和调用点限定符等
  • 初始化阶段:类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。看上述

三、只有左移<<、有符号右移>>、无符号右移>>>

四、类加载:

类的加载由类加载器完成,类加载器包括:根加载器BootStrap、扩展加载器Extension、系统加载器System、自定义类加载器java.lang.ClassLoader

  • 根加载器BootStrap:一般用本地代码实现、负责加载JVM、基础核心类库
  • 扩展加载器Extension:系统属性所指定的目录中加载类库,父加载器是根加载器
  • 系统加载器System:应用类加载器,父类是扩展加载器Extension,它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,使用户自定义加载器默认夫加载器
  • 自定义类加载器:java.lang.ClassLoader的子类,父类委托机制可以修改,有些服务器就是自定义类加载器优先的
    Java的类加载器采用双亲委派模型,先检查是否已经被加载,若无,调用父类加载器的loadClass方法,若父类加载器为空,默认使用启动类加载器作为父类加载器,若父类加载器加载失败,抛出ClassNotFoundException异常

五、单例的5种实现模式:

  • 懒汉式(线程不安全)
  • 饿汉式(线程安全)
  • 双重检查锁实现(线程安全)
  • 静态内部类实现(线程安全)
  • 枚举类实现(线程安全)

六、常见的代码优化技术有:复写传播,删除死代码, 强度削弱,归纳变量删除

七、内部类

在这里插入图片描述


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

相关文章

ctemplate,安装以及出现报错处理方式

简介 Google CTemplate是一个开源的C模板引擎&#xff0c;可以生成html文件&#xff0c;今天安装出现一些问题&#xff0c;在此将遇到的问题以及解决方式记录下来# 简介 安装 git clone https://github.com/OlafvdSpek/ctemplate.gitcd ctemplate./autogen.sh./configure ma…

vue3 实现排序按钮

需求背景解决效果index.vue 需求背景 需要实现一个复用性&#xff0c;是提供表单顺倒排序的按钮 解决效果 index.vue <!--/*** author: liuk* date: 2023/7/25* describe: 排序按钮*/--> <template><div class"sort-fn"><span :class"[…

05网络模型练习题

新版MATLAB中&#xff0c;图论工具箱的函数进行了更换 MATLAB中文参考文档&#xff1a;https://ww2.mathworks.cn/help/matlab/index.html 遍历、最短路径和循环 bfsearch 广度优先图搜索 dfsearch 深度优先图搜索 shortestpath 两个单一节点之间的最短路径 shortestpathtree …

【多线程带来的的风险-线程安全的问题的简单实例-线程不安全的原因】

文章目录 前言线程不安全的5大原因1. 抢占式执行和随机调度2. 多个线程同时修改一个变量(共享数据&#xff09;3. 修改操作不是原子性的4. 内存可见性5. 指令重排序 前言 什么是线程安全&#xff1f; 简单来说&#xff0c;如果多线程环境下代码运行的结果是符合我们预期的&am…

数据结构【线性表】

数据结构入门级 第二章 线性表 一、线性表的定义和基本操作 线性表的定义&#xff1a;具有相同属性数据类型的数据元素组成的一个有限序列&#xff1b;除第一个元素外的元素都有直接前驱&#xff0c;除最后一个元素外的元素都有直接后继&#xff1b;存在一个唯一被称为“第一个…

【MATLAB第60期】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型

【MATLAB第60期】源码分享 | 基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型 一、简要介绍 ARMAX模型相比ARMA考虑了影响因素 &#xff0c;即可以实现基于时间序列数据的回归预测。目前&#xff0c;ARMAX预测未来功能存在困难&#xff0c;本篇文章不予介绍。大致思路…

刘铁猛C#语言教程——表达式详解1

表达式的定义 对以上文档的翻译&#xff1a; 对以上文档的代码解释&#xff1a;表达式是为了实现具体的算法逻辑并得到一个具体的值&#xff0c;而表达式的返回值可以是一个单值&#xff0c;也可以是实例&#xff0c;方法&#xff0c;或者命名空间&#xff1b;例如&#xff1a;…

EAP设备自动化控制系统在设备数采和控制方面的优势

随着科技的不断进步和工业自动化的发展&#xff0c;EAP&#xff08;Equipment Automation Program&#xff09;设备自动化控制系统在各个行业中扮演着越来越重要的角色。作为连接MES&#xff08;Manufacturing Execution System&#xff09;和设备层的沟通桥梁&#xff0c;EAP系…