封装、继承与多态是面向对象程序设计的三个核心特性。
封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想。继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,充分利用已有的类来完成更复杂、更深入的程序开发。而多态允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变得容易。
1、封装
封装的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共变量和公共方法,而看不见方法的具体实现细节,也不能对类中非公共的数据进行操作。这样可以防止外部的干扰和误用。
封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实现的细节,只须用设计者提供的接口来访问对象。同时减少了程序各部分之间的依赖性,降低了程序的复杂性,由于隐藏了其内部信息的细节,使内部信息不易受到破坏,安全性有了保证,同时也为外界访问提供了简单方便的界面。
Ø 封装的实现
Java定义了4种访问权限:公有的(public)、保护的(protected)、私有的(private)和默认的。
类成员访问权限
| 同一个类 | 同一个包 | 不同包中子类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ |
|
默认 | √ | √ |
|
|
private | √ |
|
|
|
2、继承
继承是一种由已有类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类。新类继承一般类的状态和行为,并根据需要增加它 自己的状态和行为。
从现有类出发定义一个新类,称为新类继承了现有的类,其中被继承的现有类叫做超类(superclass)或父类,由继承而得到的类称为子类(subclass)。
Ø 成员变量的继承
子类继承父类中所有可被子类访问的成员变量。继承原则如下:
1. 能够继承那些声明为public和protected的成员变量。
2. 能够继承同一包中的那些默认修饰符的成员变量。
3. 不能继承那些声明为private的成员变量。
4. 如果子类声明一个与父类成员变量同名的成员变量,则不能继承父类的成员变量。此
时子类的成员变量称做隐藏了父类的成员变量。
总之,子类可继承父类的public、protected和默认修饰变量,不能继承private变量。反之,如果父类不允许其子类访问它的某些成员,那么它必须以private方式声明该成员。这一点充分体现了类封装的信息隐蔽原则。
Ø 成员方法的继承
子类继承成员方法的规则类似于继承成员变量的规则:子类继承父类中所有可被子类访问的成员方法。继承规则如下:
1. 能够继承那些声明为public和protected的成员方法。
2. 能够继承同一包中的默认修饰符的成员方法。
3. 不能继承那些声明为private的成员方法。
4. 不能继承父类的构造方法。
如果子类方法与父类方法同名,则不能继承。子类方法称为覆盖了父类中的那个方法。
总之,子类可继承其父类的public、protected和默认修饰方法,不能继承private方法。子类除了可以继承父类中的变量及方法,还可以增加自己的成员。当一个父类成员不适合该子类时,子类会重新定义它,如果是重新定义的是成员变量就是隐藏父类的变量,如果是成员方法就是覆盖父类的方法。
3、多态
多态是指一个名字可具有多种语义。在面向对象语言中,多态是在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法。通常有两种途径实现多态:方法的重载和覆盖。
多态性允许以统一的风格处理已存在的变量及相关的类。多态性使得向系统增加新功能变得容易。继承性和多态性是降低软件复杂性的有效技术。
Ø 方法重载时:
v 参数必须不同即参数个数不同,类型也可以不同。 l
v 返回值可以相同,也可以不同。
重载的价值在于它允许通过使用一个普通的方法名来访问一系列相关的方法。当调用一个方法时具体执行哪一个方法根据调用方法的参数决定,Java运行系统仅执行与调用的参数相匹配的重载方法。尽管Java并没有规定重载方法之间必须有联系,但习惯上,为了程序的可读性,最好重载相同含义的方法。
Ø 方法的覆盖
在前述继承规则中有一条:子类继承超类中所有可被子类访问的成员方法,如果子类方法与超类方法同名,则不能继承,此时子类的方法称为覆盖(override)了超类中的那个方法。
在进行覆盖时,应注意以下三点:
v 子类不能覆盖超类中声明为final或static的方法。
v 子类必须覆盖超类中声明为abstract的方法,或者子类也声明为abstract。 l
v 子类覆盖超类中同名方法时,子类方法声明必须与超类被覆盖方法的声明一样。
方法的覆盖与类的继承有密切的关系。覆盖体现了子类补充或改变超类方法的能力。通过覆盖使一个方法在不同的子类间表现出不同的行为。
n 重载与覆盖的区别
1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。