读书笔记"/>
《Head First Java》20200911读书笔记
P165-P181
《Head First Java》20200911读书笔记
第七章 继承与多态
- 子类会自动获得父类的功能。
- 覆盖的意思是由子类重新定义继承下来的方法以改变或延伸此方法的行为。
- 父类比较抽象,子类比较具体。
继承的运行方法
在设计继承时,把共同的程序代码放在某个类中,然后告诉其他的类,说此类是它们的父类。当某个类继承另一个类的时候,也就是子类继承自父类。
以Java的方式说,这就是“子类继承父类”。继承的关系意味着子类继承了父类的方法。当我们提及“类的成员”时,成员的意思就是实例变量和方法。
但是子类可以加入自己的方法和实例变量,也可以覆盖掉继承来自父类的方法。
继承的范例
public class Doctor{boolean worksAtHospital;void treatPatient(){//执行检查}
}
public class FamilyDoctor extends Doctor{boolean makesHouseCalls;void giveAdvice(){//提出诊断}
}
public class Surgeon extends Doctor{void treatPatient(){//进行手术}void makeIncision(){//手术}
}
Surgeon有1个实例变量
FamilyDoctor有2个实例变量
Doctor有1个方法
Surgeon有2个方法
FamilyDoctor有2个方法
FamilyDoctor可以执行treatPatient()
FamilyDoctor不可以执行makeIncision()
继承层次的设计
设计动物仿真程序的继承树
要求:设计一个仿真系统程序,可以让用户设定将一群动物丢到某种环境中以观察会发生什么事情。
我们已经被告知一部分会用到的动物,但是并不知道还有多少种动物加进来。每个动物都会用一个对象来表示,且动物会在环境中活动,执行任何被设计的行为。
这个程序必须能够在任何时间加入新类型的动物。
我们首先要辨别出所有动物都有的、抽象的共同特征,然后以这些共同特征设计出能够让所有动物加以扩充的类。
-
找出具有共同属性和行为的对象
这6种动物有什么共同点?这么问可以帮助执行第二个步骤。
这些类型有什么相关性?这么问有助于执行第四到第五个步骤。 -
设计代表共同状态与行为的类
这些对象都是动物,因此我们可以用Animal作为共同父类的名称,并把所有动物都需要的方法和实例变量加进去。
5个实例变量
picture:动物JPEG图像的名称。
food:此动物所吃的食物。现在只有meat和grass两种值。
hunger:代表饥饿程度的int值。它会根据动物吃了多少东西而改变。
boundaries:代表动物活动范围区域的长宽。
location:动物在活动区域中的X与Y坐标。
4个方法
makeNoise():动物发出声音的行为程序。
eat():动物遇到食物时的行为程序。
sleep():睡眠的行为程序。
roam():不在进食或睡眠时的行为程序。
-
决定子类是否需要让某项行为(也就是方法的实现)有特定不同的运作方式
eat()与makeNoise()应该由各个子类自行覆盖,让每个动物定义出不同的进食和叫声行为。
sleep()与roam()可以共享。 -
通过寻找使用共同行为的子类来找出更多抽象化的机会
Animal的子类找寻是否有可以组织归纳使用共同代码的部分。
Wolf与Dog有某些共同的行为,Lion、Tiger、Cat之间也是。 -
完成类的继承层次
继承树的实用设计
Java虚拟机会从层次树的最低阶找起。
“是一个(is a测试)”与“有一个”
“前者是一个后者”——“前者可以继承后者”
“前者有一个后者”——“前者有一个实例变量后者”
问:如果在子类中还打算引用父类的方法然后加上额外的行为应该怎么办?
答:这是可行的。事实上这个功能非常重要。扩充本来就有扩充和延伸的意思。
public void roam(){super.roam();//my own roam stuff//这会先执行super版的roam(),然后再回来执行sub版自定义的行为或功能
}
你可以在父类中设计出所有子类都适用的功能实现,让子类可以不用完全覆盖掉父类的功能,只是再加上额外的行为。你可以通过super这个关键词来取用父类。
继承权限
父类可以通过存取权限(access level)决定子类是否能够继承某些特定的成员。
限制程度从小到大:private default protected public
public类型的成员会被继承,private类型的成员不会被继承。
当子类把成员继承下来时会把它们当作是自己定义的一样。
任一类的成员包含有自己定义出的变量和方法,加上从父类所继承下来的任何东西。
总结
- 子类是extends父类出来的。
- 子类会继承父类所有public类型的实例变量和方法,但不会继承父类所有private类型的变量和方法。
- 继承下来的方法可以被覆盖掉,但实例变量不能被覆盖掉。
- 使用is a测试(“是一个”)来验证继承结构的合理性。
- is a关系是单方向的,河马是动物,但动物不一定是河马。
- 当某个方法在子类中被覆盖过,调用这个方法时会调用到覆盖过的版本。
- 如果类Y是extends类X,且类Y是类Z的父类,则Z应该能通过is a X的测试。
更多推荐
《Head First Java》20200911读书笔记
发布评论