java的一些冷知识

news2024/9/29 15:41:30

接口并没有继承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;
            }
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java EE|TCP/IP协议栈之网络层IP协议详解

文章目录一、IP协议感性认知简介特点二、IP协议报头结构4位版本4位首部长度8位服务类型16位总长度16位标识8位生存时间&#xff08;TTL&#xff09;8位协议16位首部长度32位源ip&32位目的地址三、网络地址管理网段划分路由选择参考一、IP协议感性认知 简介 P是整个TCP/IP…

【云原生】k8s的pod基本概念

一、资源限制 Pod 是 kubernetes 中最小的资源管理组件&#xff0c;Pod 也是最小化运行容器化应用的资源对象。一个 Pod 代表着集群中运行的一个进程。kubernetes 中其他大多数组件都是围绕着 Pod 来进行支撑和扩展 Pod 功能的&#xff0c;例如用于管理 Pod 运行的 StatefulSe…

小说网站测试

目录 通用测试点 登录页面测试 接口测试 UI测试 注册页面 接口自动化 UI测试 忘记密码页面 接口测试 UI测试 修改密码页面 进行接口测试 UI测试 主页页面测试 分类页面测试 ​查询页面测试 作者页面测试 阅读小说页面测试 书架页面测试 通用测试点 登录页面测试 接…

k8s-资源限制-探针检查

文章目录一、资源限制1、资源限制的使用2、reuqest资源&#xff08;请求&#xff09;和limit资源&#xff08;约束&#xff09;3、Pod和容器的资源请求和限制4、官方文档示例5、资源限制实操5.1 编写yaml资源配置清单5.2 释放内存&#xff08;node节点&#xff0c;以node01为例…

计算机网络题库---错题本

&#xff08;一&#xff09;老生常谈 第一章&#xff1a; 1.什么是计算机网络&#xff1f;其主要功能是什么&#xff1f; 解答&#xff1a; 利用通信设备和线路&#xff0c;将分布在地理位置不同的、功能独立的多个计算机系统连接起来&#xff0c;以功能完善的网络软件实现网…

ChatGPT 开发人员教程 - 38种提高工作效率10倍的方法

未来的时代&#xff0c;又将是一个“洋枪洋炮”对“大刀长矛”的时代。在过去的十年里&#xff0c;传统行业在和经过IT改造的行业竞争时&#xff0c;无一例外地败北。08年金融危机前&#xff0c;全世界市值前十的公司&#xff0c;只有微软一家是IT企业。仅仅过去了十年&#xf…

文献阅读:Training language models to follow instructions with human feedback

文献阅读&#xff1a;Training language models to follow instructions with human feedback 1. 文献工作简介2. 模型优化设计3. 实验结果4. 总结 & 思考 文献链接&#xff1a;https://arxiv.org/abs/2203.02155 1. 文献工作简介 这篇文章是OpenAI在上年提出的一篇对于…

Go项目(商品微服务-1)

文章目录简介建表protohandler商品小结简介 商品微服务主要在于表的设计&#xff0c;建哪些表&#xff1f;表之间的关系是怎样的&#xff1f; 主要代码就是 CURD表和字段的设计是一个比较有挑战性的工作&#xff0c;比较难说清楚&#xff0c;也需要经验的积累&#xff0c;这里…

【Linux】工具(2)——vim

本期博客我们进入到Linux环境下vim工具的学习&#xff1a;一、vim是什么&#x1f4cc;Vim是一个超级超级强大的文本编辑器。Vim及前身VI&#xff0c;历史悠久&#xff08;可能比多数读者的年龄更大&#xff09;&#xff0c;经历了几十年的考验和发展。Vim全称叫Vi IMproved. 而…

Linux安装云原生网关Kong/KongA

目录1 概述2 创建服务器3 安装postgres4 安装kong5 安装node6 安装KONGA1 概述 Kong Kong是一款基于OpenResty&#xff08;NginxLua模块&#xff09;编写的高可用、易扩展的开源API网关&#xff0c;专为云原生和云混合架构而建&#xff0c;并针对微服务和分布式架构进行了特别…

蓝桥杯算法模板

模拟散列表拉链法import java.io.*; import java.util.*; public class a1 {static int n;static int N100003;static int[] hnew int[N];static int[] enew int[N];static int[] nenew int[N]; static int idx; static void insert(int x){int k(x%NN)%N;e[idx]x;ne[idx]h[k];…

终端软件架构说

目录 零&#xff1a;前言 一&#xff0c;基于服务的架构 二&#xff0c;基于多进程多线程的架构 三&#xff0c;以数据为中心的架构 四&#xff0c;类Android的分层架构设计 五&#xff0c;总结 零&#xff1a;前言 谈到架构&#xff0c;可能大家的第一感觉是信息系统的…

2023年三月份图形化三级打卡试题

活动时间 从2023年3月1日至3月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

Vue 3第三章:模板语法及指令介绍

文章目录1. 插值表达式1.1. 声明变量可直接在模板中使用&#xff0c;采用{{变量名称}}的方式1.2. 模板语法支持三元表达式1.3. 模板语法支持运算1.4. 模板语法支持方法调用2. 指令2.1. v-bind&#xff1a;用于绑定属性或动态绑定对象的值到元素上。2.2. v-if、v-else-if、v-els…

C#学习记录——接口的实现

一小部分知识精英依旧直面核心困难&#xff0c;努力地进行深度钻研&#xff0c;生产内容&#xff1b;而大多数信息受众始终在享受轻度学习&#xff0c;消费内容。如果我们真的希望在时代潮流中占据一席之地&#xff0c;那就应该尽早抛弃轻松学习的幻想&#xff0c;锤炼深度学习…

Burp Suite 常用模块简介

Burp Suite 常用模块分为 目标站点(target)模块 代理(proxy)模块 攻击(Intruder)模块 重放(Repeater) 模块 Target模块是对站点资源的收集&#xff0c;与站点各资源包发出和相应包的记录 Proxy模块是核心模块&#xff0c;可以拦截数据包发送往浏览器&#xff0c;进行修改后再…

网络协议分析(2)判断两个ip数据包是不是同一个数据包分片

一个节点收到两个IP包的首部如下&#xff1a;&#xff08;1&#xff09;45 00 05 dc 18 56 20 00 40 01 bb 12 c0 a8 00 01 c0 a8 00 67&#xff08;2&#xff09;45 00 00 15 18 56 00 b9 49 01 e0 20 c0 a8 00 01 c0 a8 00 67分析并判断这两个IP包是不是同一个数据报的分片&a…

Android JetPack之启动优化StartUp初始化组件的详解和使用

一、背景 先看一下Android系统架构图 在Android设备中&#xff0c;设备先通电&#xff08;PowerManager&#xff09;&#xff0c;然后加载内核层&#xff0c;内核走完&#xff0c;开始检查硬件&#xff0c;以及为硬件提供的公开接口&#xff0c;然后进入到库的加载。库挂载后开…

Winform控件开发(16)——Timer(史上最全)

前言: Timer控件的作用是按用户定义的时间间隔引发事件的计时器,说的直白点就是,他就像一个定时炸弹一样到了一定时间就爆炸一次,区别在于定时炸弹炸完了就不会再次爆炸了,但是Timer这个计时器到了下一个固定时间还会触发一次,上面那张图片就是一个典型的计时器,该定时器…

【Java】Spring Boot 配置文件

文章目录SpringBoot 配置文件1. 配置文件的作用2. 配置文件的格式3. properties配置文件说明3.1 properties基本语法3.2 读取配置文件3.3 properties缺点分析4. yml配置文件说明4.1 yml基本语法4.2 yml使用进阶4.2.1 yml配置不同的数据类型及null4.2.1 yml配置的读取4.2.2 配置…