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