面向对象

什么是面向对象
面向对象,英文名称Object Oriented,是一种软件开发方法。是和面向过程相对应的。
日常生活中我们吃饭要不直接在家做,要不就叫外卖,其实,吃法这件事,就可以分为面向过程吃饭和面向对象吃饭。自己亲自下厨就是面向过程,点外卖就是面向对象。
在面向过程的吃饭中,我们想要填饱肚子,需要自己亲自下厨把这顿饭做出来,那么,我们就需要先想好吃什么、然后去买菜、洗菜、洗米、蒸饭、炒菜等等一系列的事情。

public void cooking(){
制定菜单();
买菜();
洗菜();
洗米();
蒸饭();
炒菜();
}

那么,你说和点外卖相比,自己做饭有哪些缺点啊?
那还用说,麻烦呗。
的确,面向过程编程也一样,由于想要完成做饭这件事,需要自己定义很多个方法。除此之外,还有很多遇到很多其他问题,比如:

我不想吃米饭,我想吃馒头。
上次买的菜家里面还有,不需要去买菜。
中午吃剩下的菜家里面还有,直接热一热就可以吃了。
这次去的一家超市提供洗菜服务,不需要我们自己洗菜了。

以上这些突发事件,在编程中就叫做需求变更或者新的需求,这种事情发生是必然会发生的。

对于程序员来说,就需要通读代码,找出可以复用的方法,然后重新调用,不能复用的就重新写一个。时间久了,方法就会越来越多,系统维护越来越复杂。

面向对象,其实就是我们通过点外卖的方式来“做饭”。我们知道我们需要一顿饭,我们只需要打开外卖软件,在里面选择我们需要的菜品然后下单就可以了。我们不关心饭店做饭的过程。想吃什么点什么,家里来人了就再下一个订单,不想吃米饭了,想吃馒头了,也可以给饭店打电话,让他们把米饭换成馒头。

所以,通过面向对象的方式“做饭”,就像上面的代码一样。

在面向对象编程中,抛弃了函数,想要实现一个功能不再是通过函数的叠加调用实现的了。而是通过对象。

对象就是对事物的一种抽象描述。现实世界中的事物,都可以用「数据」和「能力」来描述。

比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
描述一个外卖软件,「数据」就是他包含的菜品,而「能力」就是他可以点菜。

什么是封装?
我们把「数据」和「能力」组合成一个对象的过程就叫做「封装」。
封装的结果就是可以有一个类,通过这个类我们可以获得一个对象。然后我们就可以通过给这个对象下命令,让他执行自己的「能力」。

除了把「数据」和「能力」封装成一个「对象」更加方便使用以外,还有啥其他的特点么?

封装只是面向对象的第一步,目的是把现实世界的东西抽象成对象。面向对象真正有威力的地方是「继承」和「多态」。

举一个不是很恰当,但是比较容易理解的例子。

我们使用外卖软件点餐,当我们第二次去某一家店时,外卖软件会提示你上一次你在这家点了什么,你可以点击<再来一单>把上次的菜品直接加到购物车中,这就是「继承」。而在购物车中的物品你可以直接付款下单,也可以把增删和修改菜品。这就是「多态」。

什么是继承?

在面向对象编程中,当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类「继承」这个父类。继承后子类自动拥有了父类的部分属性和方法。

通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。

例子如下:

public class Dog{
public void bark(){
System.out.print("旺旺旺");
}
}
public class HerdingDog extends Dog{
public void herd(){
System.out.print("放羊中.....");
}
}
public class Main(){
HerdingDog dog=new HerdingDog();
dog.dark();
dog.herd();
}

什么是多态?

同一操作,作用于不同的对象,可以产生不同的结果,这就是「多态」。通常说的多态都是指运行期的多态,也叫动态绑定。

要实现多态,需要满足三个条件:
有类继承或接口实现、子类重写父类的方法、父类引用指向子类的对象
例子如下:

public class Canidae{
public void bark();
}
public class Dog extends Canidae{
public void bark(){
System.out.print("旺旺旺....");
}
}
public class Wolf extends Canidae{
public void bark(){
System.out.print("嗷嗷嗷.....");
}
}
public class Main(){
Canidae canidae=new Dog();
canidae.bark();
Canidae canidae1=new  Wolf();
canidae1.bark();
}

这样,就实现了多态,同样是Canidae的实例,canidae.bark()调用的就是Dog类的方法,而canidae1.bark()调用的却是Wolf的方法。

有人说,你自己定义的对象,定义的时候不就知道canidae到底是什么类的对象了么,这个其实并不决定的,很多时候我们可能不知道,原因是,对象可能并不是我们自己new出来的,比如Spring的IOC。

`

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值