_note_09
1.说一说类加载的过程
加载(Loading) -> 验证(Verification) -> 准备(Preparation) -> 解析(Resolution) -> 初始化(Initialization)类的加载是Java虚拟机的核心功能之一,它负责将类的字节码文件加载到内存中,并将其转换为JVM能够理解和执行的格式。类的加载过程包括以下几个步骤:加载:查找并加载类的字节码文件到内存中。
验证:验证字节码文件的格式是否正确,以及是否符合Java虚拟机的要求。
准备:为类的静态变量分配内存,并设置默认初始值。
解析:将类的符号引用转换为直接引用,即将类、方法、字段等的符号引用解析为对应的直接引用。
初始化:执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。在类加载完成后,可以通过创建类的实例、调用类的静态方法和访问类的静态变量等方式来使用类。
当一个类不再被使用时,虚拟机会将其从内存中卸载。类的卸载是由垃圾回收器完成的,当垃圾回收器确定一个类的实例不再被引用时,就会触发类的卸载过程。
2.说一说对象创建的过程
开辟内存 执行构造函数 返回对象在Java中,对象的创建过程包括以下几个步骤:1. 分配内存(Allocation):当使用关键字`new`创建一个对象时,首先会在堆(Heap)中分配内存空间来存储对象的实例变量。2. 初始化零值(Zeroing):在分配内存后,虚拟机会将分配的内存空间中的数据都初始化为零值(对于基本类型)或者`null`(对于引用类型)。3. 设置对象头(Object Header):在分配内存后,虚拟机会为对象分配一个对象头。对象头包含了一些用于管理对象的元数据,如对象的哈希码、锁状态、GC标记等。4. 执行构造函数(Constructor):在对象分配内存并设置对象头后,虚拟机会调用对象的构造函数来初始化对象的实例变量。构造函数是一个特殊的方法,用于初始化对象的状态。5. 返回对象引用(Reference):构造函数执行完毕后,会返回一个对象引用,该引用可以被用来操作对象的实例变量和调用对象的方法。总的来说,对象的创建过程包括分配内存、初始化零值、设置对象头、执行构造函数和返回对象引用等步骤。在这个过程中,虚拟机负责分配内存、初始化对象头和执行构造函数,而开发人员则需要编写构造函数来初始化对象的状态。
3.说一说子类对象的创建过程
在Java中,对象的创建过程包括以下几个步骤:1. 分配内存(Allocation):当使用关键字`new`创建一个对象时,首先会在堆(Heap)中分配内存空间来存储对象的实例变量。2. 初始化零值(Zeroing):在分配内存后,虚拟机会将分配的内存空间中的数据都初始化为零值(对于基本类型)或者`null`(对于引用类型)。3. 设置对象头(Object Header):在分配内存后,虚拟机会为对象分配一个对象头。对象头包含了一些用于管理对象的元数据,如对象的哈希码、锁状态、GC标记等。4. 执行构造函数(Constructor):在对象分配内存并设置对象头后,虚拟机会调用对象的构造函数来初始化对象的实例变量。构造函数是一个特殊的方法,用于初始化对象的状态。5. 返回对象引用(Reference):构造函数执行完毕后,会返回一个对象引用,该引用可以被用来操作对象的实例变量和调用对象的方法。总的来说,对象的创建过程包括分配内存、初始化零值、设置对象头、执行构造函数和返回对象引用等步骤。在这个过程中,虚拟机负责分配内存、初始化对象头和执行构造函数,而开发人员则需要编写构造函数来初始化对象的状态。
4.什么时候执行类加载?类加载执行了几次?
创建类的实例对象时
访问类的静态成员(静态变量或静态方法)时
使用反射机制访问类时
当启动Java程序时,会先加载主类(包含main方法的类)
初始化一个超类的派生类类加载执行的次数取决于类的引用情况。同一个类只会被加载一次,无论是通过创建实例对象、访问静态成员还是使用反射机制。但是如果类被多次引用,每次引用都会触发类的加载。例如,如果一个类被多个类引用,那么每个引用类都会触发一次类加载。
5.说一说overload和override的区别?
overload 同一个类,方法同名,形参不同;override 派生类继承超类, 派生类重写超类的同名同形参的方法实现
6.仔细说一说override使用的时候特点
在Java中,方法重写(Override)是指子类重写父类中已有的方法,以实现自己的功能需求。方法重写有以下特点:1. 方法名和参数列表必须与父类中被重写的方法相同。2. 访问修饰符不能更严格,可以更宽松。例如,父类中的方法为public,则子类中的方法可以为public或protected;父类中的方法为protected,则子类中的方法可以为public、protected或默认(即不写访问修饰符)。3. 返回类型可以相同或更具体,但不能更宽泛。例如,如果父类中的方法返回类型为Object,则子类中的方法可以返回Object或Object的子类,但不能返回Object的父类。4. 子类中重写的方法不能抛出比父类中被重写的方法更多的异常,可以抛出相同的异常或更少的异常,也可以不抛出异常。5. 在子类中,可以使用`super`关键字调用父类中被重写的方法,也可以不调用。方法重写的目的是为了实现多态性,即通过父类引用指向子类对象,并调用子类中重写的方法。在运行时,虚拟机会根据实际对象类型来确定调用哪个方法。这样可以提高代码的灵活性和可扩展性,同时也符合面向对象编程的原则。
7.写出饿汉式和懒汉式的单例模式
饿汉式单例模式是指在类加载的时候就创建单例对象,无论是否使用都会创建。懒汉式单例模式是指在第一次使用时才创建单例对象。下面是饿汉式和懒汉式的单例模式的示例代码:1. 饿汉式单例模式:```java
public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
```在饿汉式单例模式中,私有的静态变量`instance`在类加载时就被创建,并通过公共的静态方法`getInstance()`返回实例。2. 懒汉式单例模式:```java
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
```在懒汉式单例模式中,私有的静态变量`instance`在第一次使用时才被创建,并通过公共的静态方法`getInstance()`返回实例。为了保证线程安全,可以使用`synchronized`关键字来修饰`getInstance()`方法,但这会影响性能。可以使用双重检查锁定(Double-Checked Locking)或静态内部类的方式来提高性能和线程安全性。需要注意的是,懒汉式单例模式在多线程环境下可能会出现线程安全问题,可以通过加锁或其他方式解决。而饿汉式单例模式在类加载时就创建实例,不存在线程安全问题。
8.说说饿汉式单例模式和懒汉式单例模式的特点
饿汉式单例模式和懒汉式单例模式是两种常见的单例模式实现方式。1. 饿汉式单例模式的特点:- 在类加载时就创建单例对象,无论是否使用都会创建。- 线程安全,不存在多线程环境下的竞争问题。- 实现简单,代码量少。- 可能会浪费内存,因为在类加载时就创建对象,如果后续没有使用到该对象,就会造成内存的浪费。2. 懒汉式单例模式的特点:- 在第一次使用时才创建单例对象。- 延迟加载,节省了内存空间。- 可能存在多线程环境下的竞争问题,需要考虑线程安全性。- 实现相对复杂,需要考虑线程安全性和性能问题。需要根据具体的需求来选择使用饿汉式还是懒汉式单例模式。如果对内存占用没有特别严格的要求,且希望实现简单,可以使用饿汉式单例模式。如果对内存占用有要求,或者希望实现延迟加载,可以使用懒汉式单例模式。同时,需要注意在懒汉式单例模式中考虑线程安全性的问题,可以使用加锁或其他方式来解决。
9.什么是继承?
继承是面向对象编程中的一个重要概念,它是指一个类(称为子类或派生类)可以继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,并可以在此基础上添加新的属性和方法,或者对父类的方法进行重写。继承的主要作用有:代码重用:子类可以继承父类的属性和方法,避免重复编写相同的代码。
扩展性:子类可以在父类的基础上添加新的属性和方法,实现功能的扩展。
多态性:通过继承,可以实现多态性,即通过父类引用指向子类对象,并调用子类中重写的方法。
10.Java类和类之间是单继承吗?Java支持多继承吗?Java支持多重继承吗?
在Java中,一个类只能继承一个父类,这被称为单继承。这意味着一个类只能有一个直接父类,但可以实现多个接口。Java不支持多继承,即一个类不能直接继承多个父类。这是为了避免多继承可能引发的冲突和歧义问题。然而,Java支持多重继承,即一个类可以继承另一个类,而被继承的类本身可以继承另一个类。这样的继承关系被称为多重继承。例如,类A继承自类B,而类B又继承自类C,那么类A就间接地继承了类C的属性和方法。Java实现多重继承的方式是通过类与接口的组合来实现。一个类可以继承一个父类,并实现多个接口,从而达到多重继承的效果。这样可以在继承父类的同时,又能继承多个接口的特性。
11.说一说Final关键字
final 是 修饰符。修饰 变量、成员属性,表示该变量、成员属性为常量。修饰 方法,表示该方法不能被Override重写。修饰 类,表示该类不能被extends继承。
12.子类构造函数中,this()和super()能不能同时存在?
不能。
这是因为它们都用于调用构造函数,而每个构造函数只能在第一行调用另一个构造函数,要么是当前类的其他构造函数(使用this()),要么是父类的构造函数(使用super())。
虽然this()和super()不能同时存在于同一个构造函数中,但可以在不同的构造函数中使用。例如,子类的一个构造函数中使用this()调用同类的另一个构造函数,而在另一个构造函数中使用super()调用父类的构造函数。这样可以实现多个构造函数之间的调用链。
相关文章:
_note_09
1.说一说类加载的过程 加载(Loading) -> 验证(Verification) -> 准备(Preparation) -> 解析(Resolution) -> 初始化(Initialization)类的加载是…...
是否可以在HTTP中缓存POST方法
如果您想知道是否可以缓存post请求,并尝试研究该问题的答案,那么您很可能不会成功。当搜索“缓存post请求”时,第一个结果是这个StackOverflow问题。 答案是令人困惑的,包括缓存应该如何工作,缓存如何根据RFC工作&…...

