* * * 《Java程序设计实用教程(第2版)》 第5章 配合例子源代码一起使用 子类与继承 * * 导读 * * §5.1 子类与父类 利用继承,可以先编写一个共有属性的一般类,根据该一般类再编写具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。 由继承而得到的类称为子类,被继承的类称为父类(超类)。 例如: class Student extends People { … … } 声明一个类的子类的格式如下: class 子类名 extends 父类名 { … … } * * §5.2 子类的继承性 所谓子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作。 所谓子类继承父类的方法作为子类中的一个方法,就象它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。 * * §5.2.1 子类和父类在同一包中的继承性 如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。 * * 例5-1 People.java , Student.java , UniverStudent.java , Example5_1.java 例5-1中有4个类:People,Student.java,UniverStudent.java和Example5_1,这些类都没有包名(需要分别打开文本编辑器编写、保存这些类的源文件,如保存到C:\ch5目录中),其中,UniverStudent类是Student的子类,Student是People的子类 * * §5.2.2 子类和父类不在同一包中的继承性 ? 如果子类和父类不在同一个包中,那么,子类继承了父类的protected、public成员变量做为子类的成员变量,并且继承了父类的protected、public方法为子类的方法,继承的成员或方法的访问权限保持不变。 * * §5.2.3 protected的进一步说明 ( 选讲 ) ? 一个类A中的protected成员变量和方法可以被它的直接子类和间接子类继承,如B是A的子类,C是B的子类,D又是C的子类,那么B、C和D类都继承了A类的protected成员变量和方法。 如果用D类在D中创建了一个对象,该对象总是可以通过“.”运算符访问继承的或自己定义的protected变量和protected方法的,但是,如果在另外一个类中,如在Other类中用D类创建了一个对象object,该对象通过“.”运算符访问protected变量和protected方法的权限如所述。 (1)对于子类D中声明的protected成员变量和方法,如果object要访问这些protected成员变量和方法,只要Other类和D类在同一个包中就可以了。 (2)如果子类D的对象的protected成员变量或protected方法是从父类继承的,那么就要一直追溯到该protected成员变量或方法的“祖先”类,即A类,如果Other类和A类在同一个包中,那么object对象能访问继承的protected变量和protected方法。 * * §5.2.4 继承关系(Generalization)的UML图 如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。 * * §5.2.5 关于instanceof运算符 instanceof运算符是Java独有的运算符号。 instanceof是双目运算符,其左面的操作元是对象,右面的操作元是类,当左面的操作元是右面的类或子类所创建的对象时,instanceof运算的结果是true,否则是false。 对于例5-1中的People、Student和UniverStudent类,如果zhang和zhaoqiang分别是Student和UniverStudent创建的对象,那么 zhaoqiang instanceof People zhaoqiang instanceof Student zhang insta