2020年6月13日 多云转暴雨⛈️java
I'm sad,tired,negative,powerless,miss,lonely fine :)
面试官:我看你简历上说,你的主要编程语言是Java,偶尔也用Python,那么你能够说一下这两个的相同点在什么地方吗?面试
山禾:它们都是高级程序设计语言,都是面向对象的语言。算法
面试官:那你讲讲你是怎么理解面向对象的吧。编程
山禾:emmm。。封装,继承,多态是面向对象的三大特征。设计模式
面试官:还有其余要补充的吗?数据结构
山禾:没了less
面试官:那你回去等通知吧。编程语言
痛定思痛,挫折只会让我变得更强,奥利给!下面开始进入正文,首先咱们须要知道面向对象是什么?ide
面向对象,顾名思义,是面向对象,也就是说单身狗是不配使用面向对象的编程语言的(固然只是开个玩笑,逃)。模块化
对象,就是把现实世界中的实物映射抽象到虚拟世界中,把实物的属性和行为,经过代码的方式表达出来。而后经过设计对象的数据结构(属性),而后使用算法进行行为的模拟(方法),就完成了从现实到虚拟的一个映射。
实体
对象
类
属性
数据结构
变量
行为
算法
方法
与面向对象常常拿来对比的就是面向过程编程,那么他们之间的区别在什么地方呢?
面向过程编程,打个比方,咱们买过的通常的玩具(变形金刚),咱们必需要按照它说明书上的步骤,一步一步的去组装,才能获得最后的玩具,若是咱们想要一个新的玩具,就要去商场买一个新的,而后按照说明书的顺序一步一步的组装。
而面向对象编程,就能够理解为积木,没有一个固定的拼装方式,咱们能够发挥本身的想象力,去自由的拼装和组装,一样的模块在不一样的地方能够起到不一样的做用(多态),一起积木就是一个最小的单位,咱们不用去关心积木是怎么造的(封装)。也能够用多个对象组装起来去拼装成一个新的对象(继承)。大大的方便了咱们的设计,再也不拘泥于过程,极大程度上的放飞了生产力和效率。
咱们刚刚已经了解了面向对象是什么,下面咱们来讲一下,为何要用面向对象编程
刚刚我一直忍住,没有去提面向对象的三大特性:封装、继承和多态,我相信咱们有一些经验的开发人员来讲,这三个词语是再熟悉不过了。下面,我经过代码的方式,来看看这三个特性在代码中的模拟应用。
@Data public class Uzi { // 选手类型 private String type; // 选手最擅长英雄 private String bestHero; // 选手状态 private Status status; public void play() { status.say(); } } public class Status { public void say(){} }
上面是一段很是简单的代码,我定义了一个很简单的类,里面的name
,type
,bestHero
对于咱们来讲都是一个包装在盒子里的东西。好比:
Uzi uzi = new Uzi(); uzi.setType("ADC"); uzi.setBestHero("孙尚香");
咱们看到的Uzi可能就是一个主玩孙尚香的职业ADC选手(🐶狗头保命,我啥都不知道),他怎么玩的,咱们不须要知道,咱们只须要知道他这样的一名选手就能够了。这就是封装的魅力:
看完了封装,下面咱们来看继承,咱们分别用三个状态去继承Status类:
public class ShunFeng extends Status { @Override public void say(){ System.out.println("顺风狂小狗"); } } public class NiFeng extends Status { @Override public void say(){ System.out.println("逆风简自豪"); } } public class JueJing extends Status { @Override public void say(){ System.out.println("绝境Uzi"); } }
关键字extends表示正在构造的新类派生于一个已经存在类。这个已经存在的类被称为父类(超类,基类);新建立的类被称为子类。在经过扩展父类定义子类的时候,仅仅须要指出子类和父类的不一样之处。所以在设计类的时候,应该将通用的方法放在父类中,而将具备特殊用途的方法放在子类中。
咱们只是在父类Status
中定义了say方法,而后三种不一样的类去继承这个类,而后实现方法,这样就体现出了面向对象在设计上的可扩展性,可是须要注意的是,继承会破坏封装,咱们须要谨慎使用,尽可能使用一些设计模式去避免继承,合理使用,才能体现出它的优点~
说完了继承,接下来就要去说多态了。
在说多态以前,咱们先来看一下代码:
public class Test { public static void main(String[] args) { //uzi1 Uzi uzi1 = new Uzi(); ShunFeng shunFeng = new ShunFeng(); uzi1.setStatus(shunFeng); //uzi2 Uzi uzi2 = new Uzi(); NiFeng niFeng = new NiFeng(); uzi2.setStatus(niFeng); //uzi3 Uzi uzi3 = new Uzi(); JueJing jueJing = new JueJing(); uzi3.setStatus(jueJing); //uzis Uzi[] uzis = {uzi1,uzi2,uzi3}; // 多态 for (Uzi uzi : uzis) { uzi.play(); } } }
运行程序的结果: (TMD,泪目,👴青结)
所谓的多态就是一个对象变量(好比上文中的status变量)能够指示多种实际类型的现象(好比status既能够引用Status对象,也能够引用它的子类ShunFeng对象)被称为多态。在运行时候可以自动地选择调用哪一个方法的现象被称为动态绑定,上面打印出的语句,就说明了这一点。
原来咱们每天挂在口边的面向对象,其实某种程度上来讲,更像是一种哲学,一种计算机科学发展的天然规则。
若是你有学到,请给我点赞👍+关注,这是对一个✊坚持原创做者的最大支持!我是山禾,千篇一概的皮囊,万里挑一的灵魂,一个不太同样的写手。
世事洞明皆学问,人情练达即文章。