自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 Java 内部类要点总览

局部变量 / 形参当前类自己声明的字段从父类 / 接口继承的字段(最近父类优先)封闭类( →  的父类 …)层层向外仍找不到 → 编译错误可变需求 → 用可变对象(、数组、…)或提升为外部类字段。编译阶段始终产生独立的 文件。JVM 仅在首次执行到 该类的位置时才加载,因此调试器/类浏览器里看不到 = 还未加载。方法栈帧消失 → 捕获值必须搬到堆上(内部类字段)。禁止二次赋值可避免“快照值”与原局部变量脱离同步。 与 统一采用 final 字段 + 构造器注入 实现,简单、高效、易被 JIT 优化。

2025-06-11 13:20:25 555 1

原创 接口的多重继承以及classes‑win rule

【代码】接口的多重继承以及classes‑win rule。

2025-06-04 17:33:47 196

原创 接口不继承Object

Java接口并不继承Object类,这一结论可从三个维度验证:1) 语法层面,编译器禁止接口extends Object;2) 反射层面,接口的getSuperclass()返回null;3) 成员可见性层面,接口变量无法调用Object的protected方法。虽然JVM文件格式规定接口的super_class字段为Object,但这仅用于文件格式统一,不代表继承关系。综合来看,在Java语言语义中,接口与Object类不存在继承关系。

2025-05-25 11:16:35 445

原创 Java 多态学习笔记(详细版)

多态(Polymorphism)是面向对象编程的一项核心特性,它允许“同一个对象”在不同情境下表现出不同的形态和行为。简单来说,多态指的是同一类型的引用在程序运行过程中可以指向不同子类的实例,从而调用各自重写的方法,呈现出不同的执行效果。继承关系:类之间有继承(或接口实现)关系,提供了共同的父类或接口类型。方法重写:子类重写(Override)父类的实例方法,使得同一方法调用在不同类上有不同实现。父类(或接口)引用指向子类对象:通过将子类实例赋给父类类型的引用(即向上转型),以父类引用来调用重写的方法。

2025-05-17 15:41:50 761

原创 继承关系下创建对象的具体流程

├─ super() → 调用 Object.<init>()│ ├─ 打印 "initX() 被调用了"└─ 返回 Person.<init>()│ └─ 调用 initX()└─ 为 child 对象分配内存,字段 x、y 等都置为默认值 (0)└─ 调用 Person.<init>()│ └─ 调用 initY()└─ 返回 Child(String)├─ 打印 "有参构造器执行"└─ 打印 "Child 构造器执行"Child() ──┬─ this("张三")

2025-05-12 17:43:33 719

原创 JAVA继承中变量和方法的存储和方法中访问变量的顺序

static 属类 → 方法区,实例属对象 → 堆内存查变量顺序:局部 → this对象(子 → 父)static 无多态,编译期解析类结构访问 static,推荐类名.变量名。

2025-05-09 18:05:18 570

原创 JAVA继承详细总结

如果子类声明了与父类同名的字段,就会产生遮蔽(shadowing)效果。因此,“虚方法”在 Java 中本质上指可被覆盖的实例方法。父类的成员变量会随继承进入子类对象的内存空间:在创建对象时,JVM 会为父类和子类分别分配字段存储区。,默认不加修饰时会优先查找当前方法的局部变量,然后是子类的字段,最后才是父类的字段;官方教程也指出,子类中与父类同名的字段会隐藏父类字段,想访问父类字段需要通过。官方教程将这种行为称为。也就是说,Java 中非私有实例方法既是继承的对象也是虚方法,两者并无矛盾。

2025-05-02 17:12:09 877

原创 Vtable

虚方法是方法的一个特性,意味着该方法是可以在子类中重写的。**方法表(vtable)**是支持虚方法机制的数据结构,它存储了每个虚方法的指针,允许在运行时根据对象类型调用正确的方法。

2025-04-29 00:16:38 478

原创 成员方法的详细说明(结合Oracle官方文档)

从上述文档中可以看出,Java对象的堆内存仅包含对象实例的字段数据和一些元数据,而方法表和类的元数据(如vtable、方法代码)存储在方法区或Metaspace中。这些文档没有直接使用“对象堆内存不存储成员方法地址”的表述,但通过对JVM结构和方法区的说明,可以推断出这一结论。

2025-04-29 00:13:01 931

原创 构造方法的调用者

操作符通过为新对象分配内存并返回对该内存的引用来实例化一个类。操作符也会调用该对象的构造方法。

2025-04-26 10:31:01 130

原创 switch 语句和表达式新旧特性

