当前位置: 首页 > news >正文

【JavaSE】抽象类和接口

【JavaSE】抽象类和接口

    • 前言:补充知识 —— 利用类和对象,交换两个数字
  • 一、抽象类
    • 1.1 抽象类是什么?
    • 1.2 抽象类特点
    • 1.3 抽象类举例
    • 1.4 抽象类作用
  • 二、接口
    • 2.1 接口是什么?
    • 2.2 接口的特性
    • 2.3 接口的使用规则
    • 2.4 类可以实现多个接口
    • 2.5 接口之间的继承
    • 2.6 常用接口举例(Java自带的)
      • 2.6.1 Comparable 接口 和 Comparator 接口(与 比较有关的接口)
      • 2.6.2 Clonable 接口
    • 2.7 ==扩展 —— 深拷贝和浅拷贝==
  • 三、抽象类和接口的区别
  • 四、Object 类
    • 4.1 所有类的对象都可以使用Object的引用进行接收
    • 4.2 toString()方法:用来获取对象信息
    • 4.3 equals()方法:用来判断2个对象是否相等
    • 4.4 hashcode()方法

前言:补充知识 —— 利用类和对象,交换两个数字

class Myvalue{public int val;
}
public class Test {public static void swap(Myvalue myvalue1,Myvalue myvalue2){int tmp = myvalue1.val;myvalue1.val = myvalue2.val;myvalue2.val = tmp;}public static void main(String[] args) {Myvalue myvalue1 = new Myvalue();myvalue1.val = 10;Myvalue myvalue2 = new Myvalue();myvalue2.val = 20;System.out.println("交换前:"+ myvalue1.val + " " + myvalue2.val);swap(myvalue1,myvalue2);System.out.println("交换后:"+ myvalue1.val + " " + myvalue2.val);}
}

一、抽象类

1.1 抽象类是什么?

抽象类定义:如果一个类不能描述一个具体的对象的时候,我们就把它称为对象类。

1.2 抽象类特点

1) 抽象类,一般使用关键字abstract 来修饰

在这里插入图片描述

2 )抽象类,不能通过new关键字来实例化对象

在这里插入图片描述

3 )抽象类中,如果一个方法 没有具体的实现,那么就把这个方法修改为abstract修饰。

在这里插入图片描述

4 )如果一个类有抽象方法,那么该类必须是抽象类;相反,如果一个类是抽象类,那么可以没有抽象方法。

在这里插入图片描述

在这里插入图片描述

5 )如果一个类继承了这个抽象类,那么必须重写这个抽象类当中的抽象方法。

在这里插入图片描述

6) 如果一个类 继承了这个抽象类,但是不想重写抽象类当中的方法,只能把当前这个类也设置为抽象类。 但是需要注意的是,这些抽象方法最终都必须被重写! 只要有其他的普通类继承这些抽象类,都会被重写。

在这里插入图片描述

7 )抽象类和普通类的区别

几乎没区别,抽象类和普通类都可以定义成员变量和构造方法。

(1)抽象类不能实例化,普通类可以实例化。

(2)只是抽象类可以定义抽象方法。

8 ) 抽象方法不能是 private 的,抽象方法不能被final和static修饰,因为抽象方法要被子类重写。

1.3 抽象类举例

画图案

在这里插入图片描述

1.4 抽象类作用

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。

那么我们思考一个问题:如果是这样的话,普通的类也可以被继承 普通的方法也可以被重写, 为什么要用非得用抽象类和抽象方法呢?

确实如此, 但是使用抽象类相当于多了一重编译器的校验。

使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成。
那么此时如果不小心误用成父类了,使用普通类编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题。

二、接口

2.1 接口是什么?

在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。
在这里插入图片描述
如上图所示,电脑的USB口上,可以插:U盘、鼠标、键盘…所有符合USB协议的设备。

通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

2.2 接口的特性

1)接口使用 interface 关键字来定义
在这里插入图片描述
2)接口不能被实例化

在这里插入图片描述

3)接口中定义的成员变量,默认是public static final修饰的,不写的时候也是这样。

在这里插入图片描述

4)接口当中的方法,如果要有具体的实现,只能被 static 或者 default 修饰

在这里插入图片描述

