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

图灵日记之java奇妙历险记--抽象类和接口

目录

  • 抽象类
    • 概念
    • 抽象类语法
  • 接口
    • 概念
    • 规则
    • 使用
    • 特性
    • 实现多个接口
    • 接口的继承
    • 接口使用实例
    • Clonable接口和深拷贝
    • 抽象类和接口的区别
  • Object类

抽象类

概念

在面向对象的概念中,所有对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息描绘一个具体的对象,这样的类就是抽象类

  1. 使用abstract修饰的方法称为抽象方法
  2. 使用abstract修饰的类称为抽象类
  3. 抽象类是不可以进行实例化的
  4. 抽象类当中可以和普通类一样定义成员变量和成员方法
  5. 当一个普通的类继承了这个抽象类,那么需要重写这个抽象类当中的所有抽象方法
  6. 抽象类的出现就是为了被继承
  7. abstract和final不能共存
  8. 被private static修饰抽象方法也不可以

抽象类语法

在java中,一个类如果被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的实现体
注意:抽象类也是类,内部也可以包含普通方法和属性,甚至构造方法

接口

概念

接口是公共的行为规范标准,大家在实现时,只要符合规范标准
就可以调用
在java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

规则

  1. 接口是使用interface方法修饰的
  2. 接口当中不能有被实现的方法,意味着只能有抽象方法.但是两个方法除外:一个是static修饰的方法 一个是被default修饰的方法
  3. 接口当作的抽象方法默认都是public abstract修饰的
    什么都不写的时候默认abstract修饰
  4. 接口当中的成员变量默认都是public static final 修饰的
  5. 接口不能进行实例化
  6. 类和接口之间的关系,可以使用implements来进行关联
  7. 接口也是有对应的字节码文件的

接口定义格式与定义类的格式基本相同,将class关键字换成interface关键字,就定义了一个接口

interface 接口名称 {}

使用

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

class 类名称 implements 接口名称{// ...
}

注意:子类和父类之间是extends继承关系,类和接口之间是implements实现关系

特性

  1. 接口类型是一种引用类型,但是不能直接new接口的对象,无法实例化
  2. 接口的每个方法都是public修饰的抽象方法,即接口中的方法被隐式的指定为public abstract(只能是public abstract, 其他修饰符都会报错)
  3. 接口的方法是不能在接口实现的,只能由实现接口的类来实现
    但在接口的方法里非要实现需要static或者default修饰
    static修饰的方法不能重写
    default修饰方法可重写可不重写
  4. 重写接口方法时,不能使用默认的访问权限
    因为接口方法里默认就是public abstract,又因为子类的访问权限大于等于父类,子类只能被public修饰
  5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final 变量
  6. 接口不能有代码块(实例代码块和静态代码块)和构造方法
  7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是class
  8. 如果类没有实现接口中的所有的抽象方法,则类必须被设置为抽象

实现多个接口

接口解决java多继承的问题

abstract class Animal{public String name;Animal(String name) {this.name = name;}abstract public void eat();abstract public void swim();
}

动物里并不是所有的动物都可以游泳,所以把swim写在Animal这个类里面不好,但是如果你把swim写到一个类就行了嘛?但是java不支持同时继承多个类,所以写进类里也不行,所以我们把他封装成了接口

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类
必须设置为抽象类

接口的继承

在java中,类和类之间是单继承的,一个类可以实现多个接口,接口和接口之间可以多继承.即用接口可以达到多继承的目的

interface walk {public void walk();
}
interface run extends walk {public void run();
}

run接口有walk接口的特性,可以使用extends关键字来实现复用的效果,extends理解为拓展的意思,即run拓展了walk的功能
run接口不仅具备run接口本身的功能,而且具备walk这个接口的功能

interface A {public void a();
}
interface B extends A{public void a();
}
class test implements B{@Overridepublic void a() {}
}

接口B和接口A有一样的方法,当接口B拓展接口A时,类test获得B接口,要实现a这个方法
在这里插入图片描述
实现的是接口B的方法a

两个关系:

  1. 类和接口之间的关系–>>implements实现
  2. 接口和接口之间的关系–>>extends拓展

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

接口使用实例

    public static void main(String[] args) {int a = 10;int b = 20;System.out.println(a>b);}

在这里插入图片描述

public class Test {public static void main(String[] args) {Person person01 = new Person();Person person02 = new Person();System.out.println(person01>person02);}
}class Person {public String name;public int age;public int height;
}

