8.1 抽象和封装
面向对象设计首先要做的就是抽象。根据用户的业务需求抽象出类,并关注这些类的属性和方法,将现实世界中的对象抽象成程序设计中的类。
类抽象
程序员开发出来的软件是需要满足用户需求的,所以程序员做分析和设计的依据是用户需求,通常是软件开发前期形成的“需求规格说明书”。面向对象设计时,首先要阅读用户需求,找出需求中名词部分用来确定类和属性,找出动词部分确定方法。
首先要进行类抽象,就是发现类并定义类的属性和方法。具体的步骤如下。
-
发现名词。
-
确定类和属性。
-
确定方法。
类封装
类抽象的目的在于抽象出类,并确定属性和方法,而接下来的类封装,则要在封装的角度隐藏类的属性,提供公有的方法来访问这些属性。
最简单的操作方法就是,把所有的属性都设置为私有属性(表示私有属性和方法时,需在类图中的属性和方法前加上“-”号),每个私有属性都提供getter和setter公有的方法(表示公有属性和方法时,需在类图中的属性和方法前加上“+”号)。
8.2 继承
在面向对象的程序设计中,继承是一个不可分割的重要组成部分,没有使用继承的程序设计,就不能称为面向对象的程序设计。
继承的概念
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的属性或新的方法,也可以用已存在的类的属性和方法。这种技术能够非常容易地复用以前的代码,大大缩短开发周期,降低开发费用。
class A extends B{
类定义部分
}
即A类继承B类,B类称为父类、超类或基类,A类称为子类、衍生类或导出类。
继承和访问权限
继承最大的好处是,子类可以从父类中继承属性和方法,那么子类是不是能继承父类所有的属性和方法呢?具体情况说明如下。
- 子类可以继承父类中访问权限修饰符为public和protected的属性和方法。
- 子类可以继承父类中用默认访问权限修饰的属性和方法,但子类和父类必须在同一个包中。
- 子类无法继承父类中访问权限修饰符为private的属性和方法。
- 子类无法继承父类的构造方法。
构造方法是一种特殊的方法,子类无法继承父类的构造方法。那么在子类的构造方法中,尤其要注意,子类构造方法中如果没有显式调用父类有参构造方法(例如super(name);),没有通过this显式调用自身的其他构造方法,则系统会默认调用父类无参构造方法(super();)。
方法重写
子类可以从父类继承相应访问权限的方法,但如果父类的方法不能满足子类的需要,则可以在子类中对父类的同名方法进行覆盖,这就是重写。
重写需要满足如下条件。
- 重写方法与被重写方法同名,参数列表也必须相同。
- 重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。
- 重写方法不能缩小被重写方法的访问权限。
用final修饰的变量即为常量,只能赋值一次。如果用final修饰方法,则该方法不能被子类重写。用final修饰类,则这个类不能被继承。