面向对象三大特性:封装,继承,多态(一,封装和继承)
封装、继承和多态是面向对象程序设计的三个核心特性。
- 封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想。
- 继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,育雏利用已有的类来完成更复杂、更深入的程序开发。
- 多态允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变的容易。
一、封装
- 封装的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共变量和公共方法,而看不见方法的具体实现细节,也不能对类中非公共的数据进行操作。这样可以防止外部的干扰和误用。
- 封装的目的:在于将对象的使用者和对象的设计者分开,使用者不必知道行为实现的细节,只须用设计者提供的接口来访问对象。同时减少了程序各部分之间的依赖性,降低了程序的复杂性,由于隐藏了其内部信息的细节,使内部信息不易受到破坏,安全性有了保证,同时也为外界访问提供了简单方便的界面。
- 封装的实现:JAVA定义了4种访问权限:public (公有的)、protected(保护的)、private(私有的)和默认的(默认的就是包访问权限package)
3.1 public (公有的)
用public修饰的类成员(包括变量和方法)称为公有的,公有成员允许JAVA系统中所有的类访问,即不公类内部的成员可以访问,类外部的同一个包或者不同包的类也可以直接访问。
3.2 private(私有的)
用private修饰的类成员称为私有的,类的私有成员只能被这个类的方法直接访问。如果想要获取一个类中私有变量的值,可以通过类中定义的get()方法来获取。一般把不需要外界知道的数据声明为私有,这样有利于数据的安全性,也符合程序设计中隐藏内部信息处理细节的原则。
3.3 protected(被保护的)
用protected修饰的类成员为被保护的,允许其所归属的类(父类)、由此派生的类(子类)以及同一个包中的其他类访问。
3.4 默认的(package)
如果类成员前面没有任何关键字修饰,则称为默认的。默认的类成员除了允许被其归属的类访问外,还允许同一个包中的其他类访问。若两个类不在同一个包中,即使是这个类的子类,也不允许访问。
二、继承
继承是一种由已有类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类。新类继承一般类的状态和行为,并根据需要增加它自己的状态和行为。
从现有类出发定义一个新类,称为新类继承了现有的类,其中被继承的现有类叫做超类(superclass)或父类,由继承而得到的类称为子类(subclass)。
Java中规定,一个父类可以同时拥有多个子类,但一个子类只能有一个父类,即单重继承,而且允许多层继承,即子类还可以有它自己的子类,在下一层的继承关系中原先的子类就变成了父类。这样的继承关系就形成了继承树。
1、类继承用关键字extends实现,格式为:
class 子类名extends 父类名{子类的类体}
如果没有extends子句,则这个类直接继承Object。
2、成员变量的继承
子类继承父类中所有可被子类访问的成员变量。继承原则如下:
2.1 能够继承那些声明为public和protected的成员变量。
2.2 能够继承同一包中的那些默认修饰符的成员变量。
2.3 不能继承那些声明为private的成员变量。
2.4 如果子类声明一个与父类成员变量同名的成员变量,则不能继承父类的成员变量。此时子类的成员变量称做隐藏了父类的成员变量。
总之,子类可继承父类的public、protected和默认修饰变量,不能继承private变量。反之,如果父类不允许其子类访问它的某些成员,那么它必须以private方式声明该成员。这一点充分体现了类封装的信息隐蔽原则。
3、成员方法的继承
子类继承成员方法的规则类似于继承成员变量的规则:子类继承父类中所有可被子类访问的成员方法。继承规则如下:
3.1 能够继承那些声明为public和protected的成员方法。
3.2 能够继承同一包中的默认修饰符的成员方法。
3.3 不能继承那些声明为private的成员方法。
3.4 不能继承父类的构造方法。
如果子类方法与父类方法同名,则不能继承。子类方法称为覆盖了父类中的那个方 法。
总之,子类可继承其父类的public、protected和默认修饰方法,不能继承private方法。子类除了可以继承父类中的变量及方法,还可以增加自己的成员。当一个父类成员不适合该子类时,子类会重新定义它,如果是重新定义的是成员变量就是隐藏父类的变量,如果是成员方法就是覆盖父类的方法。
4、重写
重写是指在继承过程中,子类中的成员(包括数据和方法)与其父类中的成员同名,但功能不同,此时,子类的成员“覆盖”从父类继承过来的成员。包括两种情况:一是数据覆盖,称为数据隐藏,即父、子类中数据成员的名称相同,类型不同,它们实际上是完全不同的两个数据;二是方法覆盖,称为方法重写,即父、子类中方法的名称相同,参数表也完全相同,但功能不同。
在数据隐藏和方法覆盖后,子类成员覆盖了父类的同名成员,要访问父类的这些成员,需用super关键字来引用当前类的父类。super的用法有3种情况:
4.1 super.变量名:访问父类中被隐藏的成员变量。
4.2 super.方法名([参数表]):调用父类中被重写的方法。
4.3 super([参数表]):调用父类的构造方法,此时,可用super来表示父类的构造方法。