Java面向对象的三大特性,六大原则

今天面试被问到了java的多态、封装,答得不太好,感觉自己在这个问题上还是不太明白。所以来整理一下java面向对象思想得三大特性,六大原则。(像不像是武侠小说的三大圣地,六大门派,哈哈^ - ^)

三大特性

封装

含义:隐藏对象的属性和实现细节,仅对外提供公共的接口来控制程序中属性的访问级别。
目的:增强安全性和简化编程,使用者不必要了解具体的实现细节,仅通过外部 接口就可以访问类的成员。
java的访问权限修饰符有四种,public,protect,default(缺省),private,具体修饰范围如下。

同一个类 同一个包 不同包的子类 不同包的非子类
private
default
protected
public

继承

含义:继承指的是建立一个新的派生类,派生类可以复用基类的属性和方法。
目的:实现代码复用
注意事项:

  • java是单继承的
  • 派生类可以重写基类的方法,但是要遵循”两同两小一大“原则。“两同”即方法名相同、形参列表相同;“两小”指子类方法返回值类型应该比父类方法返回值类型要小或相等,子类方法声明抛出的异常应该比父类方法声明抛出的异常类要小或相等;“一大”指子类方法的访问权限应比父类方法的访问权限更大或相等

继承的设计技巧:

  • 将公共的操作和域放在超类
  • 使用继承实现is–a的关系,比如兔子和动物
  • 除非所有继承的方法都有意义,否则不要用继承。
  • 覆盖方法时,不要改变方法预期的行为。比如一个方法是计算工资,结果你覆盖方法时将它改为了输出年龄。
  • 使用多态而非多种类型检测

多态

定义:一个对象变量可以指示多种实际类型的现象被成为多态。
表现:同一操作作用于不同类的实例时,产生不同的行为。这个现象是动态绑定的,即在运行时自动选择应该调用哪一个方法。

多态的条件

  • 有继承或实现
  • 方法重写
  • 向上转型,即父类或父接口引用指向子类对象

优点:扩展性更好,代码更灵活
缺点:不能访问子类特有的功能。

那么如果我们要访问子类特有的功能,可以使用向下转型。注意,向下转型是有条件的,不能随便转。

  • 向下转型前提是父类引用指向子类对象(就是说需要先向上转型)
  • 向下转型只能转为本类型的。

重载是不是多态?

重载指的是一个类中定义多个同名方法,但是参数链表等不同。在编译期间就能确定的了。
那么我们来看多态,其中有几个点要注意:

  • 引用变量指向的具体类型在编程时不确定
  • 引用变量发出的方法或者属性调用在编程时不确定
  • 以上两点都是程序运行时动态绑定的
  • 多态的条件是继承(实现)、重写、向上转型

所以说不论是在定义还是表现来看,重载和多态的连续都不大。重载的意义更趋向于编写出结构清晰而简洁的类。

六大原则

单一职责原则,开放封闭原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特原则

单一职责原则

定义:一个类,应该仅有一个引起它变化的原因。就是说一个类只做一件事。
目的:让一个类专注于自身的功能。
例如:工厂模式,工厂类的功能就是生产对象。

开放封闭原则

定义:一个软件实体如类、模块、函数应该是对扩展开放的,对修改封闭的。
表现:

  • 对扩展开放,意味着 有新的需求或变化时,可以对现有的代码进行扩展,以适应新的情况。
  • 对修改封闭,在对模块功能进行扩展时,不应该影响已有的程序模块。

方式:

  • 用抽象构建框架,用实现扩展细节。
  • 不以改动原有类的方式来实现新需求,而是应该以实现事先抽象出来的接口(或具体类继承抽象类)的方式来实现。

优点:可以在不改动原有代码的前提下给程序扩展功能。增加了程序的可扩展性,同时也降低了程序的维护成本。

例如:装饰器模式。可以动态地添加修改类的功能。一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类去继承它,并重新实现类的方法,使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性。

里氏替换原则

定义:所有引用基类的地方必须能透明地使用其子类的对象,也就是说子类对象可以替换其父类对象,而程序执行效果不变。

表现:在继承体系中,子类中可以增加自己特有的方法,也可以实现父类的抽象方法,但是不能重写父类的非抽象方法,否则该继承关系就不是一个正确的继承关系。

优点:检验继承的正确性,避免滥用继承关系

依赖倒置原则

定义:

  • 依赖抽象,而不是依赖实现。
  • 抽象不应该依赖细节;细节应该依赖抽象。
  • 高层模块不能依赖低层模块,二者都应该依赖抽象。

表现:

  • 针对接口编程,而不是针对实现编程。
  • 尽量不要从具体的类派生,而是以继承抽象类或实现接口来实现。
  • 关于高层模块与低层模块的划分可以按照决策能力的高低进行划分。业务层自然 就处于上层模块,逻辑层和数据层自然就归类为底层

优点:
通过抽象来搭建框架,建立类和类的关联,以减少类间的耦合性。而且以抽象搭建的系统要比以具体实现搭建的系统更加稳定,扩展性更高,同时也便于维护。

接口隔离原则

定义:类所依赖的接口应该仅仅包含所需要的功能。
表现:

  • 客户端不应该依赖它不需要实现的接口。
  • 不建立庞大臃肿的接口,应尽量细化接口,接口中的方法应该尽量少。
  • 接口的粒度也不能太小。如果过小,则会造成接口数量过多,使设计复杂化。

优点:避免接口包含不同类职责的方法,接口责任划分的更明确

迪米特原则

定义:一个对象应该对尽可能少的对象有接触,也就是只接触那些真正需要接触的对象。
表现:迪米特法则也叫做最少知道原则(Least Know Principle), 一个类应该只和它的成员变量,方法的输入,返回参数中的类作交流,而不应该引入其他的类(间接交流)

优点:实践迪米特法则可以良好地降低类与类之间的耦合,减少类与类之间的关联程度,让类与类之间的协作更加直接。

参考文章:
面向对象设计的六大原则
java三大特性,五大原则
java三大特性
java多态,继承和接口
重载是多态么

猜你喜欢

转载自blog.csdn.net/machine_Heaven/article/details/104714606