否则会穿透执行后续分支代码(fall-through)。新语法需确保 JDK ≥ 14,模式匹配需 ≥ 17。:支持模式匹配(需确认是否启用预览特性)。:分支内可以直接写多行语句,直到遇到。:必须返回一个值(需覆盖所有分支或加。传统语句中,即使允许多行代码不加。:支持 byte、short、新式表达式的代码块中,必须用。返回值(箭头语法单行除外)。在代码块中显式返回值(类似。:执行代码逻辑(不返回值)。新式表达式优先使用箭头语法(单行直接返回值,多行需用。),而语句直接执行代码。,自动阻断穿透,无需。

2025-04-16 11:10:49 635

原创 StringBuilder 核心源码

(16*2+2),若还不够则直接取所需容量。动态切换,像根据物品大小选择不同收纳袋。例如:原容量16 → 不足时扩容到。,像背包装东西前的初始格子。,像在背包里放一个固定标签。当容量不足时,新容量 =

2025-04-15 10:37:02 286

原创 彻底理解计算机中的补码——为什么“取反加1”是终极方案?

人们想区分正负,所以用最高位表示符号位,却发现在做加法运算的时候,符号位不起作用,所以又开始琢磨其他方案---反码。将符号位融入数值本身的二进制表示中,使得所有运算(无论正负)都可以用同一套逻辑处理(暂时也在学习中)。:补码是计算机用正数表示负数的“魔术”,本质是数学规律(模运算)的工程实现。补码通过“加1”消除-0,扩展数值范围,并修复跨0运算错误。直接将最高位作为符号位(0正1负),数值位正常表示。:通过“取反加1”实现模运算,统一加减法,硬件只需加法器。:负数的反码 = 符号位不变,数值位取反。

2025-03-21 02:00:29 938 2

原创 十进制小数转二进制:乘2取整法详细总结

通过不断将当前余数乘以2,并取整数部分来判断当前二进制位是否为1,随后用乘积的小数部分继续转换下一个位。这个过程可以看作是对 f 进行二进制级数展开的递归求解,每次扣除最高位后,余数乘2后正好呈现出下一位的情况。用“水桶装水”的比喻可以帮助理解:每一步都在判断当前剩余水量是否足以“装满”相应容量的水桶,乘2操作将水量“放大”,使得判断过程统一且直观。

2025-03-19 11:23:28 573

原创 \t制表符的具体实现原理,详细版

实现一定的对齐效果。最少补 1 个空格,最多补到制表位的宽度(例如 8 个空格),其作用是将光标移动到下一个。

2025-01-13 01:07:49 188 1

原创 字面量 常量 变量

值的变化:字面量的值是固定的。常量的值在初始化后是固定的。变量的值可以改变。使用方式:字面量直接在代码中使用。常量需要声明并初始化,之后可以在程序中多次使用。变量需要声明,可以在程序中多次赋值和使用。内存:字面量不占用命名的内存空间。常量和变量都需要在内存中分配空间。

2024-12-30 01:55:41 359

原创 instanceof关键字的详细解释

在创建对象的时候,左边的类型是静态不变的,定义什么类型就是什么类型,而右边对象的实际类型是一个动态不确定的,可以是左边的基类型或其子类型。由上面的例子我们可以得到instanceOf运算符:它的运行时语义。如果想更加详细的了解instanceOf关键字,可以去看看大牛的解读。)是否跟右操作数所指定的类型相匹配。它的左操作数的引用的。

2024-09-11 01:22:37 248

原创 JVM内存模型

【代码】JVM内存模型。

2024-09-09 00:48:57 280

原创 hashMap的构造方法源码的详细解读

【代码】hashMap的构造方法源码的详细解读。

2024-04-24 06:43:26 158

原创 hashMap的put方法源码的详细解读

【代码】hashMap的put方法源码的详细解读。

2024-04-24 06:21:06 383 1

原创 hashSet添加相同元素是否会被覆盖

HashMap保证key的不重复性,value可以重复,对于重复的key,HashMap会根据参数onlyIfAbsent的设置和原value是否为空两个条件来判断是否替换新value,但要注意的是,对于HashSet,这个value只是个空的Object类的对象,没有任何实际作用,HashSet中的元素实际上是存储在key上的。针对重复的key,HashMap只有对于value的处理,并不会替换key,因此在HashSet中加入相同元素不会覆盖。HashSet底层使用HashMap实现。

2024-04-09 16:18:49 566

原创 泛型擦除的有趣事

此时,你会看到编译器会帮我们创建一个返回值类型位Object类型的getT()方法,可能是为了与父类保持继承关系吧。

2024-04-06 23:28:49 228

原创 泛型数组的赋值

这是因为泛型信息在运行时会被擦除,而数组需要在运行时知道它们的具体类型,换位思考,如果被允许,运行的时候是object类型,那我可以往arrayList集合里面添加Integer类型的对象,但是我的泛型是String类型的,二者冲突(你会好奇,泛型编译期就检查了,怎么可能让你在运行的时候添加Integer类型的对象,其实通过桥接的方式,就可以实现,我将代码写在下面了)。因为创建了一个未指定泛型类型的ArrayList数组,然后将它赋值给指定了泛型类型为String的ArrayList数组引用。

2024-04-06 23:12:39 319

原创 java中next()和nextline()用法区别(详细说明)

():当遇到空格/Tab键/回车截止读取,不包含空格/Tab键/回车,开头如果有空格/Tab/回车,直接无视,读取后面的字符,直到遇到空格/Tab键/回车截止读取;():读取字符前后的空格/Tab键,有回车键时截止读取,包含回车键。

2024-03-13 10:48:36 1089

原创 关于java的类型转换

【代码】关于java的类型转换。

2024-03-12 22:51:45 180

原创 Servlet的映射路径主要有三种方式

例如,如果映射路径是/example/,那么/example、/example/abc、/example/xyz等URL都会被映射到这个Servlet。例如,如果映射路径是/dir/,那么任何以/dir/开始的URL都会被对应的servlet处理,如/dir/a、/dir/b等。简而言之,/不包含JSP文件的处理是因为JSP文件有专门的处理机制和Servlet,而/*包含JSP文件的处理是因为它表示拦截所有请求,不区分请求的类型。在Servlet映射中,/和/*有着不同的含义,尤其是在处理JSP文件时。

2024-03-04 12:03:00 774

原创 MySql的四种事务隔离级别

幻读:在同一事务中,两次查询的结果集数量不一致,通常是因为其他事务插入或删除了数据造成的。(以为存在,其实不存在,以为不存在,其实存在,产生了幻觉)数据库事务隔离级别主要用于解决并发事务中的一些问题,如脏读、不可重复读和幻读。不可重复读:在同一事务中,多次读取同一数据集合时,由于其他事务的修改操作,导致后续读取的数据和前面的不一致。脏读:一个事务读取到另一个事务未提交的数据。

2024-03-03 11:42:56 441

原创 Spring声明式事务的传播行为

1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。7. NESTED:如果当前存在事务,则在嵌套事务内执行。2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。5. NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则挂起当前事务。4. REQUIRES_NEW:总是创建一个新的事务,如果当前存在事务,则挂起当前事务。6. NEVER:总是以非事务方式执行,如果当前存在事务,则抛出异常。

2024-03-03 10:11:05 513

原创 <aop:aspectj-autoproxy expose-proxy=“true“ />解释

默认情况下,当你在Spring管理的bean中调用本地方法时(即一个方法调用同一个类中的另一个方法),这个调用不会通过代理对象,也就是说,不会应用任何与该调用相关的AOP增强(如事务管理、安全检查等)。这是因为代理是基于拦截外部对bean的调用来工作的,而不是拦截bean内部的方法调用。大白话:当你对一个类的某一个方法进行了AOP增加,默认情况下,同类的其他方法无法调用增强后的方法,除非你在spring配置文件中设置了expose-proxy="true" ,让这个代理对象暴露在外面。

2024-03-02 22:40:49 491

原创 Spring的AOP配置文件中pointcut的execution表达式

1. 权限修饰符和返回类型:2. 包和类的匹配:3. 方法的匹配:

2024-02-27 00:08:39 493

原创 MyBatis三种主要的开发方式

2. 纯XML:在这种方式中,你只需要在 XML 文件中定义 SQL 语句,不需要创建接口。当你调用这个代理对象的方法时,代理对象会将调用转发给 MyBatis 的 SqlSession,SqlSession 再根据方法的全限定名(包括命名空间)来查找对应的 SQL 语句,然后执行这个 SQL 语句。当你调用接口方法时,代理对象会将调用转发给 MyBatis 的 SqlSession,SqlSession 再根据方法的全限定名(包括命名空间)来查找对应的 SQL 语句,然后执行这个 SQL 语句。

2024-01-27 11:37:13 221 1

原创 SpringAOP中名词解释

6. 代理(Proxy):这是AOP框架创建的对象,它包装了目标对象,并在调用目标对象的方法时提供了通知的执行。7. 切面(Aspect):如果说织入是过程(动词),那么切面就是计划(名词),如何将动作放到切入点,是放到切入点的前面,还是切入点的后面,还是切入点发生异常等等。7. 切面(Aspect):这是通知和切入点的组合,它可以直接应用于程序代码,并定义了何时(切入点)以及如何(通知)在目标对象上进行跨越关注点的操作。4. 目标对象(Target Object):这是被代理的对象,即包含连接点的对象。

2024-01-21 00:05:39 536 1

原创 synchronized 和 volatile的有序性比较

但synchronized和volatile的有序性并不是一回事,很多地方也都没有说清楚。synchronized的三大特征:原子性、有序性、可见性。volatile的两大特征:有序性、可见性。

2024-01-04 22:24:34 466

原创 Spring框架中的简单类型的依赖注入

2. 确定构造函数: Spring会查找bean类中的构造函数,该构造函数的参数类型和数量必须与元素指定的参数类型和数量相匹配。当Spring容器创建这个bean的实例时,它会使用这些元素指定的参数来调用bean的构造函数。2. 确定setter方法: Spring会查找bean类中的setter方法,该方法的名称必须与元素的name属性相匹配(例如,对于name="id",Spring会查找setId()方法)。

2024-01-03 16:01:32 446

原创 Spring中ClassPathXmlApplicationContext.getBean()常用用法

如果你尝试获取MySuperClass类型的bean,Spring将返回MyClass的实例(假设它是唯一匹配的bean)。如果你尝试获取MyInterface类型的bean,Spring将返回MyClass的实例(假设它是唯一匹配的bean)。在这个例子中,"myClass"是你想要获取的bean的ID,MyClass.class是你想要获取的bean的类型。如果你在getBean()方法中指定的类型是一个接口或者父类,Spring会在容器中查找匹配的子类或者实现类的bean。

2024-01-03 14:55:21 861

原创 java中释放锁的情况

需要注意的是,Java 中的锁是自动管理的,程序员通常不需要手动释放锁。2. 如果在 synchronized 块或方法中,线程因为调用了 wait() 方法而进入等待状态,那么这个线程会释放锁。3. 如果在 synchronized 块或方法中,线程因为发生了未捕获的异常而终止,那么这个线程也会释放锁。1. 当进入 synchronized 块或方法的线程执行完这些代码后,它会自动释放锁。

2024-01-02 23:07:38 893

原创 java序列化和反序列化(serialize)

需要注意的是,反序列化不会调用对象的构造函数,因此,如果在构造函数中有特殊的逻辑(例如初始化某些字段),那么这些逻辑在反序列化时不会被执行。需要注意的是,如果字段是对象,那么这个对象也会被序列化,如果这个对象引用了其他对象,那么这些对象也会被序列化,以此类推。当序列化一个对象时,Java 会将对象的类名、类的 serialVersionUID,以及非瞬态(non-transient)和非静态(non-static)字段的值写入到输出流中。但是,方法、构造函数以及任何其他非字段的类级别的信息都不会被序列化。

2024-01-02 23:04:05 363

原创 mybatis自定义映射的省略情况

分布连表查询的情况下,我通过取别名的方式让字段名和属性名完全一致,并没有指明字段名和属性名之间的映射关系,通过日志的输出结果可以看出,mybatis帮我们进行创建了对象(这个的wid因为关联的是wife的id,所以可能是被看作重复的字段名,所以无法进行映射)直接连表查询的情况下,我通过取别名的方式让字段名和属性名完全一致,并没有指明字段名和属性名之间的映射关系,通过日志的输出结果可以看出,mybatis没有帮我们进行创建对象。原因:应该是单表的情况下,字段名不可能重复,所以通过字段名就能找到对应的属性。

2023-12-30 10:36:22 451 1

原创 Mybatis <trim>标签的基本使用

suffixOverrides=",":这意味着如果<trim>标签内部的任何条件成立,生成的SQL语句的末尾的逗号(如果存在)都会被删除。也就是说,只会删除一次。- prefix="SET":这意味着如果<trim>标签内部的任何条件成立(即,有任何内容被添加到SQL语句中),那么"SET"这个前缀就会被添加到生成的SQL语句的开始部分。- suffix:这意味着如果<trim>标签内部的任何条件成立(即,有任何内容被添加到SQL语句中),那么指定的后缀就会被添加到生成的SQL语句的末尾。

2023-12-22 11:10:44 1010

原创 关于java拆装箱的一些自动转换规则

java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。①无论如何,Integer与new Integer不会相等。③两个都是new出来的,都为false。

2023-10-24 11:08:18 71

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除