引用类型比较就不可以了,因为比较两个引用类型没有意义,但是你想比较引用类型里的成员变量的话,他也不知道是哪一个

public class Test {public static void main(String[] args) {Person person01 = new Person();Person person02 = new Person();System.out.println(person01.compareTo(person02));}
}class Person implements Comparable<Person>{public String name;public int age;public int height;@Overridepublic int compareTo(Person o) {if(this.age>o.age) {return 1;} else if(this.age==o.age) {return 0;}else {return -1;}}
}

后续文章会讲,此处仅供参考

但是如果用如上代码,在比较身高等其他值的时候就不方便

public class Test {public static void main(String[] args) {Person person01 = new Person("张三",1,1);Person person02 = new Person("李四",2,2);System.out.println(new AgeCompare().compare(person01, person02));}
}class AgeCompare implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {return o1.age-o2.age;}
}class Person{public String name;public int age;public int height;public Person(String name, int age, int height) {this.name = name;this.age = age;this.height = height;}
}

比较器来进行年龄比较,之后同样的方法比较身高等

第一种方式比较对类的侵入性比较强,一旦写好了规定的比较方式,之后只能使用这种方式来进行比较
第二种方式就会比较灵活,单独创建一个类实现比较方法,调用方法时,传入要比较的两个对象即可


public class Test {public static void main(String[] args) {Person[] people = new Person[3];people[0] = new Person(111,"a");people[1] = new Person(101,"b");people[2] = new Person(121,"c");System.out.println(Arrays.toString(people));System.out.println("===========================");Arrays.sort(people);System.out.println("===========================");System.out.println(Arrays.toString(people));}
}class Person {@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}int age;String name;Person(int age, String name) {this.age = age;this.name = name;}
}

同理,对自定义类型的数组排序此处也会报错
在这里插入图片描述
Array.sort的源代码追根溯源发现比较是依托compareTo来实现比较的,所以我们可以在类里自己实现compareTo方法


public class Test {public static void main(String[] args) {Person[] people = new Person[3];people[0] = new Person(111,"a");people[1] = new Person(101,"b");people[2] = new Person(121,"c");System.out.println(Arrays.toString(people));System.out.println("===========================");Arrays.sort(people);System.out.println("===========================");System.out.println(Arrays.toString(people));}
}class Person implements Comparable<Person>{@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}int age;String name;Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic int compareTo(Person o) {return this.age-o.age;}
}

在这里插入图片描述
sort方法的重载中还可以传入比较器


public class Test {public static void main(String[] args) {Person[] people = new Person[3];people[0] = new Person(111,"a");people[1] = new Person(101,"b");people[2] = new Person(121,"c");System.out.println(Arrays.toString(people));
//        Arrays.sort(people);AgeCompare ageCompare = new AgeCompare();Arrays.sort(people,ageCompare);System.out.println("===========================");System.out.println(Arrays.toString(people));}
}
//名字比较器
class NameCompare implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {return o2.name.compareTo(o1.name);}
}
//年龄比较器
class AgeCompare implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {return o2.age-o1.age;}
}class Person implements Comparable<Person>{@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}int age;String name;Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic int compareTo(Person o) {return this.name.compareTo(o.name);}
}

也可以自己实现排序方法来进行比较,如下

public class Test {public static void bubbleSort(Comparable[] comparables) {for (int i = 0; i < comparables.length-1; i++) {for (int j = 0; j < comparables.length-i-1; j++) {if(comparables[j].compareTo(comparables[j+1])>0) {Comparable tem = comparables[j];comparables[j] = comparables[j+1];comparables[j+1] = tem;}}}}public static void main(String[] args) {Person[] people = new Person[3];people[0] = new Person(111,"a");people[1] = new Person(101,"b");people[2] = new Person(121,"c");System.out.println(Arrays.toString(people));bubbleSort(people);System.out.println(Arrays.toString(people));}
}class Person implements Comparable<Person>{@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}int age;String name;Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic int compareTo(Person o) {return this.age-o.age;}
}

Clonable接口和深拷贝


