1 什么是面向对象?
如果有深入学习过Java的同学一定会知道,在Java中,“万物皆对象”,而对象又有各自的属性和方法,在Java中,对象按不同类型又可以分为实体类对象、业务类对象等等。
面向对象是一种传统的软件开发方法,一种编程范式,他区别与面向过程的程序设计语言,我们来打个比方:
针对事件:学生小明要去上学
面向过程的解决方式:小明->起床->做校车->上学
面向对象的解决方式:小明->去上学
因此,面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
2 面向对象的三大特点
这是一个非常老生常谈的问题,但是Java的初学者可能会有很大一部分人没有深入理解这三个特性
- 封装:封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
比如Java中的private关键字和getter、setter方法就是一种封装,不可以单独访问对象的某个属性,而是把每个属性都放在对象来处理。
- 继承:继承简单地说就是一种层次模型,这种层次模型能够被重用。
继承会让人们想到父子关系,在Java面向对象的思想中也是如此,但不同的是在Java中子类拥有其父类的属性和方法,如果没有特殊关键字的约束,子类可以取代父类,并且一个父类能有多个子类。
- 多态:多态是指不同事物在不同场景下具有不同表现形式的能力。
多态的实际应用层面最多的就是接口和泛型,是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
3 Go语言面向对象设计
3.1 封装
代码语言:go复制type Student struct {
Peo People
Sid int
School string
}
func (stu Student) getName() string {
return stu.Peo.Name
}
//setter方法要使用指针类型,确保set的值是同一个对象
func (stu *Student) setName(name string) {
stu.Peo.Name = name
}
3.2 继承
Go语言使用结构体嵌套来实现继承
代码语言:go复制type People struct {
Id int
Name string
Age int
}
type Student struct {
Peo People
Sid int
School string
}
3.3 多态
同一个接口可以用不同的对象来实现,进而产生不同的状态。
代码语言:go复制type HelloService interface {
sayHello(name string)
}
代码语言:go复制type People struct {
Id int
Name string
Age int
}
func (peo People) sayHello(name string) {
fmt.Println("Hello " name ", I am " peo.Name)
}
代码语言:go复制type Student struct {
Peo People
Sid int
School string
}
func (stu Student) sayHello(name string) {
fmt.Println("Hello " name ", I am " stu.Peo.Name)
}
测试
代码语言:go复制import "fmt"
func main() {
stu := Student{People{1, "zs", 12}, 1, "ZZJM"}
stu.Peo.sayHello("Zs")
stu.sayHello("Ls")
fmt.Println(stu.getName())
stu.setName("ww")
fmt.Println(stu.getName())
}
结果:
代码语言:shell复制Hello Zs, I am zs
Hello Ls, I am zs
zs
ww
~
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表