java的一些冷知识
接口并没有继承Object类
首先接口是一种特殊的类,理由就是将其编译后是一个class文件
大家都知道java类都继承自Object,但是接口其实是并没有继承Object类的
可以自己写代码测试: 获取接口类的class对象后遍历它的methods,可以发现是不存在Object的方法的。
也可以通过接口的class文件观察,正常的类都最有基本的invokeSpecial

而接口的class文件则是干干净净
接口可以多继承
都知道java类是不允许多继承的,原因就是当有不同父类拥有相同的方法时,子类不知道该继承哪一个。
但是接口是允许多继承的,原因就是接口里的方法都是抽象方法,即没有具体的实现的方法。那么也就没有这个顾虑了,管它哪个父类有相同的方法,大家都没有实现,继承了就完事了。
java里面所有方法传参都是值传递
虽然我们在使用会有一些奇怪的现象发生,但是在java中不存在引用传递,全是值传递。
说说我遇到的奇怪现象:
当传入参数是数组的时候,改变数组内部某一个位置上的数据,原数组也会生效这一变化。
当传入参数是对象的时候,改变对象内部属性的数据,原对象也会生效。
本来我是百思不得其解,经过实验后发现,如果不改变其内部的数据,而直接改变其对象引用会怎样。
答案是不会生效
这就验证了它确实是值传递。
但是为什么改变内部的属性的数据会生效呢?我个人理解是,java在方法传参时使用的是浅拷贝而不是深拷贝,也就是内部的属性引用是被传了进来的,但是那个参数的引用没有被传进来。
public static void main(String[] args) {int []is={1,2,3,4,5};System.out.println("原数组的值");for (int i : is) {System.out.print(i+",");}System.out.println("\n改变数组内的值");changeBuf(is);for (int i : is) {System.out.print(i+",");}System.out.println("\n改变数组对象");changeBuf2(is);for (int i : is) {System.out.print(i+",");}}private static void changeBuf2(int[] is) {is=new int[]{5,4,3,2,1};}private static void changeBuf(int[] is) {is[0]=100;}
输出结果:

