Java 详解 接口
文章目录
- 一、概述
- 1.1、何为接口
- 1.2、接口的定义
- 二、特点
- 2.1、接口的成员变量
- 2.2、接口的成员方法
- 2.3、接口中不可以含有构造器和代码块
- 2.4、接口不可以实例化对象
- 2.5、接口和类之间使用implements关键字进行连接
- 2.6、当类在重写接口中的方法时,不可以使用默认的访问权限
- 2.7、接口虽然不是类,但是接口通过编译了之后也会生成class文件
- 2.8、如果类没有实现接口当中的全部抽象方法,那么该类必须要设置为抽象类
- 2.9、类支持实现多个接口
- 2.10、接口之间支持多继承
- 三、应用
- 3.1、实现多个接口
- 3.2、给对象排序
- 四、总结
一、概述
1.1、何为接口
我们知道继承普通类和继承抽象类的存在,继承本质上就是实现对共性的抽取同时实现代码的复用,通过对现实事物抽象成为一个类,类内包含这一类事物的属性和行为,继承的存在就是将这一类事物的共同属性和行为抽取出来,当我们在定义属于这一类事物的类时可以直接继承使用,而抽象类的出现是因为父类提供的信息不足以描述一个具体的类,因此将父类定义为抽象类,间接加上了一层校验,防止在代码中不小心使用父类创建并使用父类对象。但是继承也有缺点,继承是对共性的抽取,不同的对象虽然同属一个类但各自都会有不同的个性。
比如:动物类,狗属于动物,鸟属于动物,但是狗会跑,鸟不会,鸟会飞,但是狗不会,这就是两者的个性而非共性,因此其父类动物类就不可以含有行为跑和行为飞。可能有人会说:在定义狗类的时候可以定义自己特有的行为跑,在定义鸟类的时候可以定义鸟类自己特有的行为飞,这种方法确实可以,但是在定义一个鸭子类呢?鸭子可以飞可以跑,难道也要在定义鸭子类的时候再单独定义行为跑行为飞?不免有些繁琐了吧,当定义的类多了,每个类都有单独的自己的行为,但是不同的类之间又有共性,那继承的本质何在?
因此在这个时候接口就被定义出来了,接口可以理解为是对外提供的一组公共的行为规范标准,只要是当前类实例化的对象符合行为规范标准,那么我们就可以让当前类实现这个接口,举个例子:我们可以定义一个接口,是行为跑的标准,狗这个对象会跑,因此狗这个类就可以实现该接口,再定义一个接口,是行为飞的标准,鸟这个对象会飞,鸭子这个对象也会飞,因此鸟和鸭子这两个类都可以实现该接口。
当鸭子类实现了接口跑和接口游之后,鸭子类就包含有了行为跑和行为游,狗类实现了接口跑后,狗类就包含有了行为跑。因此接口技术用于描述类具有什么功能,但是接口中并不给出具体的实现,当某个类需要使用当前接口时再去实现接口中的方法,类需要遵从接口中描述的统一标准进行定义,所以接口就是统一的行为规范标准,接口在实现的时候,只需要符合行为规范标准就可以通用。在Java中,接口可以看作是多个类的公共规范,是一种引用类型。
1.2、接口的定义
接口的定义和类的定义相似,类的定义需要所以class关键字,而接口的定义需要使用interface关键字,而接口的定义方式就是将类的定义关键字class换成interface关键字即可。
访问修饰符 class 类名访问修饰符 interface 接口名
接口的创建和类的创建一样,都是通过右键单击src生成的
二、特点
2.1、接口的成员变量
接口的成员属性默认是被 public
static final修饰的,主要就是意味着在接口中定义的成员属性默认是静态常量。
1、当接口的变量被private
protected访问修饰符修饰时编译器直接爆红
2、当变量没有任何修饰符修饰的时候,在实现类当中不可以对其进行修改
3、当变量只被pulic修饰的时候,在实现类当中也不可以对其进行修改
4、当变量被public static final
修饰时,三个关键字都是灰色的,说明变量是默认被这三个关键字修饰的,因此这三个关键字可以不用编写,编译器会自动加上的
2.2、接口的成员方法
接口的成员方法默认是被public
abstract修饰的,也就是说不可以有具体的实现内容,这也就意味着接口中的成员方法默认是抽象 方法。
如图:方法func()有{
},代表有具体的实现,但是不符合抽象方法的语法,编译器直接爆红;方法func1()编写完参数列表后直接引号结尾,符合抽象方法的语法。
我们可以发现被public
abstract修饰的方法和什么的不修饰的方法都是一样的,并且func()方法的关键字public abstract
是灰色的,说明方法默认是被这两个关键字修饰的,即便程序员没有编写,编译器也会自动添加的。也就是说在接口当中不可以有普通方法的实现,一旦实现编译器直接爆红,但是一定要实现普通方法也不是不可以,只需要将普通方法修饰成为静态方法即可:
或者是让当前方法被default修饰:
2.3、接口中不可以含有构造器和代码块
因此在接口中定义的属性都只能够通过就地初始化进行初始化,无法通过构造器进行初始化
2.4、接口不可以实例化对象
接口和抽象类一样,都是引用型数据类型,但都不可以通过关键字new进行实例化对象的,本质上两者提供的信息都不足以描述一个具体的对象,就没有必要实例化对象,如果误把抽象类或者接口进行实例化对象并使用了,那么编译器会直接爆红提示错误,因此接口也含有和抽象类一样的校验功能。
2.5、接口和类之间使用implements关键字进行连接
类和类之间是继承关系,类和接口之间是实现关系。子类继承父类,类实现接口
public interface Itest {public abstract void func();public void func1();void func3();
}class teat implements Itest {}
需要注意的是,接口和抽象类一样里面都包含有抽象方法,这也就意味着当类实现了接口后,需要重写接口里面全部的抽象方法。
public interface Itest {public abstract void func();public void func1();void func3();
}class teat implements Itest {@Overridepublic void func() {}@Overridepublic void func1() {}@Overridepublic void func3() {}
}
2.6、当类在重写接口中的方法时,不可以使用默认的访问权限
重写的规则为: 1、方法名,返回类型,参数列表要一致 2、重写必须要在继承机制下 3、重写方法的访问权限必须要大于等于被重写方法的访问权限
在接口中的方法默认是被public abstract修饰的,那么类当中重写方法的访问权限就必须要大于等于public。
2.7、接口虽然不是类,但是接口通过编译了之后也会生成class文件
2.8、如果类没有实现接口当中的全部抽象方法,那么该类必须要设置为抽象类
如果类当中没有实现接口中的全部抽象方法时,编译器会爆红,直到全部实现之后才不会爆红,因此和抽象类一样,继承抽象类和实现接口的类只有两种选择:要么老老实实全部实现,要么就将当前类设置为抽象类。不过该来的还是回来,抽象类存在的意义就是为了被继承,也就是说即便设、置为抽象类了,该抽象类后面也是会被继承的,那么还是逃不过实现抽象方法的结果
public interface Itest {public abstract void func();public void func1();void func3();
}abstract class teat implements Itest {}class test extends teat {@Overridepublic void func() {}@Overridepublic void func1() {}@Overridepublic void func3() {}
}
2.9、类支持实现多个接口
在Java中类不支持多继承,类与类之间是单继承,一个类只能有一个父类,但是在Java中,一个类可以实现多个接口。
public class Duck extends Animal implements Iswim , IRun{public Duck(String name) {super(name);}@Overridepublic void run() {System.out.println(name + "在跑");}@Overridepublic void wim() {System.out.println(name + "在游");}
}
如代码,Duck类继承了Animal类并实现了接口Iswin和接口IRun两个接口
2.10、接口之间支持多继承
类与类之间支持继承,类与接口之间支持实现,接口与接口之间也支持继承,并且支持多继承,也就是使用接口可以达到多继承的效果。
接口可以继承接口,从而达到复用的效果,使用extends关键字。
通过接口继承创建一个新的接口IAmphibious表示“两栖的”,此时如果实现该借口,那么当前类就必须要重写IRun接口和Iswin接口的全部抽象方法。如此一来间接的实现了多继承的效果,也达到了IRun接口和Iswin接口中的方法代码复用,减少了程序员编写重复代码的时间。
三、应用
3.1、实现多个接口
//MAin类
public class Main {public static void funcrun(Irun irun) {irun.run();}public static void funcfly(Ifly ifly) {ifly.fly();} public static void funcsein(Iswin iswin) {iswin.swin();}public static void funcer(Isecdwe isecdwe) {isecdwe.run();isecdwe.swin();}public static void functih(ITiHabitat iTiHabitat) {iTiHabitat.fly();iTiHabitat.run();iTiHabitat.swin();}public static void main(String[] args) {Dog dog = new Dog("狗",5);bird birdi = new bird("鸟",5);Duck duck = new Duck("鸭子",5);}
}
//动物类
public abstract class Animal {protected String name;protected int age ;public abstract void eat();public Animal(String name, int age) {this.name = name;this.age = age;}
}
//狗类
public class Dog extends Animal implements Isecdwe{public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(name + "在吃狗粮....");}@Overridepublic void run() {System.out.println(name + "在跑....");}@Overridepublic void swin() {System.out.println(name + "在游....");}
}
//鸟类
public class bird extends Animal implements Ifly{@Overridepublic void fly() {System.out.println(name + "在飞.....");}public bird(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(name + "在吃鸟粮....");}
}
//鸭子类
public class Duck extends Animal implements ITiHabitat {public Duck(String name, int age) {super(name, age);}public void eat() {System.out.println(name + "在吃鸭粮....");}@Overridepublic void run() {System.out.println(name + "在跑.....");}@Overridepublic void swin() {System.out.println(name + "在游....");}@Overridepublic void fly() {System.out.println(name + "在飞....");}
}
//接口跑
public interface Irun {void run();
}//接口游
public interface Iswin {void swin();
}//接口飞
public interface Ifly {void fly();
}//接口两栖
public interface Isecdwe extends Iswin,Irun{
}//接口三栖
public interface ITiHabitat extends Irun,Iswin,Ifly{
}
在func方法内部,方法不关心传递过来的对象是什么对象,方法内部只关心该对象是否有实现当前接口,然后当前对象实现了接口,那么成功编译,如果没有实现当前接口,那么编译报错。
父类:对子类共性的抽取
接口:对象的行为标准规范,也可以说是某种功能特性
不是所有的动物都会飞会游,这些行为不是动物的共性,因此无法将这些行为定义到父类当中,最优解就是将这些非共有行为设置为接口,只要是符合接口定义的行为规范准则的动物都可以实现接口,此时就解决了非共性问题。可以简单理解为:父类是共有特性,接口是独有特性
Java面向对象编程中最常见的用法:一个类继承一个父类,同时实现多个接口。这样设计有什么好处呢?可以让程序员忘记类型,有了接口之后,类的使用者就不需要再关心具体类型,只需要关心当前类是否有实现某个接口,具备某种能力。
在func方法中,参数列表设置为接口类型,则该方法就不需要关注传递过来的对象是否是动物,只要该对象的类型实现了该接口,就可以使用该方法,也就是说重新定义一个机器人类,只要机器人类实现了该接口,则机器人类就可以调用该方法。
3.2、给对象排序
当我们实例化了大量的学生对象,此时需要对学生对象进行排序,我们可以定义一个学生类型的数组,并将顺序存储进入数组中。我们知道Java有定义一个冒泡排序的方法sort(),我们能否直接通过该方法进行对学生对象的排序呢?
编译直接报错
将数组内容强制转化为Comparable类型。
在调用sort()方法时,该方法底层会调用compareTo()方法进行比较,而compareTo()方法是在Comparable接口底下的方法,我们当前都没有实现Comparabe<>接口,怎么能够强制转化为Comparable类型?因此我们需要在学生类当中实现Comparable。
public class Student implements Comparable<Student>{protected String name;protected int score;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic int compareTo(Student o) {return 0;}
}
此时我们实现了Comparable,后面的代表泛型,证明比较的是Student这个类,此时还需要重写compareTo()方法,赋予比较规则。此时我们可以设定比较的规则,是按照姓名来比较还是按照成绩高低来比较,比如我们设定姓名来比较。
@Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}
此时我们设定好了按照姓名比较的规则,在String类当中有重写的compareTo()方法,我们直接调用该方法进行比较即可,此时是按照正序进行排序的
排序成功,我们在更换另外一个比较方式,按照成绩的高低来进行排序,也就是更换compareTo()方法实现内容。
@Overridepublic int compareTo(Student o) {return this.score - o.score;}
更换完成,当方法返回的是正数时,代表调用该方法者比较大;当方法返回负数时,代表方法调用者比较小;当方法返回值为0时,代表方法调用者和方法传递值一样大。
我们可以自己尝试编写sort()方法,用自己的方法实现排序过程,小小冒泡。
public static void bubble(Student[] student){for (int i = 0; i < student.length; i++) {for (int j = 0; j < student.length - 1 - i; j++) {if(student[j].compareTo(student[j + 1]) > 0) {Student tmp = student[j];student[j] = student[j + 1];student[j + 1] = tmp;}}}}
实现完成。
color=“red”
size=“3”>在sort()方法底层会调用compareTo()方法,compareTo()的参数是Student,因为我们在实现Comparable接口的时候指定了比较的是Student类的对象,因此通过快捷键生成的重写方法的参数默认是Student类型的。
对于sort()方法来说,需要传入的数组每一个对象都是“可比较的”,需要具备cmpareTo()这样的能力,通过重写compareTo()这样的方式,就可以定义比较规则。
但是我们仔细观察,好像不是很方便,因为现在是按照成绩高低进行排序,如果明天我想要按照姓名来排序呢?直接更改代码吗?不合适当我们的代码投入使用了之后,会产生数据,如果对当前已经投入使用的代码进行更改,有可能会导致连锁反应的出现,导致出现其他的错误。那么这个时候我们可以使用sort()方法的重载方法更换底层,将sort()方法的比较方法更换为Comparetor接口底下的compare()方法
我们需要创建一个类来重写compare(),该方法内部的比较规则是按照成绩高低进行排序
public class namesort implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.score - o2.score;}
}
再创建另外一个类来重写另外一个规则:按照姓名来排序
public class scoresort implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.name.compareTo(o2.name);}
}
此时我们就可以随意按照不同的规则进行比较了,不会再因为单独的规则而影响代码的使。
可能有人会说如果Comparable接口也通过定义两个不同的类实现然后进行重写compareTo()方法,也可以做到不同的规则进行比较,可以吗?首先我们需要注意的是在使用默认底层的情况下是需要将数组内容强制转换为Comparable类型的,也就是说Student类必须实现Comparable接口才可以,再执行下去就是调用compareTo()方法进行比较,如果将Comparable接口定义在外面的类并重写方法,没什么用啊,外面的类和Student类怎么能够串联在一起?sort()方法只会调用Student类里面的方法,而不会调用外面的类的方法;
更换底层的重载方法也不可以,重载方法的参数列表规定参数是Comparator类型,传递实现了Comparable的类是行不通的,编译直接报错。
四、总结
接口可以理解为是配合继承使用的,继承没办法做的事情接口来做,在一定程度上接口也做到了代码的服用以及小部分的共性抽取。更好的说法就是两者相互配合使用,继承一个类实现多个接口,达到强化多态的使用,将多态的使用范围扩大,不局限于父类,不需要每个类都继承父类,只需要实现了接口就可以达到多态的使用,还可以使程序员忘记类型的存在,有了接口之后,类的使用者就不必再关注类型,只需要关注类是否实现接口即可。
接口是一组对外公开的行为规范准则,在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过实现接口的方式,从而实现接口的抽象方法。
相关文章:

Java 详解 接口
文章目录 一、概述1.1、何为接口1.2、接口的定义 二、特点2.1、接口的成员变量2.2、接口的成员方法2.3、接口中不可以含有构造器和代码块2.4、接口不可以实例化对象2.5、接口和类之间使用implements关键字进行连接2.6、当类在重写接口中的方法时,不可以使用默认的访…...

wordpress搬家迁移后怎么修改数据库用户名
在WordPress中修改数据库用户名,你需要更新WordPress的配置文件wp-config.php。以下是步骤和示例代码: 使用FTP客户端或文件管理器登录到你的网站的主机账户。 找到wp-config.php文件,它通常位于WordPress安装的根目录中。 打开wp-config.…...

C# 用于将一个DataTable转换为Users对象的列表
1:第一种例子: /// <summary> /// 用户名循环赋值 /// </summary> /// <param name"dt"></param> /// <returns></returns> public List<Users> FenPeiFillModelUsers(DataTable dt) { …...

Spark中的shuffle
Shuffle的本质基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】的问题。 1、Spark的Shuffle设计 Spark Shuffle过程也叫作宽依赖过程,Spark不完全依赖于内存计算,面临以上问题时,也需要Shuffle过程。 2、Spark中哪…...

网络安全SQL初步注入2
六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…...