Xilinx 7系列FPGA配置(ug470)
Xilinx 7系列FPGA配置(ug470) 配置模式串行配置模式接口从-连接方式主-连接方式串行菊花链(非同时配置)串行配置(同时配置)时序 主SPI配置模式SPIx1/x2 连接图SPIx1模式时序SPIx4 连接图SPI操作指令操作fla…...

3分钟开通GPT-4
AI从前年12月份到现在已经伴随我们一年多了,还有很多小伙伴不会开通,其实开通很简单,环境需要自己搞定,升级的话就需要一张visa卡,办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…...

Easticsearch性能优化之索引优化
Easticsearch性能优化之索引优化 一、合理的索引设计二、合理的分片和副本三、合理的索引设置 对于性能优化,Elasticsearch(以下简称ES)的索引优化是提高性能的关键因素之一。合理的设计索引,合理的分片和副本以及合理的缓存设置等…...

安装mysql-8.0.30-winx64(windows 64位)
1.下载 1.1下载地址:https://dev.mysql.com/downloads/mysql/ 2 .下载后解压缩目标文件 2.1之后在根目录下新建my.ini文件,并创建文件夹data (新解压的文件没有my.ini文件,需自行创建 复制以下代码到my.ini文件 以下代码除安装目录和数据的…...

