5.7对象的上转型对象
这一节是本章(子类与继承)的重点内容。
举个例子:
我们常说“老虎是动物”、“狗是动物”等。动物类是老虎类的父亲,这样说也没有问题,但要注意,当我们说“老虎是动物”的时候,老虎将失去老虎独有的属性和功能。
从人的思维方式上看,“老虎是动物”属于上溯思维。
1 | A a; |
(1) 上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一些行为)。
(2) 上转型对象可以访问子类 继承或隐藏 的成员变量,也可以调用子类继承的方法或子类 重写 的实例方法,其作用等价于子类对象去调用这些方法。因此,如果子类 重写了父类的某和实例方法 后,当对象的上转型对象调用这个实例方法时一定是调用了子类 重写的实例方法 。
注意事项:
- 不要将父类创建的对象和子类对象的上转型混淆。
- 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有的属性和功能。
- 不可以将父类创建的对象的引用赋值给子类声明的对象(不能说“人是美国人”)。
- 如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法。
1 | package 第五章; |
输出:1
2
3120
120
-100
5.8继承与多态
多态性是指父类的某个方法被其子类重写的时候,可以各自产生自己的功能行为。
例子:
1 | package 第五章; |
5.9 abstract类与abstract方法(抽象类与抽象方法)
用abstract 修饰的类或方法,就叫做抽象类或抽象方法。
不能用final 和 abstract 同时修饰一个方法或类 也不能用static 修饰 abstract方法,即 abstract方法必须是实例方法。
类似摘要,方法体是由子类重写。
重点:
- abstract 类中可以有 abstract方法 不能有方法体
- abstract 类不能用new 运算符创建对象(可以直接声明,但不能用new)
- abstract 类的子类,必须有子类,所以不能有final修饰,子类必须重写抽象类方法。
- abstract 类的对象作上转型对象,抽象类的对象做子类对象,调用与子类相同
- 理解abstract:让开发者注重行为的标准,而不是细节,作用类似于摘要,宏观的战略布局,细节方面交给子类来完善。
举例:
1 | package 第五章; |
输出:1
2
3
4
5
6
7你好!
我会做烤牛排
Hello, nice to meet you!
roast beef
5.10 难点:面向抽象编程
概念:所谓的面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。
例子:求柱体积
面对用户需求的变化,常规程序中可能会大幅度更改,会很麻烦。可以用抽象类概括用户的相似需求。1
2
3
4
5//抽象类
public abstract class Geometry
{
public abstract double getArea();
}
1 | package 柱体体积; |
1 | package 柱体体积; |
1 | package 柱体体积; |
1 | package 柱体体积; |
1 | package 柱体体积; |
5.11 开——闭原则
所谓“开——闭原则”就是让设计的系统应当对扩展开放,对修改关闭。实际上,这句话的本质是:当系统中增加新的模块的时候,不需要修改现有的模块。
设计的核心部分一定是经过精心设计之后确定下来的基本结构,这部分应该是对修改关闭的,即不能因为用户的需求变化而在发生任何变化,因为这部分不是用来应对需求变化的
如果系统的设计遵守了“开——闭原则”,那么这个系统一定是易维护的,因为在系统中怎加模块的时候,不必去修改系统中的核心模块。