使用Go语言编写一个简单的NTP服务器
NTP服务介绍 NTP服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步,我们计划部署一个网络时间同步服务器(NTP服务器)。这一角色将…...

注意力机制篇 | YOLO11改进 | 即插即用的高效多尺度注意力模块EMA
前言:Hello大家好,我是小哥谈。与传统的注意力机制相比,多尺度注意力机制引入了多个尺度的注意力权重,让模型能够更好地理解和处理复杂数据。这种机制通过在不同尺度上捕捉输入数据的特征,让模型同时关注局部细节和全局…...

昇思大模型平台打卡体验活动:项目3基于MindSpore的GPT2文本摘要
昇思大模型平台打卡体验活动:项目3基于MindSpore的GPT2文本摘要 1. 环境设置 本项目可以沿用前两个项目的相关环境设置。首先,登陆昇思大模型平台,并进入对应的开发环境: https://xihe.mindspore.cn/my/clouddev 接着࿰…...

web——[GXYCTF2019]Ping Ping Ping1——过滤和绕过
0x00 考点 0、命令联合执行 ; 前面的执行完执行后面的 | 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果) || 当前面的执行出错时(为假)执行后面的 & 将任…...

婚礼纪 9.5.57 | 解锁plus权益的全能结婚助手,一键生成结婚请柬
婚礼纪是一款结婚服务全能助手,深受9000万新人信赖的一站式结婚服务平台。解锁plus权益后,用户可以享受部分VIP会员功能。应用提供了丰富的结婚筹备工具和服务,包括一键生成结婚请柬、婚礼策划、婚纱摄影、婚宴预订等。婚礼纪旨在为新人提供全…...