5)接口当中的方法,如果没有具体的实现,那么就写为抽象方法,即 public abstract 修饰的方法,此时这个方法默认就是 public abstract 。

在这里插入图片描述

6)一个类 和 接口的关系:使用 implements 实现,

7)实现该接口以后,就要重写该接口当中的抽象方法

在这里插入图片描述

8)在main方法中调用接口IShape

在这里插入图片描述
输出结果为:

在这里插入图片描述

2.3 接口的使用规则

接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。

请实现笔记本电脑使用USB鼠标、USB键盘的例子

  1. USB接口:包含打开设备、关闭设备功能
  2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
  3. 鼠标类:实现USB接口,并具备点击功能
  4. 键盘类:实现USB接口,并具备输入功能

// USB接口
在这里插入图片描述

// 鼠标类,实现USB接口

在这里插入图片描述

// 键盘类,实现USB接口

在这里插入图片描述

// 笔记本类:使用USB设备
在这里插入图片描述

// 测试类:
在这里插入图片描述

如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

在这里插入图片描述

2.4 类可以实现多个接口

  • Animal 类
    在这里插入图片描述
  • Dog类

在这里插入图片描述

  • Bird类
    在这里插入图片描述

  • IFlyable接口
    在这里插入图片描述 - IRunnable接口在这里插入图片描述

  • ISwimmable接口
    在这里插入图片描述

问题1:能不能把刚刚写的 3个接口 改为类,把这些功能写到类里面?

答:不可以,因为Java只能单继承,不能多继承。(不能继承多个类,但是可以实现多个接口)
所以,接口的出现,可以实现多继承。

问题2:不定义IFlyable接口,在Bird类写fly()方法 与 定义IFlyable接口,Bird类实现接口,重写fly()方法的区别?(接口的好处是什么?)
答:如果有更多的类,不用每个类里单独实现fly()方法,可以实现代码复用。
(以新建的Duck类为例)

  • TestDemo类

在这里插入图片描述
对于接口来说,有几个接口,参数就能换几次
在这里插入图片描述

  • 新建Duck类
    在这里插入图片描述
  • TestDemo类中利用接口,实现多态
    在这里插入图片描述

接口 和 定义方法 的区别:
有了接口之后, 让程序员忘记类型。类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力。

在这里插入图片描述

2.5 接口之间的继承

接口间的继承相当于把多个接口合并在一起。

在这里插入图片描述
在这里插入图片描述

2.6 常用接口举例(Java自带的)

2.6.1 Comparable 接口 和 Comparator 接口(与 比较有关的接口)

  1. 实例 1:比较两个学生的成绩大小

在这里插入图片描述

通过大于号 小于号进行比较的时候,此时不能直接比较引用类型
编译器 要求:给出一个比较大小的规则(可以使用接口)

1)通过 Comparable接口 ,给出比较规则:Comparable 接口是 默认自定义接口

  • Student 类

在这里插入图片描述
在这里插入图片描述

  • 测试类Test

在这里插入图片描述

  • 输出结果

在这里插入图片描述

2)Comparator 接口:需要自己定义比较器,对类的侵入性比较低

但是上面的比较,只能用年龄比较。如果需要按照成绩比较,就不能直接在重写的compareTo方法上更改!
因此我们使用Comparator 接口,自己定义比较器 进行比较

  • Student 类
    在这里插入图片描述在这里插入图片描述

  • AgeComparator 接口
    在这里插入图片描述

  • ScoreComparator 接口
    在这里插入图片描述

  • NameComparator 接口
    在这里插入图片描述

  • 测试类Test
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 输出结果
    在这里插入图片描述

  1. 实例 2:对自定义类型数组,进行排序

(1) 对自定义类型数组,进行排序(利用Comparable 接口)

  • Student 类
    在这里插入图片描述
    在这里插入图片描述

  • Test 测试类

在这里插入图片描述

  • 运行Test,输出结果:
    在这里插入图片描述
  • 注释掉,Comparable接口 和 重写的compareTo方法
    在这里插入图片描述
  • 再次运行Test,报错:类型转换异常

在这里插入图片描述