public class Test {public static void main(String[] args) {Animal animal = new Animal("张三",10);Animal animal1 = animal.clone();}
}class Animal {String name;int height;@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", height=" + height +'}';}public Animal(String name, int height) {this.name = name;this.height = height;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

在这里插入图片描述
创建了一个Animal类,实例化对象animal,想利用clone克隆animal到animal1,但是发生报错
在这里插入图片描述
可能会抛出异常,这个异常叫作不支持克隆异常
编译时期的异常

处理这种异常,对main函数也申请如上操作
在这里插入图片描述
发现依旧报错

在这里插入图片描述
观察clone方法里返回值是Object,但是main方法里animal1是Animal类,类型不匹配,需要强转一下
对main方法如下处理解决刚才的异常问题


public class Test {public static void main(String[] args) throws CloneNotSupportedException{Animal animal = new Animal("张三",10);Animal animal1 = (Animal)animal.clone();}
}

按照剧本来走的话
在这里插入图片描述
animal1克隆animal,一切祥和

public class Test {public static void main(String[] args) throws CloneNotSupportedException{Animal animal = new Animal("张三",10);Animal animal1 = (Animal)animal.clone();System.out.println(animal);System.out.println(animal1);}
}

运行起来却又报错
在这里插入图片描述
我们要想对自己写的类型进行克隆的时候,要实现Clonable 接口
在这里插入图片描述
在这里插入图片描述
运行成功,但是当我们点进Clonable 接口去看源代码的时候
在这里插入图片描述
就会发现这个接口是空的,所以我们实现这个接口的意义在哪里
刚才这种接口我们叫作空接口或者标记接口
他的作用在于类实现了Clonable 接口这种空接口,代表这个类是可以被克隆的


public class Test {public static void main(String[] args) throws CloneNotSupportedException{Stu stu = new Stu("张三",1);Stu stu1 = (Stu)stu.clone();System.out.println(stu.index.i);System.out.println(stu1.index.i);stu1.index.i = 0;System.out.println(stu.index.i);System.out.println(stu1.index.i);}
}class Index {public int i = 1;
}class Stu implements Cloneable{public String name;public int weight;Index index = new Index();public Stu(String name, int weight) {this.name = name;this.weight = weight;}@Overridepublic String toString() {return "Stu{" +"name='" + name + '\'' +", weight=" + weight +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

在这里插入图片描述
修改stu1里通过引用修改对象index里的成员变量i,但是stu里index的i值也改变
在这里插入图片描述
stu1克隆stu,stu和stu1两者共用同一个引用,而非另外开辟空间,所以当你通过引用改变stu1里index的i值时,也时改变stu里面index的i值,这种是浅拷贝,要实现stu里index和stu1里的index的引用不同,要进行深拷贝,Index也要支持克隆

在这里插入图片描述

如上,让Index也支持克隆,但这样仅仅是支持克隆,但是并未让Stu类里的克隆方法里进行实现对index的克隆,如下
在这里插入图片描述
这样就之后,改变stu1里index的i值就不会影响stu的了
在这里插入图片描述


public class Test {public static void main(String[] args) throws CloneNotSupportedException{Stu stu = new Stu("张三",1);Stu stu1 = (Stu)stu.clone();System.out.println(stu.index.i);System.out.println(stu1.index.i);stu1.index.i = 0;System.out.println(stu.index.i);System.out.println(stu1.index.i);}
}class Index implements Cloneable{public int i = 1;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Stu implements Cloneable{public String name;public int weight;Index index = new Index();public Stu(String name, int weight) {this.name = name;this.weight = weight;}@Overridepublic String toString() {return "Stu{" +"name='" + name + '\'' +", weight=" + weight +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {Stu tmp = (Stu) super.clone();tmp.index = (Index) this.index.clone();return tmp;}
}

抽象类和接口的区别

**核心区别:**抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不需要重写),而接口中不能包含普通方法,子类必须重写所有的抽象方法

在这里插入图片描述

Object类

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

public class Test {public static void main(String[] args){Animal animal = new Animal("张三");Animal animal1 = new Animal("张三");System.out.println(animal1 == animal);}
}class Animal {String name;public Animal(String name) {this.name = name;}
}

如上比较两个对象是否相等,这种比较是比较引用,所以会打印false
Object里equals方法用来比较对象是否相等
在这里插入图片描述

public class Test {public static void main(String[] args){Animal animal = new Animal("张三");Animal animal1 = new Animal("张三");System.out.println(animal.equals(animal1));}}

在这里插入图片描述
结果仍是false

在这里插入图片描述
源码和第一次比较方式是一样的,在对引用进行比较相等,所以我们在Animal类里重写这个方法,自己来设计比较方法

class Animal {String name;public Animal(String name) {this.name = name;}@Overridepublic boolean equals(Object obj) {Animal animal = (Animal) obj;return animal.name.equals(this.name);}
}
public class Test {public static void main(String[] args){Animal animal = new Animal("张三");Animal animal1 = new Animal("张三");System.out.println(animal.equals(animal1));}}

在这里插入图片描述

相关文章:

图灵日记之java奇妙历险记--抽象类和接口

目录 抽象类概念抽象类语法 接口概念规则使用特性实现多个接口接口的继承接口使用实例Clonable接口和深拷贝抽象类和接口的区别 Object类 抽象类 概念 在面向对象的概念中,所有对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够…...

批量给元素添加进场动画;获取文本光标位置;项目国际化

批量给元素添加进场动画 api及参数参考&#xff1a;https://juejin.cn/post/7310977323484971071 简单实现&#xff1a; addAnimationClass(){//交叉观察器if (window?.IntersectionObserver) {//获取所有需要添加进场动画的元素&#xff0c;放到一个数组let items [...do…...

解决:docker创建Redis容器成功,但无法启动Redis容器、也无报错提示

解决&#xff1a;docker创建Redis容器成功&#xff0c;但无法启动Redis容器、也无报错提示 一问题描述&#xff1a;1.docker若是直接简单使用run命令&#xff0c;但不挂载容器数据卷等参数&#xff0c;则可以启动Redis容器2.docker复杂使用run命令&#xff0c;使用指定redis.co…...

Jlink+OpenOCD+STM32 Vscode 下载和调试环境搭建

对于 Mingw 的安装比较困难&#xff0c;国内的网无法正常在线下载组件&#xff0c; 需要手动下载 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 版本的软件包&#xff0c;添加环境变量&#xff0c;并将 mingw32-make.exe 名字改成 make.exe。 对于 OpenOCD&#xff0c;需要…...

单片机在物联网中的应用

单片机&#xff0c;这个小巧的电子设备&#xff0c;可能听起来有点技术性&#xff0c;但它实际上是物联网世界中的一个超级英雄。简单来说&#xff0c;单片机就像是各种智能设备的大脑&#xff0c;它能让设备“思考”和“行动”。由于其体积小、成本低、功耗低、易于编程等特点…...

16.Qt 工具栏生成

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 界面添加 2. 信号槽 功能实现 参考&#xff1a; 前言&#xff1a; 基于QMainWindow&#xff0c;生成菜单下面的工具栏&#xff0c;可以当作菜单功能的快捷键&#xff0c;也可以完成新的功能 直接在UI文件中…...

【Linux内核】从0开始入门Linux Kernel源码

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[Linux内核] ❤️ 前置学习专栏&#xff1a;[Linux学习]从0到1 ⏰ 我们仍在旅途 ​ 目录 …...

SQL Service 2008 的安装与配置

点击添加当前用户...

Apache POI | Java操作Excel文件

目录 1、介绍 2、代码示例 2.1、将数据写入Excel文件 2.2、读取Excel文件中的数据 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步…...

vue 学习definproperty方法

definproperty方法是Vue很重要的一个底层方法&#xff0c;掌握他的原理很重要&#xff0c;下面通过代码说明问题&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>回顾Object.defineproperty方法</title&…...

react 实现路由拦截

简单介绍下项目背景&#xff0c;我这里做了一个demo&#xff0c;前端使用mock数据&#xff0c;然后实现简单的路由拦截&#xff0c;校验session是否包含用户作为已登录的依据&#xff0c;react-router-dom是v6。不像vue可以设置登录拦截beforeenter&#xff0c;react需要我们自…...

数据分析(一) 理解数据

1. 描述性统计&#xff08;summary&#xff09; 对于一个新数据集&#xff0c;首先通过观察来熟悉它&#xff0c;可以打印数据相关信息来大致观察数据的常规特点&#xff0c;比如数据规模&#xff08;行数列数&#xff09;、数据类型、类别数量&#xff08;变量数目、取值范围…...

什么是 Flet?

什么是 Flet&#xff1f; Flet 是一个框架&#xff0c;允许使用您喜欢的语言构建交互式多用户 Web、桌面和移动应用程序&#xff0c;而无需前端开发经验。 您可以使用基于 Google 的 Flutter 的 Flet 控件为程序构建 UI。Flet 不只是“包装”Flutter 小部件&#xff0c;而是…...

多模态(三)--- BLIP原理与源码解读

1 BLIP简介 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 传统的Vision-Language Pre-training &#xff08;VLP&#xff09;任务大多是基于理解的任务或基于生成的任务&#xff0c;同时预训练数据多是从web获…...

掌握高性能SQL的34个秘诀多维度优化与全方位指南

掌握高性能SQL的34个秘诀&#x1f680;多维度优化与全方位指南 本篇文章从数据库表结构设计、索引、使用等多个维度总结出高性能SQL的34个秘诀&#xff0c;助你轻松掌握高性能SQL 表结构设计 字段类型越小越好 满足业务需求的同时字段类型越小越好 字段类型越小代表着记录占…...

美国纳斯达克大屏怎么投放:投放完成需要多长时间-大舍传媒Dashe Media

陕西大舍广告传媒有限公司&#xff08;Shaanxi Dashe Advertising Media Co., Ltd&#xff09;&#xff0c;简称大舍传媒&#xff08;Dashe Media&#xff09;&#xff0c;是纳斯达克在中国区的总代理&#xff08;China General Agent&#xff09;。与纳斯达克合作已经有八年的…...

【MySQL】多表关系的基本学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-3oES1ZdkKIklfKzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

Springboot之接入gRPC

1、maven依赖 <properties><!-- grpc --><protobuf.version>3.5.1</protobuf.version><protobuf-plugin.version>0.6.1</protobuf-plugin.version><grpc.version>1.42.1</grpc.version><os-maven-plugin.version>1.6.0…...

2023年中国数据智能管理峰会(DAMS上海站2023):核心内容与学习收获(附大会核心PPT下载)

随着数字经济的飞速发展&#xff0c;数据已经渗透到现代社会的每一个角落&#xff0c;成为驱动企业创新、提升治理能力、促进经济发展的关键要素。在这样的背景下&#xff0c;2023年中国数据智能管理峰会&#xff08;DAMS上海站2023&#xff09;应运而生&#xff0c;汇聚了众多…...

DS:八大排序之堆排序、冒泡排序、快速排序

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、堆排序 堆排序已经在博主关于堆的实现过程中详细的讲过了&#xff0c;大家可以直接去看&#xff0c;很详细,这边不介绍了 DS&#xff1a;二叉树的顺序结构及堆的实现-CSDN博客 直接上代码&#xff1a; …...

Sora:继ChatGPT之后,OpenAI的又一力作

关于Sora的报道&#xff0c;相信很多圈内朋友都已经看到了来自各大媒体铺天盖地的宣传了&#xff0c;这次&#xff0c;对于Sora的宣传&#xff0c;绝不比当初ChatGPT的宣传弱。自OpenAI发布了GPT4之后&#xff0c;就已经有很多视频生成模型了&#xff0c;不过这些模型要么生成的…...

阅读笔记(BMSB 2018)Video Stitching Based on Optical Flow

参考文献 Xie C, Zhang X, Yang H, et al. Video Stitching Based on Optical Flow[C]//2018 IEEE International Symposium on Broadband Multimedia Systems and Broadcasting (BMSB). IEEE, 2018: 1-5. 摘要 视频拼接在计算机视觉中仍然是一个具有挑战性的问题&#xff0…...

Ubuntu学习笔记-Ubuntu搭建禅道开源版及基本使用

文章目录 概述一、Ubuntu中安装1.1 复制下载安装包路径1.2 将安装包解压到ubuntu中1.3 启动服务1.4 设置开机自启动 二、禅道服务基本操作2.1 启动&#xff0c;停止&#xff0c;重启&#xff0c;查看服务状态2.2 开放端口2.3 访问和登录禅道 卜相机关 卜三命、相万生&#xff0…...

《苍穹外卖》知识梳理6-缓存商品,购物车功能

苍穹外卖实操笔记六—缓存商品&#xff0c;购物车功能 一.缓存菜品 可以使用redis进行缓存&#xff1b;另外&#xff0c;在实现缓存套餐时可以使用spring cache提高开发效率&#xff1b;   通过缓存数据&#xff0c;降低访问数据库的次数&#xff1b; 使用的缓存逻辑&#…...

[NSSCTF]-Web:[SWPUCTF 2021 新生赛]easy_sql解析

查看网页 有提示&#xff0c;参数是wllm&#xff0c;并且要我们输入点东西 所以&#xff0c;我们尝试以get方式传入 有回显&#xff0c;但似乎没啥用 从上图看应该是字符型漏洞&#xff0c;单引号字符注入 先查看字段数 /?wllm2order by 3-- 没回显 报错了&#xff0c;说明…...

vue3 codemirror yaml文件编辑器插件

需求&#xff1a;前端编写yaml配置文件 &#xff0c;检查yaml语法 提供语法高亮 。 默认内容从后端接口获取 显示在前端 &#xff0c; 前端在codemirror 插件中修改文件内容 &#xff0c;并提交修改 后端将提交的内容写入服务器配置文件中 。 codemirror 通过ref 后期编辑器…...

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…...

【web | CTF】BUUCTF [BJDCTF2020]Easy MD5

天命&#xff1a;好像也挺实用的题目&#xff0c;也是比较经典吧 天命&#xff1a;把php的MD5漏洞都玩了一遍 第一关&#xff1a;MD5绕过 先声明一下&#xff1a;这题的MD5是php&#xff0c;不是mysql的MD5&#xff0c;把我搞迷糊了 一进来题目啥也没有&#xff0c;那么就要看…...

spring boot Mybatis Plus分页

文章目录 Mybatis Plus自带分页和PageHelper有什么区别&#xff1f;Mybatis Plus整合PageHelper分页 springboot自定义拦截器获取分页参数spring boot下配置mybatis-plus分页插件单表分页查询自定义sql分页查询PageHelper 参考 Mybatis Plus自带分页和PageHelper有什么区别&…...

elementui 中 el-date-picker 控制选择当前年之前或者之后的年份

文章目录 需求分析 需求 对 el-date-picker控件做出判断控制 分析 给 el-date-picker 组件添加 picker-options 属性&#xff0c;并绑定对应数据 pickerOptions html <el-form-item label"雨量年份&#xff1a;" prop"date"><el-date-picker …...

GlusterFS:开源分布式文件系统的深度解析与应用场景实践

引言 在当今大数据时代背景下&#xff0c;企业对存储系统的容量、性能和可靠性提出了前所未有的挑战。GlusterFS作为一款开源的、高度可扩展的分布式文件系统&#xff0c;以其独特的无中心元数据设计和灵活的卷管理机制&#xff0c;在众多场景中脱颖而出&#xff0c;为解决大规…...

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中&#xff0c;可以使用**margin:0 auto;&#xff0c;也可以使用flex**布局&#xff1a; body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…...

配置oracle连接管理器(cman)

Oracle Connection Manager是一个软件组件&#xff0c;可以在oracle客户端上指定安装这个组件&#xff0c;Oracle连接管理器代理发送给数据库服务器的请求&#xff0c;在连接管理器中&#xff0c;我们可以通过配置各种规则来控制会话访问。 简而言之&#xff0c;不同于专用连接…...

[N-142]基于springboot,vue停车场管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本项目分为普通用户和管理员…...

DAY53:动态规划(买股票的最佳时机)

Leetcode: 121 买卖股票的最佳时机 代码随想录 1、确定下标和含义 dp[i][0]表示当天持有股票所得的最多现金 do[i][1]表示当天不持有股票的最多现金 2、递推公式 &#xff08;1&#xff09;如果第i天持有股票即dp[i][0]&#xff0c; 那么可以由两个状态推出来 第i-1天就…...

快速实现用户认证:使用Python和Flask配合PyJWT生成与解密Token的教程及示例代码

生成token 与解密 token 和 拦截器 #学习交流 访问 # https://v.iiar.cnimport jwt import datetime from models import XUser from flask import request, jsonify from functools import wrapsSECRET_KEY XPay# 创建token def generate_token(user_id):try:payload {exp:…...

外汇110:外汇做空是什么意思?如何运作?一文读懂

外汇市场允许卖空&#xff0c;就像众多金融市场一样。但什么是卖空呢&#xff1f;如何外汇做空&#xff1f;在本文中&#xff0c;我们将讨论如何做空货币。什么是外汇做空&#xff1f; 外汇做空&#xff08;Short Selling&#xff09;是外汇市场上的一种投资方式。它指的是投资…...

【记录】个人博客或笔记中的数学符号设定

note 这里记录个人博客中常用的数学符号数学格式和对应含义 文章目录 note数与数组索引集合线性代数微积分概率和信息论数据与概率分布函数深度学习中的常用数学表达方式 数与数组 α 标量 α 向量 A 矩阵 A 张量 I n n 行 n 列单位矩阵 v w 单词 w 的分布式向量表示 …...

Redis Sentinel工作原理

Redis Sentinel是Redis的高可用性解决方案。它主要用来监控Redis master和slave服务器的运行状态&#xff0c;并在master宕机时自动进行故障转移&#xff0c;即从slave节点中选举出新的master节点&#xff0c;并让其余的slave节点指向新的master节点。 Redis Sentinel工作原理…...

GEE入门篇|遥感专业术语:理论介绍

本章的目的是介绍遥感图像的一些主要特征&#xff0c;以及如何在Earth Engine中检查它们。我们将讨论空间分辨率、时间分辨率和光谱分辨率&#xff0c;以及如何访问重要的图像元数据。将了解到来自不同卫星平台上的几个传感器的图像数据。在本章的学习完成后&#xff0c;您将能…...

react中如何做到中断diff过程和恢复

workLoop是 实现时间切片 和 可中断渲染的核心&#xff0c;简要说明如下&#xff1a; // 并发任务的入口function workLoopConcurrent() {// Perform work until Scheduler asks us to yield// 有任务 & 是否需要中断while (workInProgress ! null && !shouldYiel…...

python:PyPDF2 从PDF文件中提取目录

我发现 pypdf 和 pypdf2 的作者是同一人&#xff1a;Mathieu Fenniak pip install pypdf2 ; pypdf2-3.0.1-py3-none-any.whl (232 kB) 编写 pdf_read_dir.py 如下 # -*- coding: utf-8 -*- """ pypdf23.0.1 从PDF中提取目录 """ import os…...

Java 2:运算符、表达式和语句

2.1 运算符与表达式 Java提供了丰富的运算符&#xff0c;如算术运算符、关系运算符、逻辑运算符、位运算符等。Java语言中的绝大多数运算符和C语言相同&#xff0c;基本语句如条件分支语句&#xff0c;循环语句等&#xff0c;也和C语言类似。 2.1.1算术运算符与算术表达式 1…...

批量提取word文件中文本框内容的三种方法

一、问题的提出 在日常的办公中&#xff0c;有时需要提取多个word文件中的文字框的内容。有时&#xff0c;文字框的数量比较多&#xff0c;而且处于文档的不同位置&#xff0c;手工提取比较耗时耗力&#xff0c;同时也可能会产生遗漏。 我们也可以通过VBA和Python来解决这个问…...

Leecode之合并两个有序链表

一.题目及剖析 https://leetcode.cn/problems/merge-two-sorted-lists/description/ 二.思路引入 用指针遍历两个链表并实时比较,较小的元素进行尾插,然后较小元素的指针接着向后遍历 三.代码引入 /*** Definition for singly-linked list.* struct ListNode {* int va…...

陶建国教授谈中西方文化的差异与交融

龙年到来&#xff0c;这个春节里&#xff0c;“龙”字的英文翻译引发关注&#xff0c;冲上了热搜&#xff0c;网友发现&#xff0c;“龙”不再翻译为“dragon”&#xff0c;而是龙字的谐音“loong”。原来&#xff0c;在西方人的眼里&#xff0c;龙是凶猛的怪兽&#xff0c;具有…...

Ps:画笔选项

画笔选项 Brush Options提供了对画笔&#xff08;圆形笔刷&#xff09;基本属性的控制&#xff0c;比如大小、硬度、间距、角度和圆度等。 Photoshop 中的快速选择工具、污点修复画笔工具、修复画笔工具、颜色替换工具、背景橡皮擦工具等的工具选项栏上提供了这种圆形笔刷选项。…...

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令&#xff08;06h&#xff09; 2. 写禁…...

stm32:pwm output模块,记录一下我是用smt32,输出pwm波的记录--(实现--重要)

我是实现了输出pwm波,频率固定,占空比可以不断调整的方法,将PA0接到示波器上,可以看到是一个标准的PWM波,如图下面示波器图。 1,首先是ioc的配置 我刚开始设置的分频的倍数是7199,使得分频的太大了,示波器显示不了,最后修改为71就可以,我之前设置读取pwm也是一样的…...

phpstrom创建thinkphp项目

安装php和composer 参考 安装phpstrom 创建项目 查看thinkphp版本 https://packagist.org/packages/topthink/think 打开所在项目编辑配置 即可调试运行...