Java基础:面向对象四大特征、五大原则

面向对象四大特征:

一、抽象
  抽象就是将一类实体的共同特性抽象出来,封装在一个新的概念(类) 中,所以抽象是面向对象语言的基础。比如鸟就是一个对象,但是我们在研究这个对象的时候把它的一些同类放到一起,一起来考虑,而且抽象的时候,只考虑我们感兴趣的一些数据;假设你自己是一个普通人,那么你可能关心的数据是,鸟类飞行的方法,鸟类吃东西的方法;假设你自己是一个生物专家,那么你可能关心的数据时,鸟类的体重,鸟类的爪子的大小,鸟类的食量等等。
  我们可以通过抽象处理复杂性。例如,人们不会把一辆汽车想象成由几万个互相独立的部分所组成的一套装置,而是把汽车想成一个具有自己独特行为的对象。这种抽象使人们可以很容易地将一辆汽车开到杂货店,而不会因组成汽车各部分零件过于复杂而不知所措。他们可以忽略引擎、传动及刹车系统的工作细节,将汽车作为一个整体来加以利用。

二、封装
  在面向对象语言中,封装特性是由类来体现的。我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,gender,age等属性,同时也具有eat(),sleep(),我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性;
  封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。可以理解为把它想成一个黑匣子,它可以阻止在外部定义的代码随意访问内部代码和数据。对黑匣子内代码和数据的访问通过一个适当定义的接口严格控制。
  封装的步骤:
  1、修改属性的可见性来限制对属性的访问
  2、为每个属性创建赋值和取值的方法,用于对这些属性的访问
  3、在赋值和取值的方法中,加入对属性的存储限制
  封装的好处:
  1、实现了专业的分工
  2、类内部的结构能够自由修改
  3、能够对成员进行更精确的控制
  4、隐藏信息,实现细节
  5、良好的封装能够减少耦合

三、继承
  继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类和子类在本质上还是一类实体。
  继承是一个对象获得另一个对象的属性的过程。继承很重要,因为它支持了按层分类的概念。比如:藏獒是狗类的一部分,狗类又是哺乳动物的一部分,哺乳动物又是动物类的一部分。如果不使用层级的概念,我们就不得不分别定义每个动物的所有属性。而使用了继承,一个对象就只需要定义是它在所属类中独一无二的属性即可,因为它可以从它的父类那儿继承所有的通用属性。可以这样说,正是继承机制使一个对象成为一个更具通用类的一个特定实例成为可能。
  继承的特征:
  1、可传递可扩展。若类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。
  2、可复用。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
  3、可维护性。继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

四、多态
  多态是允许一个接口被多个同类动作使用的特性,具体使用哪个动作与应用场合有关。多态就是通过传递给父类对象引用不同的子类对象从而表现出不同的行为,多态可为程序提供更好的可扩展性,同样也可以代码重用。
  要理解多态性,首先要知道什么是“向上转型”。
  我定义了一个子类Dog,它继承了Animal类,那么后者就是前者的父类。可以通过:
  Dog d = new Dog();  例化一个Dog对象。
  但当我这样定义时: Animal a = new Dog();
  它表示我定义了一个Animal类型的引用,指向新建的Dog类型的对象。由于Dog是继承自它的父类Animal,所以Animal类型的引用是可以指向Dog类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。所以, 父类引用只能调用父类中存在的方法和属性,不能调用子类的扩展部分;因为父类引用指向的是堆中子类对象继承的父类;(但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)
  同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
  对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

面向对象五大原则:

(1)单一职责原则(Single-Resposibility Principle)

一个类应该仅有一个引起它变化的原因

职员类例子: 比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要ifelse判断是哪种情况,从类结构上来说将会十分臃肿,并且上述三种的职员类型,不论哪一种发生需求变化,都会改变职员类!这个是大家所不愿意看到的!

 

(2)开放封闭原则(Open-Closed principle)

对扩展是开放的,对更改是封闭的!

变化来临时,如果不必改动软件实体裁的源代码,就能扩充它的行为,那么这个软件实体设计就是满足开放封闭原则的。如果说我们预测到某种变化,或者某种变化发生了,我们应当创建抽象类来隔离以后发生的同类变化。

 

(3)里氏替换原则(Liskov-Substituion Principle)

子类可以替换父类并且出现在父类能够出现的任何地方,贯彻GOF倡导的面向接口编程

在这个原则中父类应尽可能使用接口或者抽象类来实现!

子类通过实现了父类接口,能够替父类的使用地方!

通过这个原则,我们客户端在使用父类接口的时候,通过子类实现!

意思就是说我们依赖父类接口,在客户端声明一个父类接口,通过其子类来实现

这个时候就要求子类必须能够替换父类所出现的任何地方,这样做的好处就是,在根据新要求扩展父类接口的新子类的时候而不影响当前客户端的使用!

 

(4)依赖倒置原则(Dependecy-Inversion Principle)

传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也称为高层依赖低层!

所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!

 

(5)ISP 接口隔离原则(Interface-Segregation Principle)

使用多个专门的接口比使用单个接口要好的多!

这个我有体会,在我实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!
 

转载于:https://my.oschina.net/u/4008390/blog/3013835

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值