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

【Java】/*抽象类和接口*/

目录

一、抽象类和抽象方法

1.1 概念

1.2 特性

1.3 作用

二、接口

2.1 概念及定义

2.2 特性

2.3 实例:笔记本电脑

2.4 一个类可以实现多个接口

2.5 一个接口可以继承多个接口

2.6 Comparable接口

2.7 Comparator接口

2.8 Cloneable接口

2.9 浅拷贝和深拷贝

2.10 抽象类和接口的区别

三、Object类

3.1 概念

3.2 获取对象信息

3.3 对象比较equals方法

2.4 hashcode方法


一、抽象类和抽象方法

1.1 概念

1. 抽象类:如果一个类没有足够的信息来描述一个对象(这个类通常是父类),那么这个类可以用abstract修饰成为抽象类

2. 抽象方法:抽象类中被abstract修饰的方法称为抽象方法,抽象方法可以不具体实现

1.2 特性

① 抽象类也是类,内部可以有成员和构造方法等,也可以发生向上转型,方法重写,多态。

② abstract不能修饰被private、static、final修饰的方法,因为抽象方法要被子类重写(被重写的方法要满足能被重写的条件)

③ 抽象方法可以不具体实现,如果具体实现了反而会报错。

④ 如果一个类中包含抽象方法,那么这个类必定是抽象类;但抽象类中不一定有抽象方法。

抽象类不能实例化对象只能被继承(和被final修饰的类效果相反)并且继承抽象类的子类A必须要重写抽象类中的抽象方法,如果不重写,得将子类A也得写成抽象类,那么当子类B继承子类A后就得重写子类A的父类和子类A中所有没被重写的方法(出来混总是要还的)。