join方法释放锁,但是不怎么好用
join方法的作用是让调用者线程等待目标线程执行完毕。
首先从join方法源码看,里面是用到了wait()方法
众所周知,wait方法是释放锁的。也就是说join方法也会释放锁,但是释放的锁可能并不如我们意。
并且join方法会占用cpu而不会释放cpu。
顺便说说几个控制线程状态的方法:
wait方法释放锁,释放cpu
join方法释放锁,不释放cpu
sleep方法不释放锁,释放cpu
yield方法不释放锁,释放cpu
park不释放锁,释放cpu
Object lock=new Object();//join是否释放锁Thread t2 = new Thread(() -> {synchronized (lock) {System.out.println("我来也~~");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("叫醒你!!");}});Thread t1 = new Thread(() -> {synchronized (lock) {try {System.out.println("我睡一下!记得叫醒我");t2.join();System.out.println("睡醒了!!");} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();t2.start();
我希望的执行结果是: (t1)我睡一下!释放锁lock,等待t2执行完毕 (t2)我来也~ 释放锁lock (t1)睡醒了!
结果却是卡在了t1睡觉这里。 说明t1并没有释放lock。
这段代码将join换成wait就是以上希望的结果。
原因其实是,join方法虽然释放锁,但是释放的是t2,观看其源码可以发现它在join方法上面加了synchornized,此时锁的是线程对象,也就是t2。
public final synchronized void join(long millis)throws InterruptedException {long base = System.currentTimeMillis();long now = 0;if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (millis == 0) {while (isAlive()) {wait(0);}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}}}
相关文章:
java的一些冷知识
接口并没有继承Object类首先接口是一种特殊的类,理由就是将其编译后是一个class文件大家都知道java类都继承自Object,但是接口其实是并没有继承Object类的 可以自己写代码测试: 获取接口类的class对象后遍历它的methods,可以发现是不存在Obje…...
java代理模式
代理模式 为什么要学习代理模式?因为这是SpringAOP的底层! 【SpringAOP和SpingMVC}】 代理模式的分类: 静态代理 动态代理 代理就像这里的中介,帮助你去做向房东租房,你不能直接解出房东,而房东和中介…...
JUC包:CountDownLatch源码+实例讲解
1 缘起 有一次听到同事谈及AQS时,我有很多点懵, 只知道入队和出队,CLH(Craig,Landin and Hagersten)锁,并不了解AQS的应用, 同时结合之前遇到的多线程等待应用场景,发现…...
Log4j2基本使用
文章目录1. Log4j2入门2. Log4j2配置3. Log4j2异步日志4. Log4j2的性能Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来了一些重大的提升,主要有: 异常处理,…...
A2L在CAN FD总线的使用
文章目录 前言CAN时间参数BTL CyclesTime Quantum时间份额SWJ同步跳转宽度波特率计算采样点计算CAN FD的第二采样点SSP推荐配置A2L配置总结前言 A2L作为XCP标定协议的载体,包括了总线信息的定义。本文介绍如何将基于CAN总线的A2L扩展为支持CAN-FD的A2L CAN时间参数 在介绍配…...
Android JetPack之启动优化StartUp初始化组件的详解和使用
一、背景 先看一下Android系统架构图 在Android设备中,设备先通电(PowerManager),然后加载内核层,内核走完,开始检查硬件,以及为硬件提供的公开接口,然后进入到库的加载。库挂载后开…...
[11]云计算|简答题|案例分析|云交付|云部署|负载均衡器|时间戳
升级学校云系统我们学校要根据目前学生互联网在线学习、教师教学资源电子化、教学评价过程化精细化的需求,计划升级为云教学系统。请同学们根据学校发展实际考虑云交付模型包含哪些?云部署采用什么模型最合适?请具体说明。9月3日买电脑还是租…...
C++11/C++14:lambda表达式
概念 lambda表达式:是一种表达式,是源代码的组成部分闭包:是lambda表达式创建的运行期对象,根据不同的捕获模式,闭包会持有数据的副本或引用闭包类:用于实例化闭包的类,每个lambda表达式都会触…...
算法课堂-分治算法
分治算法 把一任务分成几部分(通常是两部分)来完成(或只完成一部分),从而实现整个任务的完成 或者你可以把递归理解为分治算法的一部分 因为递归就是把问题分解来解决问题 例子 称假币 最笨的方法:两两称…...
操作系统权限提升(十六)之绕过UAC提权-CVE-2019-1388 UAC提权
系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权 操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权 注&a…...
实例9:四足机器人运动学正解平面RR单腿可视化
实例9:四足机器人正向运动学单腿可视化 实验目的 通过动手实践,搭建mini pupper四足机器人的腿部,掌握机器人单腿结构。通过理论学习,熟悉几何法、旋转矩阵法在运动学正解(FK)中的用处。通过编程实践&…...
堆的基本存储
一、概念及其介绍堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。二、适用说明堆是利用完全二叉树的结构来维护一组数…...
如何获取物体立体信息通过一个相机
大家都知道的3D 技术是通过双眼视觉差异 得到的 但是3D的深度并没有那么强 为什么眼睛看到的就那么强 这无法让我们相信这个视觉差理论是和人眼睛立体感是一个原理 这个如今3D 电影都在用的技术 是和真正的人眼立体感 不一样的 或者说是有瑕疵的 分析一下现在的立体感技术 是通…...
【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)
目录 一、背景和挖掘目标 1、问题背景 2、传统方法的缺陷 3、原始数据情况 4、挖掘目标 二、分析方法和过程 1、初步分析 2、总体过程 第1步:数据获取 第2步:数据预处理 第3步:构建模型 三、思考和总结 项目地址:Data…...
一些硬件学习的注意事项与快捷方法
xilinx系列软件 系统适用版本 要安装在Ubuntu系统的话,要注意提前看好软件适用的版本,不要随便安好了Ubuntu系统又发现对应版本的xilinx软件不支持。 如下图,发行说明中会说明这个版本的软件所适配的系统版本。 下载 vivado vitis这些都可以…...
【Tomcat】Tomcat安装及环境配置
文章目录什么是Tomcat为什么我们需要用到Tomcattomcat下载及安装1、进入官网www.apache.org,找到Projects中的project List2、下载之后,解压3、找到tomcat目录下的startup.bat文件,双击之后最后结果出现多少多少秒,表示安装成功4、…...
负载均衡:LVS 笔记(二)
文章目录LVS 二层负载均衡机制LVS 三层负载均衡机制LVS 四层负载均衡机制LVS 调度算法轮叫调度(RR)加权轮叫调度(WRR)最小连接调度(LC)加权最小连接调度(WLC)基于局部性的最少链接调…...
SEO优化:干货技巧分享,包新站1-15天100%收录首页
不管是老域名还是新域名,不管是多久没有收录首页的站,此法周期7-30天,包首页收录!本人不喜欢空吹牛逼不实践的理论,公布具体操作:假如你想收录的域名是a.com,那么准备如下材料1.购买5-10个最便宜…...
JavaWeb测试题
【第四小组】【姓名:郑梦飞】说明:上方【组】填入所在的组,上方【姓名】填入自己的真实姓名。答题方式,基于Word文档基础上答题编程题可利用工具编程完以后,复制到该文档内。答完以后,导成PDF。以姓名.PDF命…...
Java EE|TCP/IP协议栈之数据链路层协议详解
文章目录一、数据链路层协议感性认识数据链路层简介以太网简介特点二、以太网数据帧格式详解帧头不同类型对应的载荷三、关于MTU什么是MTUMTU有什么作用ip分片(了解)参考一、数据链路层协议感性认识 数据链路层简介 从上图可以看出 , 在TCP/…...
Universal Data Tool 新功能解析:骨骼姿态标注与数据格式转换实战
1. 项目概述:一个数据标注工具的进化最近在整理一个计算机视觉项目的数据集时,我又一次打开了Universal Data Tool(UDT)。这个工具我用了快两年了,从它早期版本支持基础的图像分类和物体检测框标注开始,就一…...
分布式缓存策略:提升应用性能和可扩展性
分布式缓存策略:提升应用性能和可扩展性 一、分布式缓存概述 1.1 分布式缓存的定义 分布式缓存是一种将数据存储在多个节点上的缓存系统,它通过在内存中存储常用数据,减少对后端数据库的访问,从而提高应用性能和可扩展性。 1.…...
开关电源传导共模噪声抑制:Y电容原理、安规限制与EMI滤波器设计
1. 项目概述:理解隔离式开关电源中的传导共模噪声在开发离线式开关电源,比如我们常见的手机充电器、笔记本电脑适配器或者工业电源模块时,工程师们常常会遇到一个既棘手又必须解决的难题:传导电磁干扰(Conducted EMI&a…...
基于Ollama构建本地大模型智能体:从原理到工程实践
1. 项目概述:当本地大模型遇上智能体框架最近在折腾本地大模型应用开发的朋友,估计都绕不开一个核心问题:如何让一个“聪明”的模型,不仅能回答问题,还能像真正的助手一样,自主调用工具、处理复杂任务&…...
(5月最新版)OpenClaw 小龙虾 Windows 一键安装与问题排查
OpenClaw(小龙虾)Windows 11 一键部署教程|2026 新版|零代码・免配置・解压即用 适用系统:Windows 11 专业版 / 家庭版 / 正式版(全版本兼容)当前版本:v2.7.1 下载地址:…...
从HackRF到USRP B210:我的SDR设备升级之路与真实体验对比
从HackRF到USRP B210:我的SDR设备升级之路与真实体验对比 作为一个长期沉迷于软件定义无线电(SDR)技术的爱好者,设备的选择往往决定了探索的边界。从最初的HackRF One到如今的USRP B210,这段升级旅程不仅是对硬件性能的…...
避坑指南:STM32CubeMX配置红外接收,为什么你的解码总是不准?
STM32CubeMX红外接收解码优化实战:从原理到精准解析 红外遥控技术在家电控制、智能设备交互中扮演着重要角色,但许多开发者在STM32平台上实现红外接收解码时,常遇到信号不稳定、误码率高等问题。本文将深入分析红外接收解码的核心原理&#…...
基于大语言模型的网页自动化智能体:Elsa OpenClaw 实战指南
1. 项目概述与核心价值 最近在折腾一些自动化流程,发现很多重复性的网页操作,比如数据抓取、表单填写、状态监控,手动来做不仅耗时,还容易出错。于是我开始寻找一个能真正理解网页结构、像人一样操作浏览器的工具。市面上有不少自…...
云原生本地开发新范式:LDLT方法论与实践指南
1. 项目概述:从“LDLT”看云原生时代的本地开发范式革新如果你是一名云原生应用的开发者,大概率经历过这样的场景:为了调试一个微服务,你需要在本地启动一整套依赖——数据库、消息队列、缓存、甚至其他几个关联服务。你的开发机内…...
绩效考核的量化迷思:如何衡量不可直接测量的技术贡献
一、量化绩效考核的困境:软件测试的“隐形”价值在软件行业的绩效考核体系中,量化指标似乎成了“公平”与“高效”的代名词。代码行数、Bug数量、测试用例覆盖率……这些清晰可统计的数字,被当作衡量技术人员贡献的核心标尺。然而,…...