利用 Arrays.sort(students);对自定义类型进行排序,一定会涉及两个对象之间的比较,需要一些比较规则(比如上述中的 Comparable 接口)
这就是实现这些接口的重要性,尤其是自定义类型一定能比较(利用Comparable接口 或者 自定义比较器 )

(2) 对自定义类型数组,进行排序( 自己实现Arrays.sort() )

  1. 利用 默认的Comparable 接口
  • Student 类
    在这里插入图片描述
    在这里插入图片描述

  • Test 测试类
    在这里插入图片描述
    在这里插入图片描述

  • 运行Test,输出结果:

学生按照年龄排序,谁小,谁在前。

在这里插入图片描述

那我们如果想实现:依然按照年龄排序,但 谁年龄大谁在前呢?

  • 方式1:修改 自定义的bubbleSort() 逻辑,其余的不变

-

输出结果:

在这里插入图片描述

  • 方式2:修改 重写的compareTo() 方法,其余的不变

在这里插入图片描述
输出结果:

在这里插入图片描述

但默认的Comparable 接口只能按照年龄比较大小,如果我们需要按照 分数、 姓名比较大小呢?
那么就需要用到我们之前自定义的Comparator 比较器了(ScoreComparator / NameComparator / )

  • 利用 自定义的Comparator 比较器:按照分数比较
    在这里插入图片描述
    在这里插入图片描述
    输出结果:
    在这里插入图片描述
  1. Arrays.sort()在实现排序的时候,存在优先级

Arrays.sort()在实现排序的时候,存在优先级:
第一优先级,是根据当前类 实现的 comparable接口,进行排序。
但是,一旦传入了想要的比较方式,就按照传入的比较器 进行比较。

  • 同理可得,根据 姓名进行比较大小

在这里插入图片描述

输出结果:

在这里插入图片描述

2.6.2 Clonable 接口

Java 中内置了一些很有用的接口,Clonable 就是其中之一。

Object 类中存在一个 clone 方法,调用这个方法可以创建一个对象的 “拷贝”。
但要想合法调用 clone方法, 必须要 先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。

1.Clonable 接口,实例1

  • Person 类

在这里插入图片描述

  • Test 类 :将person1这个引用 所指的对象,利用clone方法 克隆一份(但报错)
    在这里插入图片描述

  • 之前学到过,所有的类 都默认继承 父类Object
    在这里插入图片描述
    在这里插入图片描述被 protected 修饰:如果是不同包(clone方法在java.lang包,Test类在demo2包下),只能在子类当中访问(可以在Person类和Test类 访问父类的clone方法)。

上面的报错,是因为:

虽然两个类都继承于Object类(java.lang包下),但是克隆的时候,不是在Person (demo包下)中访问,而在Test类(demo包下)通过person1这个引用(是Person类下)在调用,所以无法调用到clone方法。

  • 所以,需要在Person类中重写 clone方法。

在这里插入图片描述

间接访问:Person类中重写 clone方法

在这里插入图片描述

  • 克隆的3个注意事项

    1. protected 关键字:
    2. 向下转型
    3. 必须实现克隆接口

在这里插入图片描述

在这里插入图片描述

2.Clonable 接口,实例 2

  • Person 类

在这里插入图片描述

  • Test 类

在这里插入图片描述

输出结果:

在这里插入图片描述

2.7 扩展 —— 深拷贝和浅拷贝

1. 浅拷贝:Cloneable 拷贝出的对象是一份 “浅拷贝”

  • Person 类:新增加成员变量m

在这里插入图片描述
在这里插入图片描述

  • Test 类中,修改 person2.m.money = 99.5

在这里插入图片描述

发现修改 person2.m.money = 99.5,把 person1.m.money 也变成了 99.5。

结论:
通过clone,我们只是拷贝了Person对象。但是Person对象中的Money对象,并没有拷贝。
通过person2这个引用修改了m的值后,person1这个引用访问m的时候,值也发生了改变。这里就是发生了浅拷贝。

那么如何实现深拷贝呢?

2. 深拷贝

  • Person 类
    在这里插入图片描述
    在这里插入图片描述

  • Test 类

在这里插入图片描述

输出结果:

在这里插入图片描述

3. 深拷贝与浅拷贝 图解

  • 浅拷贝图解

在这里插入图片描述

  • 深拷贝图解

