您的位置:首页 > 编程语言 > Java开发

JAVA的面向对象特性

2017-06-04 18:10 239 查看
JAVA面向对象特性:

懒惰、急躁、傲慢是程序员的三大美德——Larry Wall,“ Programming Perl”
– 懒惰使你尽你所能减少能量的损耗,你会致力于写出不需要付出很大体力的,并且让他人能够
  觉得好用的代码,你会为你的代码写出文档来避免回答他人关于你的代码的问题
– 急躁:当电脑懒惰的时候你感到愤怒,这使你不是写程序来应对需求,而是写出程序程序能够
  处理可能的需求
– 傲慢使得你所写的和所维护的程序别人挑不出毛病

面向对象(Object Oriented)是一种较新的程序设计方法,或者是一种新的程序设计

规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行

程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系

统构造中尽可能运用人类的自然思维方式。

对象
– 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组
  属性和对这组属性进行操作的一组服务组成
– 类的实例化,即new可以生成对象
• new操作需要有相应的构造函数
– 对象的生命周期:生成、使用、 消除
•  当不存在对一个对象的引用时,该对象成为一个无用对象。 Java的垃圾收集器自动扫描对象的动态内存
区,把没有引用的对象作为垃圾收集起来并释放。可以调用System.gc()强制要求进行内存回收,但
是这个方法只是提醒JVM可以进行内存回收,而真正的内存回收会发生在什么时间不确定。
•  Java中内存回收的线程是一个优先级较低的线程,以防止对程序本身运行的干扰


– 类为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。类是
一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。
– Java中的类实现包括两个部分:类声明和类体。
• 类的声明:
– [public][abstract|final] class className [extends superclassName]
[implements interfaceNameList]{……}
– 修饰符public,abstract,final 说明了类的属性,className为类名,superclassName为类的父类的名
字,interfaceNameList为类所实现的接口列表。
• 类体:
class className {
[public | protected | private ] [static] [final] [transient] [volatile] type
variableName;//成员变量
[public | protected | private ] [static] [final | abstract] [native]
[synchronized] returnType methodName([paramList]) [throws exceptionList]{
statements
}//成员方法 }

成员变量限定词的含义
– static: 静态变量(类变量)
– final: 常量,一次赋值不能改变
– transient: 暂时性变量,用于对象存档,用于对象的串行化
– volatile: 贡献变量,用于并发线程的共享

方法声明中的限定词的含义:
– static: 类方法,可通过类名直接调用
– abstract: 抽象方法,没有方法体
– final: 方法不能被重写
– native: 集成其它语言的代码
– synchronized: 控制多个并发线程的访问

方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,

也可以是复合数据类型(又称引用数据类型)。

构造函数
– 构造函数是一个特殊的方法。 Java 中的每个类都有构造函数,用来初始化该类的一个对象。
– 构造函数具有和类名相同的名称,而且不返回任何数据类型。
– 重载经常用于构造函数。
– 构造函数只能由new运算符调用
– 一个类可以同时具有多个构造函数
– 没有任何参数的构造函数称为默认构造函数
– 一个类如果没有声明任何构造函数,则自动具有一个默认构造函数
– 如果一个类定义了至少一个非默认构造函数,而没有显式声明默认构造函数,则没有默认构造
函数

封装
– 封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界
进行交互。封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免
了外界对对象内部属性的破坏。
– 可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。
– 通常不设置一个成员的访问权限为public
继承
– 子类的对象拥有父类的全部属性与方法,称作子类对父类的继承
– Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
– 继承实现了代码的复用。
– Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
– 子类不能继承父类中访问权限为private的成员变量和方法。
– 子类可以重写父类的方法,即命名与父类同名的成员变量。
– Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。 super 的使用
有三种情况:
• 访问父类被隐藏的成员变量,如:super.variable;
• 调用父类中被重写的方法,如:super.Method([paramlist]),super()调用父类构造方法;
• 调用父类的构造函数,如:super([paramlist]);——父类的构造函数必须在子类构造函数的第一行调用
,方法调用无此限制
多态
– 对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表
现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。例如:"
几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。
– Java的多态性通过重写实现
• 子类对父类的方法进行重新编写,子类中的方法与其父类有相同的的方法名、返回类型和参数表
• 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类
• 子类函数的访问修饰权限不能低于父类的

单一职责原则
– 单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。 SRP原则的解释是
:There should never be more than one reason for a class to change。简单的说就是一
个类只负责一项职责。
– 在软件设计中,秉承着“高内聚,低耦合”的思想,让一个类仅负责一项职责,如果一个类有
多于一项的职责,那么就代表这个类耦合性变高了,这些职责耦合在了一起,这是比较脆弱的
设计。因为一旦某一项职责发生了改变,需要去更改代码,那么有可能会引起其他职责改变。
所谓牵一发而动全身,这显然是我们所不愿意看到的,所以我们会把这个类分拆开来,由两个
类来分别维护这两个职责,这样当一个职责发生改变,需要修改时,不会影响到另一个职责。
– 需要说明的是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都
适用单一职责原则。

里氏替换原则
– 面向对象编程有三大特性:封装、继承、多态。 所以在实际开发过程中,子类在继承父类后,
根据多态的特性,可能是图一时方便,经常任意重写父类的方法,这种方式会大大增加代码出
问题的几率。
• 比如下面场景:类C实现了某项功能f1。 现在需要对功能f1作修改扩展,将功能f1扩展为func,其中
func由原有的功能f1和新功能f2组成。新功能func由类C的子类C1来完成,则子类C1在完成功能
func的同时,有可能会导致类C的原功能f1发生故障。这时候里氏替换原则就闪亮登场了。
– Liskov Substitution Principle——所有引用基类的地方必须能透明地使用其子类的对象,更
通俗地说:子类可以扩展父类的功能,但不能改变父类原有的功能。
– 里氏替换原则的含义
• 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法
• 子类中可以增加自己特有的方法
• 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
• 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格

依赖倒置原则——Dependency Inversion Principle
– 高层级的模块不应该依赖于低层级的模块,两者都应该依赖于抽象;抽象不应该依赖于细节;
细节应该依赖于抽象
• 抽象在Java中,特指interface以及abstract class,两者均不能实例化
• 细节指具体的实现类,实现类可以通过new实例化
– 依赖的传递
• 接口中声明
• 构造函数中传递
• 通过setter方法传递

接口隔离原则
– 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类B和类D来说不是最小接口,
则类B和类D必须去实现他们不需要的方法。
– 接口隔离原则:
• 不应强求客户端去依赖于它不需要的接口
• 类与类之间的依赖关系应该建立在最小接口的基础上

开闭原则——Open/Closed Principle
– 软件中的实体(包括类、模块、方法等),应该对扩展开放,对修改关闭,更通俗地说,软件
中的实体应允许在不改动源代码的前提下,变更它的功能

迪米特法则——Law of Demeter
– 又叫做最少知识原则(Least Knowledge Principle),一个对象应该对其它对象有尽可能少
的了解,不和陌生人对话
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: