封装
- 概念
封装性是面向对象的核心特征之一,它提供了一种信息隐藏技术。类的封转性的含义是将数据和对数据的操作组合起来构成类, 类是一个不可分割的独立单位。类中既要提供与外部联系的接口,同时又要尽可能隐藏类的实现细节。封装性为软件提供了一种模块化 的设计机制,设计者提供标准化的类模版,使用者根据实际需求来选择所需要的模块,通过组装模块实现大型软件系统。
好处:封装的最大好处就是会使对象容易使用,用户无须去关心其内部的细节。
- 访问控制
按照类的封装性原则,类的设计者既要提供类与外部的联系方式,又要尽可能地隐藏类的实现细节。这就要求了设计者应当根据实际需要, 为类和类中的成员变量和成员方法分别设置合理的访问权限。
在此,Java为类中的成员变量和成员方法设置了4种访问权限,为类本身设置了2种访问权限。
■ 类成员的访问权限
Java提供的4种访问权限分别为:public(公有)、protected(保护)、默认和private(私有)。具体含义如下
☞ public
被public修饰的成员变量和成员方法可以在所有的类中被访问。所谓在某类中访问某成员变量,是指在该类的方法中给成员变量赋值、输出其值、在表达式中应用其值等;所谓在某类中访问某成员方法,是指在该类的方法中调用该成员方法。因此在所有类的方法中都可以被public修饰的成员变量,调用被public修饰的成员方法。
☞ protected
被protected修饰的成员变量和成员方法可以在声明它们的类中被访问,或在该类的子类中被访问,也可以被与该类在同一个包中的类访问,但不能被其他包中的非子类访问。
☞ 默认
默认是指不使用任何权限修饰符。被默认修饰的成员变量和成员方法可以被声明它们的类访问,也可以被与该类在同一包中的类访问,但不能被位于其他包中的类访问。默认权限 以包为界 划分访问权限的范围,使成员人可以被与其所属的类位于同一包中的类访问,而不能被该包以外的类访问。
☞ private
被private修饰的成员变量和成员方法只能在声明它们的类中被访问,而不能被其他类,甚至其子类所访问。被private修饰的成员,其被访问的权限范围最小,对所有其他类都隐藏信息。
备注:不能用访问权限修饰符修饰成员方法中声明的变量或形式参数,因为方法中声明的变量或形式参数的作用域仅限于该方法,在方法之外是不可见的,在其他类中更无法访问
比较项目 | public | protected | 默认 | private |
---|---|---|---|---|
本类 | ✔ | ✔ | ✔ | ✔ |
本类所在包 | ✔ | ✔ | ✔ | ━ |
其他包中的子类 | ✔ | ✔ | ━ | ━ |
其他包中的非子类 | ✔ | ━ | ━ | ━ |
■ 类的访问权限
声明一个类,可以使用的权限修饰符只有public和默认两种,不能使用protected或private。
备注:一个类如果想直接访问另一个单独的类,有两种情况:
(1)和自己在一个包中,无论其是否为public
(2)和自己不在一个包中,且必须为public
继承
继承(英语:inheritance)是面向对象软件技术当中的一个概念。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
子类的创建可以增加新数据、新功能,可以继承父类全部的功能,但是不能选择性的继承父类的部分功能。继承是类与类之间的关系,不是对象与对象之间的关系。
例如:先定义一个类叫车,车有以下属性:车体大小、颜色、轮胎、方向盘、品牌、速度、排气量,由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。
如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。
继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。一般静态的面向对象编程语言,继承属于静态的,意即子类别的行为在编译期就已经决定,无法在执行期扩充。
那么如何使用继承呢?用extends关键字来继承父类。
如上面A类与B类,当写继承语句时,class A类 extends B类{ } 其中A类是子类,B类是父类。
继承的语句格式:
class 子类名 extends 父类名{}
class 父类 { } class 子类 extends 父类 {}
多态
为了实现运行期的多态,或者说是动态绑定,需要满足三个条件:
- 有类继承或者接口实现
- 子类要重写父类的方法
- 父类的引用指向子类的对象
多态的作用是消除类型之间的耦合关系