在这里插入图片描述

  • 深拷贝 代码解析:

在这里插入图片描述
在这里插入图片描述

三、抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式.。

区别抽象类接口
(1)结构组成抽象类 + 抽象方法抽象方法 + 全局常量
(2)权限不限public
(3)子类使用使用extends关键字继承抽象类使用implements关键字实现接口
(4)关系一个抽象类可以实现若干个接口接口不能继承抽象类,但是接口可以使用extends关键字继承多个父借口
(5)子类限制一个子类只能继承一个抽象类一个子类可以实现多个接口

具体解析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// 抽象类
abstract class Animal {protected String name;  // 普通字段public static final int LEGS = 4; // 静态常量
}// 接口
interface Runnable {int MAX_SPEED = 100;  // 默认 public static final// String name;       // 错误!不能有普通字段
}

在这里插入图片描述

// 抽象类
abstract class Animal {public void eat() {    // 普通方法System.out.println("Eating...");}public abstract void makeSound(); // 抽象方法
}// 接口(Java8前)
interface Runnable {void run();  // 默认 public abstract// void stop() {}  // 错误!不能有实现
}

在这里插入图片描述

// 抽象类和接口都不能直接实例化
Animal a = new Animal();  // 错误!
Runnable r = new Runnable();  // 错误!// 只能通过子类/实现类实例化
Animal cat = new Cat();    // 假设Cat继承Animal
Runnable rabbit = new Rabbit(); // 假设Rabbit实现Runnable

在这里插入图片描述
在这里插入图片描述
举例:

interface Walkable {default void walk() {  // 默认方法System.out.println("Walking...");}static void printInfo() { // 静态方法System.out.println("Walkable interface");}
}

四、Object 类

Object是Java默认提供的一个类。
Java里面除了Object类,所有的类都是存在继承关系的,默认会继承Object父类。
即所有类的对象都可以使用Object的引用进行接收。

4.1 所有类的对象都可以使用Object的引用进行接收

Object 类,实例1:使用Object接收所有类的对象

class Person{}
class Student{}
public class Test {public static void main(String[] args) {function(new Person());function(new Student());}public static void function(Object obj) {System.out.println(obj);}
}//执行结果:
Person@1b6d3586
Student@4554617c

所以在开发之中,Object类是参数的最高统一类型。
但是Object类也存在有定义好的一些方法。

在这里插入图片描述

4.2 toString()方法:用来获取对象信息

如果要打印对象中的内容,可以直接重写Object类中的toString()方法。

// Object类中的toString()方法实现:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

4.3 equals()方法:用来判断2个对象是否相等

在Java中,进行比较时:( 区别 == 与equals

a.如果“==”左右两侧是基本类型变量,比较的是变量中值是否相同

b.如果“==”左右两侧是引用类型变量,比较的是引用变量地址是否相同

c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
在这里插入图片描述

区别于comparable接口 和 comparator接口:

在这里插入图片描述

4.4 hashcode()方法

  1. 回忆刚刚的toString方法的源码:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

我们看到了hashCode()这个方法,他帮我算了一个具体的对象位置,这里面涉及数据结构,可以说它是个内存地址。然后调用Integer.toHexString()方法,将这个地址以16进制输出。

  1. hashcode方法源码:
public native int hashCode();

该方法是一个native方法,底层是由C/C++代码写的。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例代码,可以发现两个对象的hash值不一样

class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}
}
public class TestDemo4 {public static void main(String[] args) {Person per1 = new Person("zhangsan", 20) ;Person per2 = new Person("zhangsan", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());}
}
//执行结果
460141958
1163157884
  1. 像重写equals方法一样,我们也可以重写hashcode()方法。此时再来看看,哈希值一样
class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;
}
@Override
public int hashCode() {return Objects.hash(name, age);}
}
public class TestDemo4 {public static void main(String[] args) {Person per1 = new Person("gaobo", 20) ;Person per2 = new Person("gaobo", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());}
}
//执行结果
460141958
460141958

结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同。
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。
在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

相关文章:

【JavaSE】抽象类和接口

