面向对象特征

面向对象三大特征:封装、继承、多态

方法

假设有两个方法,一个方法的接收者,是指针类型,一个方法的接收者是值类型,

那么:

对于值传递的变量和指针类型的变量,这两个方法的区别

如果这两个方法是为了实现一个接口,那么这两个方法都可以调用吗?

如果方法是嵌入到其他结构体中的,那么上面两种情况又是怎样的?

首先解决第一个问题:

对于值传递的变量和指针类型的变量,这两个方法的区别?

如下图测试示意:

很明显看出值传递和引用的区别。

封装

那么现在进入结构体的定义使用

定义

// 定义一个结构体
type Hero struct {Name string ``Age  intSex  int
}

上述就是定义了一个结构体,那怎么使用呢

package mainimport "fmt"type Person struct {Name stringAge  int
}func main() {var p Personp.Name = "张三"var p2 Person = Person{"lisi", 15}p3 := Person{"wangwu", 15}fmt.Println(p, p2, p3)}

如图运行: 

根据结构体来进一步构建类

其实类就是由结构体进一步绑定方法实现的。

package mainimport "fmt"// 定义一个结构体
type Hero struct {Name string ``Age  intSex  int
}func (hero Hero) SetName(name string) {//hero是调用方法的一个副本hero.Name = name}func (hero Hero) GetName() string {return hero.Name}func (hero Hero) Show() {fmt.Println("hero = ", hero)}func main() {var hero Hero = Hero{"赵六", 18, 1}hero.Show()hero.SetName("王五")hero.Show()}

明明在主函数进行了修改,但还是属性没有发送变化,是为什么呢? 

其实是在给结构体挂上方法的时候,使用的是值传递

hero是一个方法的对象的一个副本

那么怎么解决呢?(使用指针)

package mainimport "fmt"// 定义一个结构体
type Hero struct {Name string ``Age  intSex  int
}func (hero *Hero) SetName(name string) {//hero是调用方法的一个副本hero.Name = name
}func (hero *Hero) GetName() string {return hero.Name
}func (hero *Hero) Show() {fmt.Println("hero = ", *hero)
}
func main() {var hero Hero = Hero{"赵六", 18, 1}hero.Show()hero.SetName("王五")hero.Show()}

如图:属性修改成功 

 

注意:

类名首字母大写,标识其他包也能够访问

同理,属性、方法 大小写也是标识是否可以被外部访问

继承

语法就是在子类中添加上父类即可。如下代码:

package mainimport "fmt"type Person struct {Name stringAge  int
}func (this *Person) Eat() {fmt.Println("Person Eat()...")
}func (this *Person) Walk() {fmt.Println("Person Walk()...")
}type SuperMan struct {Person //标识SuperMan继承了Person类的方法level int
}// 重定义父类的方法Eat()
func (this *SuperMan) Eat() {fmt.Println("SuperMan Eat()...")
}// 子类的新方法
func (this *SuperMan) Fly() {fmt.Println("SuperMan Fly()...")
}func main() {p := Person{"zhangsan", 18}p.Eat()p.Walk()s := SuperMan{Person{"张三", 18}, 0}s.Eat()s.Fly()s.Walk()var s1 SuperMans1.Name = "lisi"}

多态(依靠interface接口)

要素:

  • 父类(接口)
  • 子类(实现了父类的全部结构)
  • 父类类型的变量(指针)指向子类的具体变量
package mainimport "fmt"type AnimalIF interface {Sleep()           //让动物睡觉GetColor() string //获取动物颜色GetType() string  //获取动物种类}// 具体的类
type Cat struct {//AnimalIF 继承接口没必要,只要定义方法实现就可以了,相当于继承了color string
}func (this *Cat) Sleep() {fmt.Println("小猫睡觉")
}func (this *Cat) GetColor() string {return this.color
}
func (this *Cat) GetType() string {return "Cat"
}type Dog struct {color string
}func (this *Dog) Sleep() {fmt.Println("小狗睡觉")
}
func (this *Dog) GetColor() string {return this.color
}
func (this *Dog) GetType() string {return "Dog"
}func showAnimal(animal AnimalIF) {animal.Sleep()fmt.Println(animal.GetColor())fmt.Println(animal.GetType())
}func main() {var cat AnimalIFcat = &Cat{"yellow"}var dog AnimalIF = &Dog{"blue"}showAnimal(cat)showAnimal(dog)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3225317.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

文本引导I2I迈向统一!北大王选所提出FCDiffusion:端到端适用于各种图像转换任务

文章链接:https://arxiv.org/pdf/2407.03006 github地址:https://github.com/XiangGao1102/FCDiffusion 最近,大规模的文本到图像(T2I)扩散模型在图像到图像(I2I)转换中展现出强大的能力,允许通过用户提供的文本提示进行开放域的图…

Kithara和OpenCV (一)

Kithara使用 OpenCV 目录 Kithara使用 OpenCV简介需求和支持的环境构建 OpenCV 库使用 CMake 进行配置以与 Kithara 一起工作 使用 OpenCV 库设置项目运行 OpenCV 代码图像采集和 OpenCV自动并行化限制和局限性1.系统建议2.实时限制3.不支持的功能和缺失的功能4.显示 OpenCV 对…

设计模式之Facade设计模式

Facade设计模式,也称为外观模式,是一种结构型设计模式,它主要用于为子系统中的一组接口提供一个统一的高层接口,从而使得子系统更加容易使用。以下是关于Facade设计模式的详细介绍: 一、定义 Facade模式为多个复杂的…

XTuner 微调 LLM:1.8B, 部署

扫码立刻参与白嫖A100,书生大模型微调部署学习活动。亲测有效 内容来源:Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHubLLM Tutorial. Contribute to InternLM/Tutorial development by creating an account on G…

Mattermost:一个强大的开源协作平台

Mattermost是一个强大的开源协作平台,基于云原生架构,为企业级用户提供安全、可扩展且自托管的消息传递解决方案。 一、平台特点 开源与定制性:Mattermost是一个开源项目,用户可以根据自身需求定制界面、添加功能或扩展其功能&am…

深入探索大语言模型

深入探索大语言模型 引言 大语言模型(LLM)是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理(NLP)任务中展示了惊人的能力,从文本生成到问答系统,无所不包。本文将从多个角度全面介绍大语…

文字识别 -- eSearch v1.12.1

软件简介 eSearch是一款功能强大的跨平台软件工具,主要功能包括截屏、OCR文字识别、搜索、翻译、贴图、以图搜图以及录屏等。它不仅支持多屏幕、窗口和控件选择、长截屏等高级截屏功能,还支持离线和在线OCR服务,可进行自定义OCR模型和字典设…

【基于R语言群体遗传学】-15-溯祖理论coalescence

在群体遗传学中,一个非常重要的概念是关注谱系的汇聚(遗传线索的汇合),当我们回溯过去几代人口时。在之前的博客中,我们几乎只处理了随时间推移基因变化的“正向”模拟。 群体遗传学_tRNA做科研的博客-CSDN博客 然而&…

【漏洞复现】时空智友ERP——uploadStudioFile——任意文件上传

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 时空智友ERP是专为医药等行业设计的综合性企业资源规划系统&…

【漏洞复现】锐捷校园网自助服务系统 任意文件读取

声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 锐捷校园网自助服务系统是用于学校网络管理的一个平台,login_judge.jsf接口存在任意文件读取…

现在国内的ddos攻击趋势怎么样?想了解现在ddos的情况该去哪看?

目前,国内的DDoS攻击趋势显示出以下几个特征: 攻击频次显著增加:根据《快快网络2024年DDoS攻击趋势白皮书》,2023年DDoS攻击活动有显著攀升,总攻击次数达到1246.61万次,比前一年增长了18.1%。 攻击强度和规…

Collection接口及遍历集合的方式Iterator接口、增强for循环的介绍和使用

Collection接口 概述:单列集合的顶级接口格式:其中泛型决定了集合中能存储什么类型的数据,可以统一元素类型,泛型中只能写引用数据类型,如果不写,默认Object类型。等号前面的泛型必须写,等号后…

增强现实(AR)与虚拟现实(VR)的区别?

随着科技的飞速发展,增强现实(AR)与虚拟现实(VR)技术在各个领域展现出巨大的潜力和应用前景。这两种技术虽然在体验和实现方式上有所不同,但都为用户提供了全新的感知体验。本文将详细解析AR和VR的概念、区…

MySQL 面试相关问题

1. MySQL 基础问题1.1 为什么用MySQL?1.2 表属性类型 varchar 和 char 的区别?1.2 什么时候用 varchar 和 char?1.3 Datetime 和 Timestamp 的区别?1.4 一个SQL语句的执行过程,表述下? 2. MySQL 存储引擎相…

凝思安全操作系统安装部署

原文链接:凝思安全操作系统安装部署 Hello,大家好啊!今天给大家带来一篇关于凝思安全操作系统安装部署的文章。凝思安全操作系统是一款注重安全和隐私保护的操作系统,适用于各种高安全性需求的场景。本文将详细介绍如何安装和部署…

万字学习——DCU编程实战

参考资料 2.1 DCU软件栈(DCU ToolKit, DTK) DCU 开发与使用文档 (hpccube.com) DCU软件栈 DCU的软件栈—DCU Toolkit(DTK) HIP(Heterogeneous-Compute Interface for Portability)是AMD公司在2016年提出…

【C++题解】1405 - 小丽找潜在的素数?

问题:1405 - 小丽找潜在的素数? 类型:进制转换 题目描述: 小丽同学在编程中学到了二进制数的概念,她发现,有些二进制数,如果转为 10 进制,就是素数,小丽把这些数称为潜…

机器视觉/自然语言/生成式人工智能综合应用实验平台-实训平台-教学平台

AIGC是人工智能1.0时代进入2.0时代的重要标志,MIT 科技评论也将Al合成数据列为2022年十大突破性技术之一,甚至将生成性Al(Generative Al) 称为是AI领域过去十年最具前景的进展。同时,AIGC领域岗位需求数量暴涨。高校方面在人工智能专业与机器…

【RHCE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

【C++高阶】高效数据存储:理解并模拟实现红黑树Map与Set

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:了解 红黑树 🌹🌹期待您的关注 🌹🌹 ❀模拟实现Map与Set 📒1.…