ios xcode 15 PrivacyInfo.xcprivacy 隐私清单
1.需要升级mac os系统到13 兼容 xcode 15.1 2.升级mac os系统到14 兼容 xcode 15.3 3.选择 New File 4.直接搜索 privacy 能看到有个App Privacy 5.右击Add Row 7.直接选 Label Types 8.选中继续添加就能添加你的隐私清单了 苹果官网文档Describing data use in privacy man…...

【物联网】-智能社会的分类
万物感知 感知物理世界,变成数字信号 (温度、空间、触觉、嗅觉、听觉、视觉) 万物互联 将数据变成online,使智能化 (宽联接、广联接、多联接和深联接) 万物智能 基于大数据和人工智能的应用 &#…...

Django高级之-cookie-session-token
Django高级之-cookie-session-token 发展史 1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请…...

【Prometheus】k8s集群部署node-exporter
目录 一、概述 1.1 prometheus简介 1.2 prometheus架构图 1.3 Exporter介绍 1.4 监控指标 1.5 参数定义 1.6 默认启用的参数 1.7 prometheus如何收集k8s/服务的–三种方式收集 二、安装node-exporter组件 【Prometheus】概念和工作原理介绍-CSDN博客 【云原生】ku…...

2024年k8s最新版本安装教程
k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…...

Gin 获取请求参数
POST 请求参数 Gin 获取Post请求URL参数有三种方式 func (c *Context) PostForm(key string) string func (c *Context) DefaultPostForm(key, defaultValue string) string func (c *Context) GetPostForm(key string) (string, bool)大多数情况下使用的是application/x-www…...
安卓 Kotlin 面试题 31-40
🔥 31、简述Kotlin 中的内联类,我们什么时候需要?🔥 有时,业务逻辑需要围绕某种类型创建包装器。 但是,由于额外的堆分配,它会引入运行时开销。 此外,如果包装的类型是原始类型&…...
【洛谷千题详解】P1613 跑路
目录 题目总览 题目描述 输入格式 输出格式 思路分析 AC代码 题目总览 题目描述 小 A 的工作不仅繁琐,更有苛刻的规定,要求小 A 每天早上在 6:00 之前到达公司,否则这个月工资清零。可是小 A 偏偏又有赖床的坏毛病。于是为了保住自己的…...
如何定义resultType和resultMap,它们之间的区别是什么?解释一下<parameterType>的作用和用法。
在MyBatis中,resultType和resultMap都用于将数据库查询结果映射到Java对象,但它们在使用方式和灵活性上有一些区别。 resultType resultType是一个简单的类型别名,它用于指定查询结果应该映射到的Java类型。当数据库表中的列名和Java对象的属…...

Docker:部署微服务集群
1. 部署微服务集群 实现思路: ① 查看课前资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件 ② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名 ③ 使用maven打包工具,将项目…...

傅里叶变换pytorch使用
参考视频:1 傅里叶变换原理_哔哩哔哩_bilibili 傅里叶变换是干嘛的: 傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的。 傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像…...
LeetCode104 二叉树的最大深度
题目 给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,…...

使用Spring的AOP
使用Spring的AOP 一、AOP 的常用注解1.切面类Aspect2.Pointcut3.前置通知Before4.后置通知AfterReturning5.环绕通知Around6.异常通知AfterThrowing7.最终通知After8.切面顺序Order9.启用自动代理EnableAspectJAutoProxy 二、AOP注解方式开发三、AOP 全注解开发四、基于XML配置…...
爬虫之矛---JavaScript基石篇3<JavaScript构造函数的内部机制和应用(2)>
前言: 继续上一篇https://blog.csdn.net/m0_56758840/article/details/136592611 正文: 1.ES6中的类和构造函数的对应关系 A. 介绍ES6引入的类的概念和语法糖 类的概念: ES6引入了类(class)的概念,类是一种抽象的数据类型&…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...

Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...