“什么是面向对象?”这个问题往往会问到刚毕业的新手or实习生上,也是往往作为一个技术面试的开头题。在这里我们不去谈如何答(fu)好(yan)问(guo)题(qu),仅谈谈我所理解的面向对象。
为什么“面向对象”?
最早的时候是面向过程。想象一下一堆C语言or汇编堆砌在一起的函数互相调(shang)用(hai)的场景————什么?你说你没学过C语言?那么你就想象一下一个复杂的SQL语句吧,有点像。
评论中有人提到了C语言并非完全不支持面向对象,Struct就是一个不错的选择。的确,但是C语言对面向对象的支持并不是那么的好。在绝大多数语言中都为Class(C++同时支持Struct和Class),但也有小部分语言沿用了这个经典的名字——比如Go语言。在这里特别说明是为了防止误导新手
把大象装进冰箱需要几步?
我们以“把大象装进冰箱需要几步”这个经典的脑经急转弯来举个例子吧:
面向过程
打开冰箱,装入大象,关上冰箱。这三步就是面向过程的思考方式,这种思想强调的是过程,也可以叫做动作。
open(icebox);
putIn(icebox,elephant);
close(icebox);
面向对象
冰箱打开,冰箱存储,冰箱关闭。这就是面向对象的思考方式,这种方式强调是对象,也可以说是实例。
//我们有一个冰箱
Icebox iceBox = new iceBox();
//可不能忘记大象,就叫它jake吧
Elephant jake = new Elephant();
icebox.open();
icebox.save(jake);
icebox.close();
什么是面向对象?
一种编程范式,相对于面向过程。为了方便在编程中更接近地去描述现实世界中的万物(万物皆对象),我们将对一个事物的描述称之为类,而对象则是该事物的实例。
类
在类中,我们把事物的属性转变为编程中的变量,把事物的行为转变为方法。
Class Elephant{
public String name;
public int age;
public double weight;
//更多的属性......
//在这里的方法为了方便演示都是void
public void eat(Food food){
//吃东西
}
//更多的行为.......
}
对象
//我们再次召唤了jake
Elephant jake = new Elephant();
//他随便吃了点什么
jake.eat(new Something);
面向对象的特性
继承
可以使子类复用父类公开的变量、方法
//几百年后,jake和它的子孙们进化成了更强的大象
//它们被称为:飞象
Class FlyElephant extends Elephant{
public void fly(){
//i belive i can fly~~
}
}
//其中有一头飞象叫jason
FlyElephant jason = new FlyElephant();
//过了这么长时间,jake那时
//不要问大象为什么能飞!
jason.fly();
//而且还可以像其他大象一样正常的吃东西
jason.eat(new Something);
封装
屏蔽一系列的细节。使外部调用时只要知道这个方法的存在
-
jason在eat的时候它或许先会分泌一点激素有助于它进食,然而我们在调用的时候并不知道发生了什么。
多态
父类的方法继承的到子类以后可以有不同的实现方式
-
jason在eat的时候它或许先会分泌一点激素有助于它进食,而jack在eat的时候或许会先刷个牙齿。
面向对象的好处
-
接近人的思维,符合人类对现实世界的认知;
-
封装特性可以使开发者不必在意内部的具体实现,更方便互相协作;
-
继承特性可以减少代码冗余,实现代码复用;
-
多态特性令子类相比父类有不同的行为,这是非常接近现实的;
最后
-
以上仅为个人理解,如果有任何错误望各位及时指出,感激不尽!
-
Java是一个对面向对象编程支持非常到位的语言,诸君可以一试。