M1M2 MAC安装windows11 虚拟机的全过程
M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机,将途中遇到的坑总结一下。 1、虚拟机软件:vmware fusion 13.6 或者 parallel 19 ? 结论是:用parellel 19。 这两个软件都安装过࿰…...

监控架构-Prometheus-普罗米修斯
目录 1. Prometheus概述 2. Prometheus vs Zabbix 3. Prometheus极速上手指南 3.1 时间同步 3.2 部署Prometheus 3.3 启动Prometheus 3.4 Prometheus监控架构 3.5 补充 配置页面 简单过滤 查看数据 查看图形 http://prometheus.oldboylinux.cn:9090/metrics显示…...

Kylin Server V10 下自动安装并配置Kafka
Kafka是一个分布式的、分区的、多副本的消息发布-订阅系统,它提供了类似于JMS的特性,但在设计上完全不同,它具有消息持久化、高吞吐、分布式、多客户端支持、实时等特性,适用于离线和在线的消息消费,如常规的消息收集、…...

windows环境下cmd窗口打开就进入到对应目录,一般人都不知道~
前言 很久以前,我还在上一家公司的时候,有一次我看到我同事打开cmd窗口的方式,瞬间把我惊呆了。原来他打开cmd窗口的方式,不是一般的在开始里面输入cmd,然后打开cmd窗口。而是另外一种方式。 我这个同事是个技术控&a…...