【JavaSE】抽象类和接口 前言:补充知识 —— 利用类和对象,交换两个数字 一、抽象类1.1 抽象类是什么?1.2 抽象类特点1.3 抽象类举例1.4 抽象类作用 二、接口2.1 接口是什么?2.2 接口的特性2.3 接口的使用规则2.4 类可以实现多个接…...

嵌入式单片机程序的映像文件解读

映像文件类型 单片机下载程序的映像文件是包含了可执行代码、数据等信息,用于将程序烧录到单片机中的文件。常见的映像文件种类如下: 十六进制文件(Hex 文件) 格式特点:Hex 文件是一种文本格式的文件,以 ASCII 字符形式存储数据。它由一系列的记录组成,每条记录包含一个…...

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服务器,并实现远程联机,详细教程

Linux 部署 MineCraft 服务器 详细教程(丐版,无需云服务器) 一、虚拟机 Ubuntu 部署二、下载 Minecraft 服务端三、安装 JRE 21四、安装 MCS manager 面板五、搭建服务器六、本地测试连接七、下载樱花,实现内网穿透,邀…...

STL之string

1.为什么学习string类 1.1 C语言中的字符串 C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且…...

cJSON-轻量级 C 语言 JSON 解析库的使用(一)

文章目录 cJSON:轻量级 C 语言 JSON 解析库的使用前言一、cJSON 简介核心特点: 二、核心数据结构解析三、深入解析 API 设计1. 解析 JSON2. 访问数据3. 构建 JSON 四、内存管理策略五、高级应用技巧1. 引用系统2. 批量操作3. 原地修改 六、性能优化技巧1…...

用Python和Stable Diffusion生成AI动画:从图像到视频的全流程指南

引言 本文将演示如何通过Python代码实现基于文本提示的AI动画生成。我们将使用Stable Diffusion生成连贯图像帧,结合OpenCV合成视频,最终实现一个可自定义的动画生成 pipeline。 一、环境准备 1. 依赖安装 # 安装核心库 pip install diffusers transformers torch numpy …...

C++ 继承:面向对象编程的核心概念(二)

文章目录 5. 继承与友元6. 继承与静态成员7. 多继承及其菱形继承问题7.1 不同的继承方式7.2 虚继承 8. 继承和组合9. 总结 书接上回:C 继承:面向对象编程的核心概念(一) 5. 继承与友元 友元关系不能继承,也就是说基类友元不能访问…...

Chaos Mesh 混沌工程平台介绍、安装及使用指南

Chaos Mesh 混沌工程平台介绍、安装及使用指南 一、Chaos Mesh 简介 Chaos Mesh 是 PingCAP 开源的云原生混沌工程平台,支持在 Kubernetes 环境中模拟各种故障场景,帮助提升系统的容错性和可恢复性。 核心特性 丰富的故障类型: 资源类&…...

每天五分钟深度学习框架PyTorch:梯度裁剪解决RNN梯度爆炸的问题

本文重点 在循环神经网络训练的过程中,有时候很容易出现梯度爆炸的情况,如果出现这种问题,我们应该怎么办?本文先来分析一下为什么会出现这种情况,然后我们在给出解决方案 梯度爆炸的原因 我们从RNN训练的反向传播算法入手,当我们使用BPTT算法训练RNN的时候,它的公式…...

批量删除 PDF 中的所有图片、所有二维码图片以及指定的某张图片

PDF 文档中我们可以插入图片、文字等多种类型的资源。在某些场景下,可能我们需要删除 PDF 文档中的图片,有可能是需要删除所有的图片,也有可能是删除固定的某些图片。那碰到这种情况,我们应该怎么处理呢?今天就给大家介…...

力扣HOT100之普通数组:53. 最大子数组和

这道题目我用贪心做的,感觉用贪心的思路比较简单,以后要是面试碰到这道题就直接用贪心好了,这道题用贪心的核心思想就是不断将数组元素i加入总和sum,如果sum比当前维护的最大值result更大,说明当前遍历到的i是正数&…...

【Qt】C++前向声明与Qt信号与槽的区别

相同点:二者都可以解决头文件相互包含的问题 一、C 前向声明 概念:前向声明是在代码里仅仅声明一个类、函数或者变量,而不给出其完整定义。例如class MyClass; 就是对 MyClass 类的前向声明。 作用:主要是为了降低编译依赖&…...

