java Object 万字详解 (通俗易懂)
基本介绍
构造方法
成员方法
hashCode()
getClass()
toString()
equals()
finalize()
JavaBean重写Object类的方法
重写toString
重写equals
一、基本介绍
Object类是java类层次最顶层的基类(父类),所有类都是直接或间接继承自Object类,因此,所有类都可以使用Object类中的成员方法。
Object类属于java.base模块,java.lang包下(java.lang包下的类可以直接使用,不需要导包),如下图所示 :

二、构造方法
Object() : 构造一个对象。
如下图所示 :

Object类仅一个构造器,根据继承机制,所有子类在初始化前都会默认优先调用该构造器。
三、成员方法
0.总览 :
Object类常用的方法,如下图所示 :

像notify,wait这些与线程相关的
方法,因为我们还没有讲到java高级篇——多线程的内容,因此这里不做说明。我们来一起看一看up用粗线条标注出的这五个方法。
①int hashCode() | 返回当前对象的哈希码值,该方法通过对象的地址值进行计算,不同对象的返回值一般不同 |
②Class <?> getClass() | 返回调用此方法的对象的运行时类对象(字节码文件对象) |
③String toString() | 返回该对象的字符串表示(默认打印的是"全类名 + @ + 哈希码值的十六进制") |
④boolean equals() | 返回其他某个对象是否与此对象“相等”(默认情况下比较的是两个对象的引用) |
⑤void finalize() | 当“垃圾回收器”确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法 |
1.hashCode() :
其实我们在上一专题的封装篇中,就已经提到过hashCode方法,并且还给出了hashCode的应用和常规协定。不知道大家是否还有印象,如果忘了也不要紧,这里再给大家演示一下 :
演示 :
up以HashCode_类为测试类,以Student类为演示类。
代码如下 :
package knowledge.api.objectmethods;/*** @author : Cyan_RA91. hashCode() : 返回当前对象的哈希码值,该方法通过对象的地址值进行计算,不同对象的返回值一般不同。*/
public class HashCode_ {public static void main(String[] args) {//创建学生类对象Student student_0 = new Student();Student student_1 = new Student();//比较不同学生对象的哈希码值System.out.println("student_0对象的哈希码值为 : " + student_0.hashCode());System.out.println("student_1对象的哈希码值为 : " + student_1.hashCode());System.out.println("student_0对象的哈希码值为 : " + student_0.hashCode());}
}class Student {}
运行结果 :

从运行结果可以看出,当我们打印不同对象的哈希码值时,得到的结果不同。而同一对象的哈希码值相同。
2.getClass() :
getClass方法需要用一个Class类来作接收,即获取字节码文件对象(即Class对象)。并且getClass方法要通过对象来调用,因此使用前一定要创建一个对象。这个方法呢,其实我也讲过😂。只不过是在未来的java反射专题(虽然我已经写好了)。同样的,不要紧,再来演示一下不就完了。
演示 :
up以GetClass_类为测试类,以Grape类和Apple类作为演示类。
代码如下 :
package knowledge.api.objectmethods;/*** @author : Cyan_RA92.Class <?> getClass() : 返回调用此方法的对象的运行时类对象(字节码文件对象)*/
public class GetClass_ {public static void main(String[] args) {//创建葡萄类对象Grape grape_0 = new Grape();Grape grape_1 = new Grape();//获取葡萄类的Class对象Class class_grape_0 = grape_0.getClass();Class class_grape_1 = grape_1.getClass();Class grape_0_class = grape_0.getClass();//比较通过葡萄类不同对象获得的葡萄类的Class对象有什么不同。System.out.println("grape_0对象的字节码文件对象是:" + class_grape_0);System.out.println("grape_1对象的字节码文件对象是:" + class_grape_1);System.out.println("grape_0对象的字节码文件对象是:" + grape_0_class);System.out.println("--------------------------------------------------");//创建苹果类对象Apple apple_0 = new Apple();Apple apple_1 = new Apple();//获取苹果类的Class对象Class apple_0_class = apple_0.getClass();Class apple_1_class = apple_1.getClass();//比较通过苹果类不同对象获得的苹果类的Class文件有什么不同System.out.println("apple_0对象的字节码文件对象是:" + apple_0_class);System.out.println("apple_1对象的字节码文件对象是:" + apple_1_class);}
}class Grape {}
class Apple {}
运行结果 :

从输出结果我们可以看出,一个类只有一个字节码文件对象。我们通过创建同一个类的不同对象来分别调用getClass方法,得到的Class对象是相同的。而不同类的字节码文件是不同的。同时,我们也能发现字节码文件对象的格式为“class + 类的正名(类的正名 = 包类+ 类名)”。
3.toString() :
关于toString方法要注意一点 : 当我们直接输出一个对象时,默认调用toString方法。
演示 :
up以ToString_类为测试类,以Animal类为演示类。
代码如下 :
package knowledge.api.objectmethods;/*** @author : Cyan_RA93. toString() : 返回该对象的字符串表示(默认打印的是"全类名 + @ + 哈希码值的十六进制")*/
public class toString_ {public static void main(String[] args) {//创建Animal类对象Animal animal_0 = new Animal();Animal animal_1 = new Animal();Animal animal_2 = new Animal();//toString() 方法的返回值类型为String类型(也可不做接收)String animal_0_string = animal_0.toString();System.out.println("animal_0对象的字符串表示是:" + animal_0_string);System.out.println(animal_0);System.out.println("------------------------------------------------");System.out.println("animal_1对象的字符串表示是:" + animal_1.toString());System.out.println("animal_2对象的字符串表示是:" + animal_2.toString());}
}class Animal {}
运行结果 :

运行结果可以验证我们之前的结论——当我们直接输出一个对象时,默认调用toString方法。而且toString() 方法默认打印的的确是“类的正名 + @ + 哈希码值的十六进制”。当然,可能有p小将(Personable小将,指风度翩翩的人)要怀疑这里“@”后面跟着的一大堆玩意儿是不是当前对象哈希码值的十六进制?
哎😂,其实验证方法也很简单,你先把这里的某个十六进制数转换成十进制数,然后利用hashCode() 方法打印出该对象的哈希值,比对一下就知道了。当然up这里就不演示了,绝不是因为我懒!是因为我已经明确知道结论了,才给大家演示的,对不对?
这不是重点。大家有没有想过,toString() 方法既然要打印出对象的字符串表示形式,那肯定是要有用的啊,最起码给人直观想象的机会。但是现在就这一堆乱七八糟的玩意儿,给谁第一眼看了也觉得糟心。那怎么办?诶~,别急,等等我们讲到子类重写Object类成员方法时再说。
4.equals() :
Object类中的equals()方法默认比较的是两个对象的引用。
演示 :
up以Equals_类为测试类,以Teacher类为演示类。
代码如下 :
package knowledge.api.objectmethods;/*** @author : Cyan_RA94. equals() : 返回其他某个对象是否与此对象“相等”(默认情况下比较的是两个对象的引用)*/
public class Equals_ {public static void main(String[] args) {//创建教师类对象Teacher teacher_0 = new Teacher();Teacher teacher_1 = new Teacher();//通过对象调用equals() 方法System.out.println("teacher_0和teacher_1是一个对象吗?" + teacher_0.equals(teacher_1));System.out.println("teacher_0和teacher_0是一个对象吗?" + teacher_0.equals(teacher_0));}
}class Teacher {}

相信大家看代码也能感觉出来了——这方法的原版没什么意义!你只比较个地址值有个啥用?雷声大雨点小!我们创建对象的目的是什么?创建对象是为了描述某一类事物的一个具体存在,每个对象的属性和行为都不尽相同。所以,我想你也猜到了,这个方法也要在子类重写的。
5.finalize() :
垃圾回收机制的调用,是由系统来决定的,即有自己的GC算法;也可以通过System.gc()来尝试主动触发,虽然也有可能无效。你也可以重写此方法,做一些释放资源的操作。
finalize()方法在实际开发中用的并不多,对于初学者几乎用不到,因此这里不做演示。
四、JavaBean重写Object类的方法
0.需求 :
实际开发中,通常需要将对象转换成字符串形式进行运输,也需要对即将使用的对象进行相等判断。而toString() 方法和equals() 方法本身的特点无法实现以上需求。因此,这时候就需要我们定义标准JavaBean类,并重写Object类的toString() 方法 和 equals() 方法。
IDEA中提供了自动重写toString和equals方法的机制,可以使用快捷键Alt + Enter,选择要定义或重写的方法,即可自动完成。
1.重写toString() 方法
up以ToString_EX类为测试类,以Teacher类为演示类。
代码如下 :
package knowledge.api.objectmethods.override_;/*** @author : Cyan_RA9* @purpose : 重写Object类的toString方法*/
public class ToString_EX {public static void main(String[] args) {Teacher teacher_0 = new Teacher();teacher_0.setName("王斌");teacher_0.setAge(44);teacher_0.setSalary(20000);Teacher teacher_1 = new Teacher("许银川", 48, 100000);//直接输出对象,默认调用toString() 方法System.out.println(teacher_0);System.out.println(teacher_1);}
}class Teacher { /** 以JavaBean标准来敲 *///成员变量private String name;private int age;private double salary;//构造器public Teacher() {}public Teacher(String name, int age, double salary) {this.name = name;this.age = age;this.salary = salary;}//getter,setter方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}//重写的toString() 方法@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}
}
运行结果 :

可以看到,重写后的toString方法本身并不复杂,就是返回了一个拼接后的字符串。而当我们在Teacher类中重写toString方法后,输出Teacher类对象调用的就是我们重写后的toString方法,成功打印出了Teacher类对象的相关信息。因此,重写toString() 方法的目的,往往是将对象的信息能够显式地打印出来,让我们看到。
2.重写equals() 方法(重点)
up以Equals_EX类为测试类,以Animal类为演示类。
代码如下 :
package knowledge.api.objectmethods.override_;import java.util.Objects;/*** @author : Cyan_RA9* @purpose : 重写Object类的equals方法*/
public class Equals_EX {public static void main(String[] args) {//利用带参构造创建不同Animal类对象Animal animal_0 = new Animal("猫", 15);Animal animal_1 = new Animal("狗", 12);Animal animal_2 = new Animal("猫", 15);//查看不同Animal对象的信息System.out.println("animal_0对象的信息为:" + animal_0);System.out.println("animal_1对象的信息为:" + animal_1);System.out.println("animal_2对象的信息为:" + animal_2);System.out.println("----------------------------------------------");//通过重写后的equals方法比较不同对象的信息是否相同System.out.println("animal_0对象和animal_1对象信息相同吗?" + animal_0.equals(animal_1));System.out.println("animal_0对象和animal_2对象信息相同吗?" + animal_0.equals(animal_2));System.out.println("animal_1对象和animal_2对象信息相同吗?" + animal_1.equals(animal_2));}
}class Animal { /** JavaBean标准 *///成员变量private String species_name;private int average_age;//构造器public Animal() {}public Animal(String species_name, int average_age) {this.species_name = species_name;this.average_age = average_age;}//getter,setter方法public String getSpecies_name() {return species_name;}public void setSpecies_name(String species_name) {this.species_name = species_name;}public int getAverage_age() {return average_age;}public void setAverage_age(int average_age) {this.average_age = average_age;}//重写equals方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Animal animal = (Animal) o;return average_age == animal.average_age && species_name.equals(animal.species_name);}@Overridepublic int hashCode() {return Objects.hash(species_name, average_age);}//重写toString方法以打印出对象的信息@Overridepublic String toString() {return "Animal{" +"species_name='" + species_name + '\'' +", average_age=" + average_age +'}';}
}
运行结果 :

我们先来解读一下关于equals方法的重写 :
//重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animal animal = (Animal) o;
return average_age == animal.average_age &&
species_name.equals(animal.species_name);
}
解读①——该方法的形参列表是一个Object类型的对象,也就是多态了。
解读②——方法第一行是一个if条件语句的判断,判断条件“this == o”中,用到了比较运算符“==”,我们之前讲过,==比较运算符如果判断引用类型,判断的是二者的地址是否相同,即判定是否为同一对象;因此这里就是像看看你要判断的对象是不是它本身,如果判断为true,意思就是你拿一个对象和它自己比去了。那还用比吗😅,这不就和你照镜子一样,比个🐔儿?因此直接return true,不再进行后续的比较。
解读③——接着,又来了第二个if条件语句的判断,判断条件“o == null || getClass() != o.getClass())”中,由逻辑运算符短路或“||”分为了两部分,短路或的判断中,从左向右执行,且只要满足第一部分的判断,之后的部分便不再执行。第一部分“o==null”,是判断传入的对象是否为空。你想,一个在堆空间中真正存在的对象和一个空能比出个啥来吗?就像你比身高,让你和空气比,这不虚空对线呢😅?因此,如果传入的对象为空,立刻return false,没啥比头。来看第二部分“getClass() != o.getClass())”,这不我们前面刚说过getClass方法么,巧了😋。其实,第一个getClass() 前面隐含了“this.”,当然你也可以手动加上。这部分判断是看你传入的对象和调用该方法的对象是否是同一类对象。因为一个类的只有一个字节码文件,因此同一个类的字节码文件对象一定相同。你想,如果一条狗和你手里的泡泡糖都叫“大大”,那**能比么?因此,如果第一部分判断条件不通过,说明传入的对象不为空;如果第二部分判断条件不通过,说明传入的对象和调用方法的对象是同一类型的对象,可做后续的比较。反之,return false,不再进行后续的判断。
解读④——当前两个if条件语句都没有把o对象拦下来后,我们已经确定传入的对象既不是调用方法的对象本身,也不为空,并且和调用方法的对象是同一类对象。这时候它来了一个强制转型“Animal animal = (Animal) o;”,没毛病吧,妥妥地强转,原因估计你也猜到了,现在的o对象是一个Object类型的对象,根据多态的弊端,父类引用不能直接使用子类对象的特有成员。因此,这里要把o对象进行强制向下转型,以改变o对象的编译类型,使得做接收后的新的引用变量可以调用要判断类型(此处为Animal类)的特有成员,以便进行后续的判断。
解读⑤——最后就可以开始判断了。IDEA也很干脆,直接return了一个boolean类型。注意,具体的比较语句中up还要说一下,判断非引用类型直接用比较运算符“==”即可,如果判断的是引用类型,比如说字符串,要使用“字符串.equals()”的形式来判断,很明显字符串属于String类,而String类中重写了Object类的equals方法,可以比较两个字符串的内容是否相同。
其次,看到代码后,可能会有小伙伴儿们疑惑——
为什么我用快捷键重写equals方法时,IDEA会默认同时重写equals方法和hashCode方法呢?
这要说起来可就大费篇章了😂。这与hashCode的常规协定有关,也是为了避免某些程序执行出现异常的情况。现在不需要深究,大家了解一下即可。等你到找工作面试的时候,你不想懂也得懂它了🤗。
五、总结
其实,关于Object类中的方法,大家只要理解这几个原初的方法,并且掌握toString方法和equals方法的重写问题就没问题了。
🆗,以上就是我们关于API常用类Object类内容分享的全部内容了,下一节String类我们不见不散,感谢阅读!
相关文章:

java Object 万字详解 (通俗易懂)
基本介绍构造方法成员方法hashCode()getClass()toString()equals()finalize()JavaBean重写Object类的方法重写toString重写equals一、基本介绍Object类是java类层次最顶层的基类(父类),所有类都是直接或间接继承自Object类,因此&a…...

Java并发简介(什么是并发)
文章目录并发概念并发和并行同步和异步阻塞和非阻塞进程和线程竞态条件和临界区管程并发的特点提升资源利用率程序响应更快并发的问题安全性问题缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题保证并发安全的思路互斥同步(阻塞同步…...

团队API管理工具-YAPI
团队API管理工具-YAPI 推荐一款接口管理平台,操作简单、界面友好、功能丰富、支持markdown语法、可使用Postman导入、Swagger同步数据展示、LDAP、权限管理等功能。 YApi是高效、易用、功能强大的api管理平台,旨在为开发、产品、测试人员提供更优雅的接…...

学习记录 --- Pytorch优化器
文章目录参考文献什么是优化器optimizer的定义optimizer的属性defaultsstateparam_groupsoptimizer的方法zero_grad()step()add_param_group()state_dict()、load_state_dict()优化一个网络同时优化多个网络当成一个网络优化当成多个网络优化只优化网络的某些指定的层调整学习率…...
Flink State 状态后端分析
flink状态实现分析 state * State* |* -------------------InternalKvState* | |* MergingState |* | |* …...

和年薪30W的阿里测开工程师聊过后,才知道我的工作就是打杂的...
前几天和一个朋友聊面试,他说上个月同时拿到了腾讯和阿里的offer,最后选择了阿里。 阿里内部将员工一共分为了14个等级,P6是资深工程师,P7是技术专家。 其中P6和P7就是一个分水岭了,P6是最接近P7的不持股员工&#x…...
C#开发的OpenRA的界面布局数据加载
C#开发的OpenRA的界面布局数据加载 当显示完成加载界面之后,就是进行其它内容处理。 因为后面内容的加载会比较长时间,所以首先显示加载界面是一种非常友好的方法。 因此在软件设计里,尽可能先显示界面,让用户先看到程序正在运行, 然后再处理时间长的加载。如果不这样做,…...

并查集结构
文章目录并查集特点构建过程查找两个元素是否是同一集合优化查找领头元素设置两个元素为同一集合构建结构应用场景并行计算集合问题并查集特点 对于使用并查集构建的结构,可以使得查询两个元素是否在同一集合,以及合并集合的操作无限接近O(1) 构建过程…...

全国CSM敏捷教练认证将于2023年3月25-26开班,报名从速!
CSM,即Certified Scrum Master,是Scrum联盟发起的Scrum认证。 CSM可以帮助团队正确使用Scrum,从而提高项目整体成功的可能性。 CSM深刻理解Scrum的价值观、实践以及Scrum框架。 CSM是“服务型领导”,帮助Scrum团队一起紧密合作。 …...

JavaEE进阶第六课:SpringBoot ⽇志⽂件
上篇文章介绍了SpringBoot配置文件,这篇文章我们将会介绍SpringBoot ⽇志⽂件 荔枝1.日志有什么用2.自定义日志输出2.1获取程序日志对象2.2使用相关方法输出日志2.3日志级别2.3.1日志级别的作用2.3.2日志级别如何设置2.4日志格式3.持久化日志4.更简单的日志输出4.1使…...
外置MOS管平均电流型LED降压恒流驱动器
产品描述 AP5125 是一款外围电路简单的 Buck 型平均电 流检测模式的 LED 恒流驱动器,适用于 8-100V 电压 范围的非隔离式大功率恒流 LED 驱动领域。芯片采用 固定频率 140kHz 的 PWM 工作模式, 利用平均电 流检测模式,因此具有优异的负载调整…...

python+pytest接口自动化(6)-请求参数格式的确定
我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json,那么在…...

开发手册——一、编程规约_3.代码格式
这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码…...
十七、Django-restframework之序列化器(二)
1. 序列化器 REST framework提供了一个serializer类,它可以非常方便的序列化模型实例和查询集为JSON或者其他内容形式。它还提供反序列化,允许在验证传入数据后将解析的数据转换回复杂类型。 2. 定义序列化器 在crm应用目录下创建serializers.py文件&a…...

python GUI图形化编程-----wxpython
一、python gui(图形化)模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建 Pyqt :是python最复杂也是使用最广泛的图形化 Wx :是python当中居中的一个图形化,学习结构很清晰 Pywin :是pyth…...
【Python 】yyyy-MM-dd HH:mm:ss 时间格式 时间戳 全面解读超详细
时间格式 时间格式(协议)描述gg时期或纪元。y不包含纪元的年份。不具有前导零。yy不包含纪元的年份。具有前导零。yyyy包含纪元的四位数的年份。M月份数字。一位数的月份没有前导零。MM月份数字。一位数的月份有一个前导零。MMM月份的缩写名称,在AbbreviatedMonthN…...

【C++】C++11 异常
目录 1. C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1. 异常的抛出和捕获 3.2. 在函数调用链中异常栈展开匹配原则 3.3. 异常的重新抛出 3.4. 异常安全 3.5. 异常规范 4.自定义异常体系 5. C标准库的异常体系 6. 异常的优缺点 6.1. C异常的优点&…...

关于Thread.start()后的困惑、imap
在for循环中,接着开thread,开完就start,当时有个困惑,就是比如开的一个thread的这个start执行完,但是这个for循环还没执行完,那程序会跑到for循环的后面逻辑吗?比如下面13行for循环开始开第一个…...

qml学习之qwidget与qml结合使用并调用信号槽交互
学习qml系列之一说明: 学习qml系列之qwiget和qml信号槽的交互使用,并在qwidget中显示qml界面 在qml中发送信号到qwidget里 在qwidget里发送信号给qml 在qwidget里面调用qml界面方式 方式一:使用QQuickView 这个是Qt5.0中提供的一个类&…...
【 华为OD机试 2023】 组装新的数组(C++ Java JavaScript Python)
文章目录 题目描述输入描述输出描述备注用例题目解析C++JavaScriptJavaPython题目描述 给你一个整数M和数组N,N中的元素为连续整数,要求根据N中的元素组装成新的数组R,组装规则: R中元素总和加起来等于MR中的元素可以从N中重复选取R中的元素最多只能有1个不在N中,且比N中…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...