企微SCRM价格解析及其性价比分析
内容概要 在如今的数字化时代,企业对于客户关系管理的需求日益增长,而企微SCRM(Social Customer Relationship Management)作为一款新兴的客户管理工具,正好满足了这一需求。本文旨在为大家深入解析企微SCRM的价格体系…...

【SpringMVC】记录一次Bug——mvc:resources设置静态资源不过滤导致WEB-INF下的资源无法访问
SpringMVC 记录一次bug 其实都是小毛病,但是为了以后再出毛病,记录一下: mvc:resources设置静态资源不过滤问题 SpringMVC中配置的核心Servlet——DispatcherServlet,为了可以拦截到所有的请求(JSP页面除外…...

【React】React 生命周期完全指南
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 React 生命周期完全指南一、生命周期概述二、生命周期的三个阶段2.1 挂载阶段&a…...

【NLP】使用 SpaCy、ollama 创建用于命名实体识别的合成数据集
命名实体识别 (NER) 是自然语言处理 (NLP) 中的一项重要任务,用于自动识别和分类文本中的实体,例如人物、位置、组织等。尽管它很重要,但手动注释大型数据集以进行 NER 既耗时又费钱。受本文 ( https://huggingface.co/blog/synthetic-data-s…...

【C++练习】二进制到十进制的转换器
题目:二进制到十进制的转换器 描述 编写一个程序,将用户输入的8位二进制数转换成对应的十进制数并输出。如果用户输入的二进制数不是8位,则程序应提示用户输入无效,并终止运行。 要求 程序应首先提示用户输入一个8位二进制数。…...

Vue功能菜单的异步加载、动态渲染
实际的Vue应用中,常常需要提供功能菜单,例如:文件下载、用户注册、数据采集、信息查询等等。每个功能菜单项,对应某个.vue组件。下面的代码,提供了一种独特的异步加载、动态渲染功能菜单的构建方法: <s…...

云技术基础学习(一)
内容预览 ≧∀≦ゞ 声明导语云技术历史 云服务概述云服务商与部署模式1. 公有云服务商2. 私有云部署3. 混合云模式 云服务分类1. 基础设施即服务(IaaS)2. 平台即服务(PaaS)3. 软件即服务(SaaS) 云架构云架构…...

【优选算法篇】微位至简,数之恢宏——解构 C++ 位运算中的理与美
文章目录 C 位运算详解:基础题解与思维分析前言第一章:位运算基础应用1.1 判断字符是否唯一(easy)解法(位图的思想)C 代码实现易错点提示时间复杂度和空间复杂度 1.2 丢失的数字(easy࿰…...

MFC工控项目实例二十九主对话框调用子对话框设定参数值
在主对话框调用子对话框设定参数值,使用theApp变量实现。 子对话框各参数变量 CString m_strTypeName; CString m_strBrand; CString m_strRemark; double m_edit_min; double m_edit_max; double m_edit_time2; double …...

Java | Leetcode Java题解之第546题移除盒子
题目: 题解: class Solution {int[][][] dp;public int removeBoxes(int[] boxes) {int length boxes.length;dp new int[length][length][length];return calculatePoints(boxes, 0, length - 1, 0);}public int calculatePoints(int[] boxes, int l…...

【前端】Svelte:响应性声明
Svelte 的响应性声明机制简化了动态更新 UI 的过程,让开发者不需要手动追踪数据变化。通过 $ 前缀与响应式声明语法,Svelte 能够自动追踪依赖关系,实现数据变化时的自动重新渲染。在本教程中,我们将详细探讨 Svelte 的响应性声明机…...

PostgreSQL 性能优化全方位指南:深度提升数据库效率
PostgreSQL 性能优化全方位指南:深度提升数据库效率 别忘了请点个赞收藏关注支持一下博主喵!!! 在现代互联网应用中,数据库性能优化是系统优化中至关重要的一环,尤其对于数据密集型和高并发的应用而言&am…...

Flutter鸿蒙next 使用 BLoC 模式进行状态管理详解
1. 引言 在 Flutter 中,随着应用规模的扩大,管理应用中的状态变得越来越复杂。为了处理这种复杂性,许多开发者选择使用不同的状态管理方案。其中,BLoC(Business Logic Component)模式作为一种流行的状态管…...

Gen-RecSys——一个通过生成和大规模语言模型发展起来的推荐系统
概述 生成模型的进步对推荐系统的发展产生了重大影响。传统的推荐系统是 “狭隘的专家”,只能捕捉特定领域内的用户偏好和项目特征,而现在生成模型增强了这些系统的功能,据报道,其性能优于传统方法。这些模型为推荐的概念和实施带…...

Android 重新定义一个广播修改系统时间,避免系统时间混乱
有时候,搞不懂为什么手机设备无法准确定义系统时间,出现混乱或显示与实际不符,需要重置或重新设定一次才行,也是真的够无语的!! vendor/mediatek/proprietary/packages/apps/MtkSettings/AndroidManifest.…...

第3章:角色扮演提示-Claude应用开发教程
更多教程,请访问claude应用开发教程 设置 运行以下设置单元以加载您的 API 密钥并建立 get_completion 辅助函数。 !pip install anthropic# Import pythons built-in regular expression library import re import anthropic# Retrieve the API_KEY & MODEL…...