SQL-木马植入、报错注入及其他

一、读写权限确认 show global variables like %secure%; 查看mysql全局变量的配置,当输入以上命令时,结果 secure_file_priv 空的时候,任意读写 secure_file_priv 某个路径的时候,只能在规定的那个路径下读写 secure_file_pri…...

基于 PHP 内置类及函数的免杀 WebShell

前言 PHP 作为广泛使用的服务端语言,其灵活的内置类(如 DOMDocument)和文件操作机制(.ini、.inc 的自动加载),为攻击者提供了天然的隐蔽通道。通过 动态函数拼接、反射调用、加密混淆 和 伪命名空间 等手法…...

主键id设计

主键自增id 🌱 1. 自增 ID(Auto Increment ID) ✅ 特点: • 数据库自带(MySQL, PostgreSQL 都支持) • 简单易用,可读性强 • 一般作为主键自带聚簇索引(主键就是物理存储顺序&…...

文件上传绕过的小点总结(6)

14.文件上传(文件包含漏洞)二次渲染 很多服务器为了防止代码嵌入图片,通常会将上传的图片进行重新生成处理,包括文件格式转换等等,嵌入的恶意代码很容易被改掉。于是产生了二次渲染,二次渲染的原理就是找到…...

传统应用容器化迁移实践

背景介绍:从传统部署到容器化迁移的必要性 在过去的运维工作中,某企业一直依赖于传统的物理机和虚拟机部署方式。然而,随着业务的快速发展和应用规模的不断扩大,传统部署方式的局限性逐渐显现: 资源利用率低&#xf…...

混境之地1

问题描述 小蓝有一天误入了一个混境之地。 好消息是:他误打误撞拿到了一张地图,并从中获取到以下信息: 混境之地的大小为 n⋅mn⋅m,其中 # 表示这个位置很危险,无法通行,. 表示道路,可以通行。他…...

LLM 加速技术有哪些

LLM 加速技术有哪些 目录 LLM 加速技术有哪些量化(Quantization)基本原理举例剪枝(Pruning)基本原理举例动态Shape(Dynamic Shape)基本原理举例算子融合(Operator Fusion)基本原理举例量化(Quantization) 基本原理 量化是指将模型中连续取值(如32位浮点数)的参数…...

CPP从入门到入土之类和对象Ⅲ

拷贝构造函数 拷贝构造函数是一个已经存在的对象去初始化一个新的对象时,调用的函数 例如: 假设我有一个盒子,里面装了一个苹果 拷贝构造函数的特点 拷贝构造函数是构造函数的一个重载拷贝构造函数的第一个参数必须是类类型对象的引用,例如…...

安全上网沙箱:多方面解决政企私的上网问题

在数字化的浪潮中,网络已成为我们工作与生活不可或缺的一部分。然而,网络的便捷也伴随着诸多安全隐患,尤其是对于企业、个人以及政企机构而言,安全上外网成为了至关重要的课题。 隔离保护:构建安全堡垒 沙箱技术在内网…...

空转 | GetAssayData doesn‘t work for multiple layers in v5 assay.

问题分析 当我分析多个样本的时候,而我的seurat又是v5时,通常就会出现这样的报错。 错误的原因有两个: 一个是参数名有slot变成layer 一个是GetAssayData 不是自动合并多个layers,而是选择保留。 那么如果我们想合并多个样本&…...

26、web前端开发之CSS3(三)

5. 文本(Text) CSS3大大增强了对文本样式和排版的控制,使得网页设计更加灵活和多样化。本讲详细介绍CSS3中常用的文本相关属性,包括文本对齐、字体大小、行高、字母间距、单词拆分、溢出隐藏等,帮助开发者更好地控制和…...

第 8 章:使用更好的库_《C++性能优化指南》_notes

使用更好的库 第八章核心知识点解析编译与测试建议总结优化原则重点内容:第一部分:多选题(10题)第二部分:设计题答案与解析多选题答案:设计题答案示例(部分): 测试用例设…...

【面试八股】:常见的锁策略

常见的锁策略 synchronized (标准库的锁不够你用了)锁策略和 Java 不强相关,其他语言涉及到锁,也有这样的锁策略。 1. 悲观锁,乐观锁(描述的加锁时遇到的场景) 悲观锁:预测接下来…...

Apache Iceberg 解析,一文了解Iceberg定义、应用及未来发展

什么是 Iceberg? Apache Iceberg 是一种开源的 表格式(Table Format) ,专为超大规模数据分析场景设计,通过标准化数据存储规范与访问协议,解决了传统数据湖在元数据管理、事务控制、查询性能等方面的核心痛…...

Ubuntu 优化启动时间优化

优化 Ubuntu 20.04 的启动时间可以从多个方面入手,以下是详细的步骤和建议: 一、分析启动耗时 首先检查系统启动各阶段的耗时: systemd-analyze time # 查看整体启动时间 systemd-analyze blame # 列出各服务/进程的启动耗时 …...

【Git 常用指令速查表】

Git 常用指令速查表 Git 常用指令速查表目录1. 初始化仓库2. 提交代码流程3. 分支管理4. 远程仓库操作5. 撤销操作6. 查看状态与日志7. 其他实用指令完整操作示例常用场景速查表 Git 常用指令速查表 目录 初始化仓库提交代码流程分支管理远程仓库操作撤销操作查看状态与日志其…...

Linux实用操作及命令

一、各类小技巧(快捷键) 1、强制停止(ctrlc) Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrl c 命令输入错误,也可以通过快捷键ctrl c,退出当前输入,重…...

洛谷 P10516 数据结构 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​) 和 b ( b 1 , b 2 , ⋯ , b n ) b(b_1,b_2,\cdots,b_n) b(b1​,b2​,⋯,bn​),有 m m m 个操作分三种: add ⁡ ( l , r , k , t ) \operatorname{ad…...

在IDEA中使用TortoiseSVN

一、前言 原版SVN由于下载路径中没有svn.exe文件,导致IDEA中无法使用命令行提交项目代码,因此,现在卸载旧版本TortoiseSVN,下载附有svn.exe的新版TortoiseSVN,下载使用过程记录如下 二、下载过程 卸载就在 控制面板…...

基于 ffmpeg 实现合并视频

ffmpeg是一个强大的多媒体处理工具,支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…...

如何在 HTML 中嵌入外部字体,有哪些注意事项?

大白话如何在 HTML 中嵌入外部字体,有哪些注意事项? 在 HTML 里嵌入外部字体,能让网页文字更有个性,瞬间提升页面的吸引力。下面就来详细说说怎么嵌入外部字体,以及其中的注意事项。 嵌入外部字体的方法 1. 使用 fo…...

三极管原理及应用

一、结构 基极(Base,符号:B) 基极是三极管的控制端,用于输入控制信号。通过基极电流的大小,可以控制集电极与发射极之间的电流导通程度,实现电流放大或开关功能。 发射极(Emitter&…...

三个串口同时打开并指定数据包控制指令思想

可以对嵌入式串口数据包指令设置做一次总结: 首先确定你的数据包大小,传统的接收串口数据到数组存储会出现需要循环遍历数组去读取数据的弊端,所以我设计了一个机制,只有当你想要读取外界指令时,才开始读取外界发过来…...

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…...

MQL5教程 04 脚本开发实战、指标开发基础

文章目录 一、脚本开发实战1、给脚本设置快捷键2、运行时显示输入参数界面3、开市价单4、一键平仓5、修改止盈止损6、一键删除当前图表所有挂单 二、指标开发基础 一、脚本开发实战 1、给脚本设置快捷键 在MT5导航栏中&#xff0c;选定脚本&#xff0c;鼠标右击 → 设置热键 …...

【Qt】Ubuntu22.04使用命令安装Qt5和Qt6

1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…...

海康设备http监听接收报警事件数据

http监听接收报警事件数据 海康获取设备报警事件数据两种方式&#xff1a; 1、sdk 布防监听报警事件数据&#xff08;前面文章有示例&#xff09; 2、http监听接收报警事件数据 http监听接收报警事件数据&#xff0c;服务端可以使用netty通过端口来监听获取事件数据。 WEB 端…...

【MVCC快照如何实现】

MVCC(多版本并发控制)快照的实现原理 MVCC(Multi-Version Concurrency Control)是现代数据库实现事务隔离级别的核心技术&#xff0c;它通过数据多版本和快照机制来实现高效的并发控制。下面我将详细解析MVCC快照的实现机制。 一、MVCC核心组件 1. 版本链结构 MVCC通过以下…...

STM32中不同FLASH的芯片启动文件选择规则

F103ZET6的FLASH大小是512K&#xff0c;所以选择startup_stm32f10x_hd.s F103C8T6的FLASH大小是64K&#xff0c;所以选择startup_stm32f10x_md.s 移植需要注意的事项&#xff1a; 从ZET6到C8T6&#xff0c;需要更改 1&#xff09;启动文件 2&#xff09;C/C选项卡...

树莓集团商业模式解析:树莓集团是国企吗?

树莓集团作为中国市场的重要企业实体&#xff0c;其所有制性质一直受到业界关注。从公开资料显示&#xff0c;树莓集团并非传统意义上的国有企业&#xff0c;而是一家具有混合所有制特征的现代化企业集团。其股权结构中既包含国有资本成分&#xff0c;也吸纳了社会资本和民营投…...

mock.js模拟数据

MOCK模拟后端数据 1.按照mock.js npm install mockjs2.在src目录下建立mock目录&#xff0c;在该目录下建立index.js文件&#xff0c;该文件中写上你所需要的数据&#xff0c;示例如下&#xff1a; import Mock from mockjs let data Mock.mock("/data/person",&…...

如何自动规整化(格式化)HTML

如果你想要自动规整化&#xff08;格式化&#xff09;HTML&#xff0c;可以使用以下方法&#xff1a; 方法 1&#xff1a;使用 VS Code 进行 HTML 格式化&#xff08;推荐&#xff09; 步骤 安装 Visual Studio Code打开你的 HTML 文件按下 Shift Alt F&#xff08;Windows…...

MySQL数据库入门

目录 前言 一、安装软件 二、普通指令使用 三、MySQL接口API相关函数 1、API函数使用步骤 2、mysql_init-MYSQL对象初始化 3、mysql_real_connect()——数据库引擎建立连接 4、mysql_close()——关闭数据库连接 5、mysql_query()——查询数据库某表内容 6、mysql_stor…...

SpringBoot集成Couchbase开发与实践

1 前言 1.1 什么是Couchbase Couchbase 是一个高性能的 NoSQL 数据库,支持文档存储、内存缓存和分布式计算。它结合了内存数据库的速度和灵活性与传统数据库的持久性和查询能力。 1.2 Couchbase的特点与优势 高性能:利用内存缓存加速数据访问。可扩展性:支持水平扩展,能…...

一周掌握Flutter开发--8. 调试与性能优化(上)

文章目录 8. 调试与性能优化核心技能8.1 使用 Flutter DevTools 分析性能8.2 检查 Widget 重绘&#xff08;debugPaintSizeEnabled&#xff09;8.3 解决 ListView 卡顿&#xff08;ListView.builder itemExtent&#xff09; 其他性能优化技巧8.4 减少 build 方法的调用8.5 使用…...

动态路由机制MoE专家库架构在多医疗AI专家协同会诊中的应用探析

随着医疗人工智能技术的飞速进步,AI在医学领域的应用日益增多,尤其是在复杂疾病的诊断和治疗中,AI技术的应用带来了巨大的潜力。特别是动态路由机制混合专家(Mixture of Experts,MoE)架构,因其灵活、高效的特点,正逐渐成为实现多AI专家协同会诊的关键技术。通过将多个不…...

Linux上位机开发实践(开源框架和开源算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做嵌入式软件开发&#xff0c;如果软件本身比较简单&#xff0c;只是图形界面显示&#xff0c;那么相关的开发工作并不难。最主要的内容也就是数据…...

算法时间复杂度分析

1. 基本概念 大 O 符号 O(f(n)) 表示算法的最坏情况复杂度&#xff0c;即算法在最不利情况下所需的基本操作数不会超过 O(f(n))的级别。例如&#xff0c;表示当输入规模 n 增大时&#xff0c;算法运行时间上界是某个常数乘以 。 Ω 符号 Ω(f(n)) 表示算法的下界&#xff0c;即…...