面向对象和面向过程的区别:
小时候学过pascal,跨专业自学过c语言,都是面向过程编程
而如今学的C++,python,java都是面向对象编程。
网上所云是设计方式的不同
过程编程:你可以看到解决问题的每一个步骤,每一个步骤可能都有千丝万缕的联系。
对象编程:你仅仅能看到什么模块解决什么问题,模块之间相互独立,而怎么解决的具体过程,被黑盒化了。
虽然问题都被解决了,但是方式不同。
这样讲不通俗易懂:我认为的对象和过程的差别很简单:
1.对象编程是复杂工程项目的衍生物
2.极端点,对象编程是过程编程的优化
以前对象编程还没问世之前,那个时候的工程量还小,程序猿们用机器语言就可以解决问题,再后来,为了方便理解升级成了汇编语言,之后在发展有了c这种正常人能看得懂的语言,当时人脑对于处理几千行几万行代码还能承受,随之科技普及,项目复杂度增大时,代码的行数变为几十亿行时,人们渐渐力不从心,想办法如何能够将代码的可读性,可扩展性提高,在短时间内就可以理解清楚一个项目的逻辑,框架,于是面向对象就诞生了。
我是学工科的,其实这个趋势,第一次第二次工业革命就可见一斑,但凡一个东西一旦复杂化,就违背了我们人类使用的初衷,因为我们生来就是为了偷懒,
以前的匠人手工能做一件商品,后来机器去替代了手工。
汽车的目的是为了人们方便开车,我们不需要了解发动机的构造。
集成电路的目的是给计算机带来算力,材料性能和电路原理亦不需要我们知道。
如今,人工智能的目的是解放人类,达到人类懒之极境,我们也不用了解背后的数学奥秘。
编程也很简单:好程序
1.通俗易懂(可读性)
2.未来还能继续使用(健壮性)
3.方便增删改查功能模块(可扩展性)
4.多个项目之间可以套用(可复用性)
5.被他人改动任然问题出错不大(可维护性)
6.以最快速度完成并解决任务(低复杂度性)
总之就一个目的:遇到问题后我越省事,这个代码就越棒
这就是面向对象发展的原因。
对象与类
有句话说得好:万物皆对象,万物皆类,有的时候我在思考,计算机是不是还参考了马哲的原理。这分明就是个别和一般的辩证关系嘛!!
不信的话我个别换成对象,一般换成类,我来给大家吟诵一遍马哲辩证原理:
对象一定与类相联系而存在.对象只能通过类存在,任何对象都是类的(一部分).任何类都是对象的(本质).任何类只是大致地包括一切对象事物.任何对象都不能完全地包括在类之中,类与对象相互转化、相互联系。
当然开个玩笑,具体到一个项目的时候,类和对象都确定了,当然是那就不能相互转化了,不然就乱套了,不过上面的马哲可以很好的阐述这两者直接的关系,
类就是泛指,而对象呢,其实就是具指。
举个栗子:
当我定义鼠标为类时,此时鼠标为泛指,那么贴着联想标签的鼠标就是鼠标类的具指了。
当我定义电脑配件为类时,此时配件为泛指,那么鼠标就是配件类的具指了.
写在程序里,我们创建对象时,要将其实例化
C++
class Mouse
{
public:
int click;
//公共的行为或属性
}
int main(){
// 两种不同的创建对象方式
Mouse mouseWithLenovo = Mouse(); //栈中分配内存
Mouse *mouseWithLenovo = new Mouse();// 堆中分配内存
}
JAVA
// 创建类
public class Mouse{
String click;
}
public static void main(String[] args){
// 实例化对象
Mouse mouseWithLenovo = new Mouse();
}
继承
继承是子类继承父类的特征和和行为,使得子类对象(实例)具有父类的实例域和方法,还可以以此基础添加新方法和域来满足需求。
即子类能调用父类的方法和属性,甚至还能根据自己独有的特性重写父类的方法。
抽象类.
1.抽象类不能实例化,抽象类必须被继承。(设计阶段考虑清楚)
2.抽象类是类的一种特例规则,这种类没有描绘具体的对象的信息。
3.抽象类里可以写具体方法,也可以写抽象方法。
4.抽象类是用来捕捉子类的通用特性的 。
接口
1.接口不能用于实例化对象。
2.接口没有构造方法。
3.接口中所有的方法必须是抽象方法。(1.8以前)
1.8以后非抽象方法也可以。(方法不需要实现)
4.接口不能包含成员变量,除了 static 和 final 变量。
5.接口不是被类继承了,而是要被类实现。
6.接口支持多继承。
抽象类与接口的区别:
使用场景
1.一些方法实现时需要使用抽象类
2.多继承时使用接口
3.不断增加基础功能的时候使用抽象类
4. 当使用接口时 增加功能就需要修改每个实现了该接口的实现类
构造方法:
1.构造无参方法
构造方法是用来初始化类的成员变量,形成一个个无值的成员变量的对象。
2.构造有参方法
构造器构造一个更个性化的对象(即含有参数值的对象)
方法重载
前提
1.函数或者方法有相同的名称。
2.参数列表不相同的(包括参数个数和类型)。
3.返回值不同不算重载。
构造方法相同名称分无参有参其实是一种方法重载的一种体现。
普通方法相同名称无参有参也是方法重载的一种体现。
封装
封装是一种抽象化的概念,意为将实现细节隐藏起来形成黑盒子,给用户使用
封装的实现是通过继承和接口来实现的
1.通过接口来告知需要实现哪些抽象方法,抽象类或者父类来实现从属关系的抽象
2.通过继承来在子类具体实现所有方法,将细节描绘。
3.对外只暴露接口,让用户无法了解其内部原理。