面向对象四大特性
- 抽象(有时候会省略)
- 封装
- 继承
- 多态
抽象
将一类对象的共同特征提取出来构建的类。包括数据抽象和行为抽
象。抽象只关注对象有哪些行为和属性,而不关注具体的细节。
封装
利用抽象数据类型将对象的属性和对属性的操作封装起来,使之成为 一个整体。数据被保护起来,对外保留必要的接口。用户无需知道具体的细节,可以通过对象对外提供的接口来访问数据。
优点
- 减少耦合:可以独立地开发、测试、优化、使用、理解和修改
减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块 - 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能 提高软件的可重用性
- 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的
如下代码,用户不需要知道name,gender,age属性的具体细节,只能通过相应的public接口实现具体的业务,保护了代码的完整性和安全性。
public class Person {
private String name;
private int gender;
private int age;
public String getName() {
return name;
}
public String getGender() {
return gender == 0 ? "man" : "woman";
}
public void work() {
if (18 <= age && age <= 50) {
System.out.println(name + " is working very hard!");
} else {
System.out.println(name + " can't work any more!");
}
}
}
继承
继承是从已有的类中得到(派生出)继承信息产生新类的过程(is-a)。在设计模式中,继承应当遵循里氏替换原则,即子类对象必须能够替换所有父类对象。
多态
不同子类型的对象对同一消息做出不同的响应。
包括运行时多态和编译时多态。
- 运行时多态指方法的重写(程序中对象指向的具体类型要等到运行时才能够确定)。
- 编译时多态指方法的重载。
运行时多态的条件:
- 继承关系
- 重写方法
- 向上转型
public class Instrument {
public void play() {
System.out.println("Instument is playing...");
}
}
//继承
public class Wind extends Instrument {
//重写父类的方法
public void play() {
System.out.println("Wind is playing...");
}
}
//继承
public class Percussion extends Instrument {
//重写父类的方法
public void play() {
System.out.println("Percussion is playing...");
}
}
public class Music {
public static void main(String[] args) {
List<Instrument> instruments = new ArrayList<>();
//加入Wind对象
instruments.add(new Wind());
//加入Percussion对象
instruments.add(new Percussion());
for(Instrument instrument : instruments) {
//运行时多态
instrument.play();
}
}
}
Q:面向对象和面向过程的区别?用面向过程可以实现面向对象吗?
- 面向对象和面向过程的区别
- 面向过程就像是一个细心的管家,事无具细的都要考虑到。而面向对象就像是个家用电器,你只需要知道他的功能,不需要知道它的工作原理。
- 面向过程是一种是“事件”为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这些步骤实现,并按顺序调用。面向对象是以“对象”为中心的编程思想。
- 简单的举个例子:汽车发动、汽车到站
- 这对于 面向过程 来说,是两个事件,汽车启动是一个事件,汽车到站是另一个事件,面向过程编程的过程中我们关心的是事件,而不是汽车本身。针对上述两个事件,形成两个函数,之 后依次调用。(事件驱动,动词为主)
- 然而这对于面向对象来说,我们关心的是汽车这类对象,两个事件只是这类对象所具有的行为。而且对于这两个行为的顺序没有强制要求。(对象驱动,名词为主,将问题抽象出具体的对象,而这个对象有自己的属性和方法,在解决问题的时候是将不同的对象组合在一起使用)
- 用面向过程可以实现面向对象吗 ?
- 如果是 C 语言来展现出面向对象的思想,C 语言中是不是有个叫结构体的东西,这个里面有自己定义的变量 可以通过函数指针就可以实现对象
Q:面向对象开发的六个基本原则
- 单一原则:一个类应该仅有一个引起它变化的原因。
- 里氏替换原则:任何时候子类型能够替换掉它们的父类型。
- 开闭原则:软件实体应当对扩展开放,对修改关闭。
- 依赖倒置原则:要依赖于抽象,不要依赖于具体类。
- 接口隔离:不应该强迫客户依赖于他们不用的方法 。
- 最少知道原则(迪米特法则):只和你的朋友谈话。