/*抽象方法*/
abstract class Father {/*抽象类*/public abstract void funcA();
}/*抽象方法*/
abstract class Son extends Father {/*抽象类*/public abstract void funcB();
}class GrandSon1 extends Son {/*重写Father类中的抽象方法*/@Overridepublic void funcA() {System.out.println("我是爷爷的第一个孙子");}/*重写Son类中的抽象方法*/@Overridepublic void funcB() {System.out.println("我是爸爸的第一个儿子");}
}class GrandSon2 extends Son {/*重写Father类中的抽象方法*/@Overridepublic void funcA() {System.out.println("我是爷爷的第二个孙子");}/*重写Son类中的抽象方法*/@Overridepublic void funcB() {System.out.println("我是爸爸的第二个儿子");}
}public class Test01 {public static void funcDemo1(Father father) {//向上转型成Father类,只能调用Father类有的成员father.funcA();}public static void funcDemo2(Son son) {//向上转型成Son类,由于Son类继承了Father类,//此时能调用Father类和Son类有的成员,//所以无论在抽象类有没有继承抽象类的情况下//记住向上转型成最后一个抽象类即可son.funcA();son.funcB();}public static void main(String[] args) {GrandSon1 grandSon1 = new GrandSon1();GrandSon2 grandSon2 = new GrandSon2();//Test01.funcDemo1(grandSon1);//Test01.funcDemo1(grandSon2);Test01.funcDemo2(grandSon1);Test01.funcDemo2(grandSon2);}
}

1.3 作用

抽象类本身不能被实例化,要想使用只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。有些人可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢? 确实如此,但是使用抽象类相当于多了一重编译器的校验。使用抽象类的场景就如上面的代码, 实际工作不应该由父类的方法完成, 而应由子类重写的方法完成,那么如果不小心忘记在子类中重写父类中的方法了,在方法调用的过程中父类使用普通类编译器是不会报错的,但是父类是抽象类就会在子类继承父类后提示需要重写父类中的方法, 让我们尽早发现代码中的逻辑问题。

很多语法存在的意义都是为了 "预防出错",例如我们曾经用过的 final 也是类似。创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们。充分利用编译器的校验, 在实际开发中是非常有意义的。

二、接口

2.1 概念及定义

概念:接口(英文:Interface),在JAVA编程语言中是一个抽象引用数据类型,是抽象方法的集合,接口用interface关键字来定义。

定义:

① 定义接口要使用interface关键字(接口并不是类)。

② 接口的命名一般以大写字母I开头,并且命名一般使用形容词性的单词。

③ 接口中的成员可以有成员变量和成员方法,但成员变量必须是public static final修饰的,成员方法必须是public abstract修饰的(也就是说,接口中的成员变量必须是公开可以使用的常量,接口中的成员方法必须是抽象方法),阿里编码规范中约定,接口中的方法和属性不要加任何的修饰符号,因此我们在写接口中的成员时可以不写前面的修饰,编译器会自动修饰。

④ 接口前面不要用abstract修饰,因为接口本身比抽象类更抽象。

类实现接口的格式:

2.2 特性

① 抽象类和接口都不能实例化对象,抽象类用来被类继承,接口用来被类实现。

② 当一个类实现一个接口时意味着要在这个类中重写接口中所有抽象方法,如果在这个类中不想重写,则这个类必须定义成抽象类,继承这个抽象类的类得重写接口和这个抽象类中的所有抽象方法。

③ 接口也可以发生向上转型,动态绑定,多态(动态绑定是原理,多态是思想)。

④ 接口定义好后也会有一个单独的Java文件,编译完成后生成的字节码文件的后缀也是(.class)。

⑤ 接口中不能有静态代码块,构造代码块,构造方法等。

⑥ 重写接口中的方法时,方法只能是public修饰的(因为重写方法的权限要大于等于重写前的权限,而接口中的成员方法默认是public的)。

⑦ 接口中被 default 或 static 修饰的方法要写清楚具体实现的语句,且被实的接口中default成员方法可以不重写,也可以被重写,并不会像接口中的抽象方法一样强制要重写。

2.3 实例:笔记本电脑

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

1. USB接口:包含打开设备、关闭设备功能

2. 笔记本类:包含开机功能、关机功能、使用USB设备功能

3. 鼠标类:实现USB接口,并具备点击功能

4. 键盘类:实现USB接口,并具备输入功能

 

2.4 一个类可以实现多个接口

1. 在Java中,类和类之间只能是单继承的,也就是说一个类只能有一个父类,但一个类可以实现多个接口,从而间接达到实现多继承的目的

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

3. 例如:根据我们当前掌握的知识当我们想要描述狗、鱼、鸭这三种动物时,我们会定义狗、鱼、鸭这三个类,并且由于它们之间共属于动物,我们可以定义一个父类Animal,从而达到代码复用的效果。但是在定义的过程中我们会发现一个问题,游泳、跑步、飞行这三个行为,如果我们把它们定义在父类Animal中并不稳妥,因为继承是对子类共性的抽取,并不是所有的动物都同时具备这三个行为;如果我们把它们定义在狗、鱼、鸭的各自类中,这又会造成代码冗余;如果我们把它们定义在一个新的类A中,当我们定义狗、鱼、鸭类时又会发现类是不支持多继承的,继承了Animal类就不能再继承A类了。在这种场景下,我们把游泳、跑步、飞行这三个行为定义在一个接口中最为合适,这样子类既可以继承Animal类也可以根据需要拥有游泳/跑步/飞行这三个行为,而且不会造成代码冗余。于是我们可以写下如下图代码,该代码展示了 Java 面向对象编程中最常见的用法:一个类继承一个父类, 同时实现了多个接口。

4. 使用接口的好处:让程序员忘记类型。例如,下图中用绿色方框框起来的方法,参数部分采用了向上转型传参数的方式,在调用该方法传参时程序员可以不用考虑传入的参数是什么类,只需要关心传入的参数的类中是否实现了对应的接口。

 

2.5 一个接口可以继承多个接口

1. 一个接口可以继承多个接口,从而达到复用的效果,关键字也是extends。

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

3. 下图代码中接口C继承了接口A、B,实现接口C的TestNew类要重写接口A、接口B、接口C中所有的抽象方法,否则TestNew类得定义成抽象类。

 

2.6 Comparable接口

1. 关系运算符只能比较基本数据类型数据的大小,引用数据类型的数据比较大小要用到Comparable接口中的compareTo方法。

2. 具体做法:为将要比较大小的引用数据类型的对象它对应的类实现Comparable接口,在类中重写接口中的compareTo方法,compareTo方法的内部自定义根据类的哪一种成员变量进行比较。我们在比较该引用数据类型的对象的大小时,直接用对象的引用调用compareTo方法并传参即可,不用定义一个新的方法使用向上转型(这样写有点多此一举了),举例代码如下图所示。

3. Arrays.sort方法在排序装有引用数据类型的数组时,会先将数组中的元素强制转换成Comparable类型,然后调用compareTo方法比较两个相邻数据的大小,最后根据比较的结果对数组中相邻两个元素进行位置调整。

这也就是说使用Arrays.sort方法对装有引用数据类型数据的数组进行排序时,也得先让对应引用数据类型的类实现Comparable接口,并在类中重写了compareTo方法后才能正常进行排序,且值得注意的是,也就是说Arrays.sort排序的逻辑与compareTo内部实现比较大小的依据有着极大的关联,当compareTo内部根据年龄、姓名等比较大小时可能会造成不同的排序结果。

4. 使用Comparable接口中的compareTo方法来比较两个引用数据类型的大小的局限性在于,一旦把compareTo中的内容写下了之后,以后在比较该引用数据类型对象的大小时调用compareTo方法只能按照compareTo方法中依据的东西判断大小了。

 5. 写一个自己的sort方法,实现和Arrays.sort方法一样的功能(采用冒泡排序):

2.7 Comparator接口

1. 针对Comparable接口的局限性,在比较某个类实例化的两个对象的大小时,我们可以采用实现Comparator接口对里面的compare方法进行重写,而不去采用实现Comparable接口。

2. 具体做法:重新定义新的类(A)去实现Comparator接口,<>里面写上要比较的类,使用时直接new一个A类的对象a,使用a调用compare方法并传参即可;我们可以按照这种方式写多个比较器来达到目的;如果Comparator接口由比较对象的类实现,则会达不到想要的效果,如下图二所示。

3. 我们在调用Arrays.sort方法时也可以将比较器作为参数传递给sort方法,使得sort方法在排序装有引用数据类型的数组时,比较相邻的两个元素的大小采用比较器中的compare方法,而不再采用Comparable中的compareTo方法。

2.8 Cloneable接口

1. 使用场景:想要克隆某个对象时。

2. 实现步骤:

    ① 给该对象对应的类实现Clonable接口,但并不用重写Cloneable中的接口,因为这个接口里面并没有抽象方法,此时这个接口叫做空接口/标记接口,这种接口的意义在于只有实现了该接口才能证明你有该功能,除此之外没有什么特殊的意义。

   ② 调用Object类中的clone方法。但我们不能直接调用,因为Object类中的clone方法被protected修饰了,此时是不能在不同包的非子类中使用的,

于是我们可以先在子类中重写Object的克隆方法,在这个重写的克隆方法内部直接返回原来克隆方法的返回值即可,因为我们调用克隆方法的目的本来就是得到克隆后对象的地址,在不同包的子类中是可以调用Object的clone方法的。

-》补充:在子类中快速重写Object类中方法的快捷方式

3. 由于clone方法的返回值是Object类型的,因此在接收clone方法的返回值时,要强制类型转换一下(Object类是所有类的父类,这里要发生向下转型)。

4. 当上面的步骤都做好后,代码运行时还会报错,此时是由于异常原因,解决的方法是,在main方法参数列表的后面加上clone方法参数列表后的“throws CloneNotSupportedException”即可,异常问题后面的文章中会讲到。

-》下图是示例代码:

-》上图代码在内存中的示意图: 

 

2.9 浅拷贝和深拷贝

1. 浅拷贝:修改上文Cloneable接口中的代码,即给Student类增加一个成员变量(该成员变量是Money类创建的一个对象),并保持其他的代码不变。代码和代码在内存中的示意图如下图所示。

我们会发现一个问题,克隆出的student2中成员变量m指向的对象和student1中成员变量m指向的对象一样,当我们在修改student1/student2中m对象的money值时,student1和student2中m对象的money值都会变,这种现象被称为浅拷贝(并没有实现真正的拷贝效果)。

2. 深拷贝:为了实现真正的拷贝效果,我们可以修改上述代码中重写的clone方法来达到目的。具体操作是,在Student类重写的clone方法中先调用Object类中的clone方法,克隆一下this所指向的对象,并让临时的Student类对象tmp来接收,然后为Money类实现Cloneable接口并重写clone方法,接着克隆一下this中的m对象,并让tmp中的m接收,最后返回tmp即可达到真正的拷贝效果,代码和代码在内存中的分析如下图所示。

2.10 抽象类和接口的区别

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

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

3. 再次提醒: 抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类. 万一不小心创建了 Animal 的实例, 编译器会及时提醒我们。

三、Object类

3.1 概念

1. Object类是所有类的父类。

2. 对于整个Object类中的方法需要实现全部掌握,本小节当中,我们主要来熟悉这几个方法:toString()方法,equals()方法,hashcode()方法。

3. 在ideal中如何看到Object类中所有的方法?

    做法:双击shift,在出现的对话框中勾选Include non-project items,并在搜索框中搜索Object,点击第一个Object,然后在ideal页面的左下角点击Structure即可看到Object类中的所有的方法。

3.2 获取对象信息

如果要打印对象的信息,可以通过重写Object类中的toString()方法,在打印时:对于单个对象直接用sout打印对象的名称即可,对于装有多个对象的数组来说用sout打印Arrays.toString的返回值即可,具体示例代码如下图所示。

3.3 对象比较equals方法

1. Object类中的equals方法的功能是比较两个引用所指向的对象是否为同一个对象,如果是就返回true,否就返回false,并且Object类中的equals方法是用public修饰的哦~。

2. 也就是说当我们想比较两个对象中的内容是否相同时得重写Object类中的equals方法。并且ideal提供了快捷方式,具体做法:单机右键,Generate,点击equals() and hashCode(),然后一路next。

2.4 hashcode方法

1. toString方法的源码中有一个hashCode()方法,它可以帮我们算一个具体的对象位置(我们可以暂时理解为内存地址)。Integer.toHexString()方法,可以将这个地址以16进制输出。

2. hashCode()方法是一个native方法,底层是由C/C++代码写的,所以我们看不到。

3. 如果在某个业务场景中我们需要实现,如果对象的成员变量都一致,我们就认为是同一个人的话,我们可以通过重写hashCode方法来达到目的。ideal提供了快捷方式,具体做法:单机右键,Generate,点击equals() and hashCode(),然后一路next。

4. 重写hashCode前:

 

    重写hashCode后:

  本篇文章已完结,谢谢支持哟 ^^ !!! 

相关文章:

【Java】/*抽象类和接口*/

目录 一、抽象类和抽象方法 1.1 概念 1.2 特性 1.3 作用 二、接口 2.1 概念及定义 2.2 特性 2.3 实例&#xff1a;笔记本电脑 2.4 一个类可以实现多个接口 2.5 一个接口可以继承多个接口 2.6 Comparable接口 2.7 Comparator接口 2.8 Cloneable接口 2.9 浅拷贝和深…...

TCP/IP协议介绍——三次握手四次挥手

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff09;是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议&#xff0c;而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议…...

[C++]基于C++opencv结合vibe和sort tracker实现高空抛物实时检测

【vibe算法介绍】 ViBe算法是一种高效的像素级视频背景建模和前景检测算法。以下是对该算法的详细介绍&#xff1a; 一、算法原理 ViBe算法的核心思想是通过为每个像素点存储一个样本集&#xff0c;利用该样本集与当前像素值进行比较&#xff0c;从而判断该像素是否属于背景…...

Apache Doris 基础 -- 数据表设计(模式更改)

用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改&#xff0c;可以查看数据表设计/表索引&#xff0c;查看每个索引的更改方法。 1、术语 基本表&#xff08;Base Ta…...

【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】

仅供学习、参考使用 一、遗传算法简介 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是机器学习领域中常见的一类算法&#xff0c;其基本思想可以用下述流程图简要表示&#xff1a; &#xff08;图参考论文&#xff1a;Optimization of Worker Scheduling at Logi…...

电子电气架构 ---车载安全防火墙

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

解决selenium加载网页过慢影响程序运行时间的问题

在用selenium爬取动态加载网页时&#xff0c;发现网页内容都全部加载完了&#xff0c;但是页面还在转圈&#xff0c;并且获取页面内容的代码也没有执行&#xff0c;后面了解到selenium元素操作等方法是需要等待页面所有元素完全加载完成后才开始执行的&#xff0c;所以在页面未…...

何为云防护?有何作用

云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布&#xff0c;云计算越演越热&#xff0c;DDOS拒绝服务攻击的实施越来越容易&#xff0c;DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素&#xff0c;导致很多IDC 托管…...

2024050402-重学 Java 设计模式《实战责任链模式》

重学 Java 设计模式&#xff1a;实战责任链模式「模拟618电商大促期间&#xff0c;项目上线流程多级负责人审批场景」 一、前言 场地和场景的重要性 射击&#x1f3f9;需要去靶场学习、滑雪&#x1f3c2;需要去雪场体验、开车&#x1f697;需要能上路实践&#xff0c;而编程…...

centos7安装字体

1.安装命令 yum install fontconfig #字体库命令 yum install mkfontscale #更新字体命令2.安装字体&#xff08;注意权限问题&#xff09; 进入目录 /usr/share/fonts &#xff0c;该目录是 centos7 字体库的默认安装目录。在该目录下创建一个文件夹 ekp &#xff08;名字…...

Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…...

学习Canvas过程中2D的方法、注释及感悟一(通俗易懂)

1.了解Canvas&#xff1a; Canvas是前端一个很重要的知识点&#xff0c;<canvas>标签用于创建画布绘制图形&#xff0c;通过JavaScript进行操作。它为开发者提供一个动态绘制图形的区域&#xff0c;用于创建图标、游戏动画、图像处理等。 对于能够熟练使用Canvas的开发者…...

《TCP/IP网络编程》(第十三章)多种I/O函数(2)

使用readv和writev函数可以提高数据通信的效率&#xff0c;它们的功能可以概括为**“对数据进行整合传输及发送”**。 即使用writev函数可以将分散在多个缓冲中的数据一并发送&#xff0c;使用readv函数可以由多个缓冲分别接受&#xff0c;所以适当使用他们可以减少I/O函数的调…...

Java集合汇总

Java中的集合框架是Java语言的核心部分&#xff0c;提供了强大的数据结构来存储和操作对象集合。集合框架位于java.util包中&#xff0c;主要可以分为两大类&#xff1a;Collection&#xff08;单列集合&#xff09;和Map&#xff08;双列集合&#xff09;。下面是对它们的总结…...

度小满金融大模型的应用创新

XuanYuan/README.md at main Duxiaoman-DI/XuanYuan GitHub...

Android WebView上传文件/自定义弹窗技术,附件的解决方案

安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是&#xff1a; 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...

selenium 输入框、按钮,输入点击,获取元素属性等简单例子

元素操作 nput框 输入send_keys&#xff0c; input框 清除clear()&#xff0c; 按钮 点击click() 按钮 提交submit() 获取元素 tag_name、 class属性值、 坐标尺寸 """ input框 输入1次&#xff0c;再追加输入一次&#xff0c; 清除&#xff0c; 再重新输入&…...

结构体构造函数

【知识点&#xff1a;结构体构造函数】下面两段代码等价。 &#xff08;1&#xff09;结构体构造函数写法 struct LinkNode {int data;LinkNode* next;LinkNode(int x):data(x),next(NULL) {} }; LinkNode* Lnew LinkNode(123); &#xff08;2&#xff09;非结构体构造函数写…...

基于单片机的电子万年历设计

摘要: 本设计以 AT89C51 单片机为主控器,使用 DS1302 时钟芯片、DS18B20 温度芯片、LCD1602 显示模块,利用Proteus 仿真软件和 Keil 编译软件进行了基于单片机的电子万年历仿真,设计的万年历可以在液晶上显示时间,同时还具有时间校准、温度显示等功能。 关键词 :单片机…...

大厂真实面试题(一)

滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…...

Docker搭建ELKF日志分析系统

Docker搭建ELKF日志分析系统 文章目录 Docker搭建ELKF日志分析系统资源列表基础环境一、系统环境准备1.1、创建所需的映射目录1.2、修改系统参数1.3、单击创建elk-kgc网络桥接 二、基于Dockerfile构建Elasticsearch镜像2.1、创建Elasticsearch工作目录2.2、上传资源到指定工作路…...

把系统引导做到U盘,实现插上U盘才能开机

前言 有个小伙伴提出了这样一个问题&#xff1a;能不能把U盘制作成电脑开机的钥匙&#xff1f; 小白稍微思考了一下&#xff0c;便做了这样一个回复&#xff1a;可以。 至于为什么要思考一下&#xff0c;这样会显得我有认真思考他提出的问题。 Windows7或以上系统均支持UEF…...

【计算机网络基础知识】

首先举一个生活化的例子&#xff0c;当你和朋友打电话时&#xff0c;你可能会使用三次握手和四次挥手的过程进行类比&#xff1a; 三次握手&#xff08;Three-Way Handshake&#xff09;&#xff1a; 你打电话给朋友&#xff1a;你首先拨打你朋友的电话号码并等待他接听。这就…...

个股场外期权个人如何参与买卖?

个股场外期权作为一种金融衍生品&#xff0c;为个人投资者提供了多样化的投资选择和风险管理工具。想要参与个股场外期权的买卖&#xff0c;以下是一些关键步骤和考虑因素。 文章来源/&#xff1a;财智财经 第一步&#xff1a;选择合适的金融机构 首先&#xff0c;个人投资者需…...

程序猿大战Python——pycharm软件的使用

基础配置 目标&#xff1a;了解PyCharm软件的基础配置处理。 修改背景颜色&#xff1a; Appearance -> Theme 修改字体大小&#xff1a; 搜索font -> Font 例如&#xff0c;一起完成背景、字体大小的修改。 总结&#xff1a; &#xff08;1&#xff09;如果要对PyChar…...

Unity Standard shader 修改(增加本地坐标裁剪)

本想随便找一个裁剪的shader&#xff0c;可无奈的是没找到一个shader符合要求&#xff0c;美术制作的场景都是用的都标准的着色器他们不在乎你的功能逻辑需求&#xff0c;他们只关心场景的表现&#xff0c;那又找不到和unity标准着色器表现一样的shader 1.通过贴图的透明通道做…...

【数据结构】排序——插入排序,选择排序

前言 本篇博客我们正式开启数据结构中的排序&#xff0c;说到排序&#xff0c;我们能联想到我之前在C语言博客中的冒泡排序&#xff0c;它是排序中的一种&#xff0c;但实现效率太慢&#xff0c;这篇博客我们介绍两种新排序&#xff0c;并好好深入理解排序 &#x1f493; 个人主…...

2024.6.9刷题记录

目录 一、1103. 分糖果 II 1.模拟 2.数学 二、312. 戳气球 1.递归-记忆化搜索 2.区间dp 三、2. 两数相加 1.迭代 2.递归-新建节点 3.递归-原节点 四、4. 寻找两个正序数组的中位数 1.堆 2.双指针二分 五、5. 最长回文子串 1.动态规划 2.中心扩展算法 六、6. Z…...

Matlab|遗传粒子群-混沌粒子群-基本粒子群

目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 很多同学在发文章时候最犯愁的就是创新点创新点创新点&#xff08;重要的事情说三遍&#xff09;&#xff0c;对于采用智能算法的模型&#xff0c;可以采用算法改进的方式来达到提高整个文章创新水平的目的&…...

31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络

前面两篇文章我们分析了HTTP/1和HTTP/2&#xff0c;在HTTP/2出现之前&#xff0c;开发者需要采取很多变通的方式来解决HTTP/1所存在的问题&#xff0c;不过HTTP/2在2018年就开始得到了大规模的应用&#xff0c;HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是…...

做网站图片素材在线编辑/网络推广网站排名

操作系统实 验 报 告课程名称操作系统实验实验项目名称磁盘调度算法学号班级姓名专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师初妍实验室名称地点21#428哈尔滨工程大学计算机科学与技术学院第六讲 磁盘调度算法一、实验概述1. 实验名称磁盘调度算法2. 实验目…...

杭州市西湖区建设局网站/头条今日头条新闻

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

鄂州网站建设/seo优化的技巧

当我们完成房间设置&#xff0c;带上VR眼睛之后&#xff0c;VR视角依然发生了偏移或者倾斜&#xff0c;一般需要进行如下操作&#xff0c;解决方案: 一、由于基站的空间定位是光学追踪&#xff0c;首先要保证环境四周的地板和墙面不要反光&#xff0c;否则会或大或小的影响基站…...

阅读网站怎样做/网络销售平台有哪些软件

前言 一名DBA的经历&#xff0c;做自己想做的&#xff0c;永不放弃&#xff0c;感谢生命中的贵人&#xff0c;我的师傅带我入行&#xff0c;感谢CSDN平台&#xff0c;让我分享更多DBA的干货 文章目录前言一、为什么要转行&#xff1f;1.DBA行业有哪些优势2.我转行的原因3.DBA我…...

企业网站设计与管理系统/搜索引擎优化是做什么的

https://blog.csdn.net/weixin_42075590/article/details/80740968 前言 刚刚确认这个 Chat 主题的时候&#xff0c;周围就有同事和同学质疑&#xff0c;有的说 多进程没有前途&#xff0c;有的说多进程就是神经病。虽然这些说法过于武断&#xff0c;但是不可否认的&#xff…...

桂林新闻网头条/seo需求

condition_variable 简介 在头文件< condition_variable >中&#xff0c;顾名思义是一个条件变量&#xff0c;主要功能是阻塞线程直到另一个线程把你唤醒。 条件两个字看起来似乎是指&#xff0c;在另一个线程中满足了条件&#xff0c;才把你唤醒&#xff1b;然而如果仅…...