一.面向对象基本概念:
1.什么是面向对象编程
面向对象编程是一种编程范式或编程风格。他以类或者对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石。
2.什么是面向对象编程语言
面向对象编程语言是支持类或者对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特征的编程语言。
3.如何判定一个编程语言是否是面向对象编程语言
如果按照严格的定义,需要有现成的语法支持类、对象、四大特征才能叫面向对象编程语言。如果放宽要求的话,只要某种编程语言支持类、对象语法机制,那基本上就可以说这种编程语言是面向对象编程语言了,不一定非得要求具有所有四大特征。
4.面向对象编程与面向对象编程语言之间的关系
面向对象编程一般使用面向对象编程语言来进行。但是,不用面向对象对象语言也可以进行面向对象编程。同时,用面向对象语言写出来的代码也不一定是面向对象编程风格的,也有可能是面向过程编程风格的。
5.什么是面向对象分析和面向对象设计
面向对象分析就是要搞清楚做什么,面向对象设计就是要搞清楚怎么搞。两个阶段的产出是类的设计,包括程序被拆解为那些类,每个类之间有哪些属性方法、类与类之间如何交互等。
二.封装、抽象、继承与多态分别解决那些编程问题?
1.封装
封装也叫信息隐藏或数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据,他需要编程语言提供权限访问控制语法来支持,例如java的private、protectd、public关键字。封装存在的意思,一方面是保护数据不被随意修改,提高代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用性。示例代码:
1 public class Wallet { 2 private String id; 3 private long createTime; 4 private BigDecimal balance; 5 private long balanceLastModifiedTime; 6 // ...省略其他属性... 7 8 public Wallet() { 9 this.id = IdGenerator.getInstance().generate(); 10 this.createTime = System.currentTimeMillis(); 11 this.balance = BigDecimal.ZERO; 12 this.balanceLastModifiedTime = System.currentTimeMillis(); 13 } 14 15 // 注意:下面对get方法做了代码折叠,是为了减少代码所占文章的篇幅 16 public String getId() { return this.id; } 17 public long getCreateTime() { return this.createTime; } 18 public BigDecimal getBalance() { return this.balance; } 19 public long getBalanceLastModifiedTime() { return this.balanceLastModifiedTime; } 20 21 public void increaseBalance(BigDecimal increasedAmount) { 22 if (increasedAmount.compareTo(BigDecimal.ZERO) < 0) { 23 throw new InvalidAmountException("..."); 24 } 25 this.balance.add(increasedAmount); 26 this.balanceLastModifiedTime = System.currentTimeMillis(); 27 } 28 29 public void decreaseBalance(BigDecimal decreasedAmount) { 30 if (decreasedAmount.compareTo(BigDecimal.ZERO) < 0) { 31 throw new InvalidAmountException("..."); 32 } 33 if (decreasedAmount.compareTo(this.balance) > 0) { 34 throw new InsufficientAmountException("..."); 35 } 36 this.balance.subtract(decreasedAmount); 37 this.balanceLastModifiedTime = System.currentTimeMillis(); 38 } 39 }
2.抽象
抽象是指如何隐藏方法的具体实现,让使用者是需要关心提供了哪些功能,而不需要关心这些功能是如何实现的。抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代码的可扩展性、可维护性,修改实现不需要改变定义,可减少代码的改动范围;另一方面,他也是处理复杂系统的有效手段,能有效过滤掉不必要关注的信息。
3.继承
继承是用来表示类之间的is-a关系,java不支持多继承(可避免菱形继承问题),有些语言如C++是支持多继承的。继承主要用于提高代码复用能力。
4.多态
多态指的是子类可以替换父类,在实际的代码运行中调用子类的方法实现。多态的实现需要编程语言特殊的语法机制来支持,如继承、接口类(实现)、duck-typing(动态语言支持,如python、js等,即不需要有继承或实现关系,有相同的接口名即可)。多态可以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。
三.面相对象相比面相过程有哪些优势?
1.常见编程范式:面向对象编程、面相过程编程、函数式编程
2.什么是面向过程编程与面向过程编程语言?
- 面向过程编程也是一种编程范式或编程风格。他以过程(可以理解为方法、函数、操作)作为代码组织的基本单元,以数据(可以理解为成员变量、属性)与方法相分离为最主要的特点。面相过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
- 面向过程编程语言不支持类和对象两个语法概念,不支持丰富的面向对象编程特征(比如封装、继承、多态),仅支持面向过程编程。
3.面向对象编程相比面相过程编程有哪些优势呢?
- 对于大规模复杂程序的开发,程序的处理流程并非单一的一条主线,而是错综复杂的网状结构。面向对象编程更能应对这种复杂类型的程序开发。
- 面向对象编程语言支持丰富的特性(封装、抽象、继承、多态),利用这些特征写出来的代码具有更好的可扩展性、易复用、可维护性(如面向过程语言没有封装特性,数据可以被任意方法随意修改,代码很难维护)。个人理解这一点也是最主要的优势。
- 面向对象编程语言更加人性化、更加高级、智能(贴近人类的思考方式,同时开发效率更高,可以避免类似于c语言中内存越界、野指针、内存泄漏等问题。但程序运行效率可能更低。)。