Java 2实用教程第4版_第5章_子类与继承
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
private 默认 protected public
2015/12/6
§5.2.2 继承关系(Generalization)的UML图 如果一个类是另一个 类 的 子 类 , 那 么 UML 通 过使用一个实线连接两 个 类 的 UML 图 来 表 示 二 者之间的继承关系,实 线的起始端是子类的 UML 图 , 终 点 端 是 父 类 的 UML 图 , 但 终 点 端 使 用一个空心的三角形表 示实线的结束。
2015/12/6
第 2 页
回顾
• 面向对象三个特征 • 封装的好处 --编程思维接近人类思维习惯 --使操作具有行为主体 --减少参数传递
2015/12/6
第 3 页
代码复用
•人类文明不断地进步,并不是现在的人比 古代的人要聪明,而是我们能不断地 “复用”前人的知识、经验。
•一切皆可复用 •举例
Hale Waihona Puke Baidu
Draw ()
Move ()
子类 - 绘制和移动五边形
Pentagon
Draw () { DrawPentagon } Move () { MovePentagonVertices }
2015/12/6
第 26 页
方法重写
• 父类和子类中具有相同名称和类型的方法
public static void main(String [] arg) { Rectangle rectObj = new Rectangle(10, 15); rectObj.getPerimeter(); Rectangle sqObj= new Square(15); sqObj.getPerimeter(); }
§5.4.2 方法重写(Override) 子类通过重写可以隐藏已继承的实例方法。 1.重写的语法规则 如果子类可以继承父类的某个实例方法,那么子类就 有权利重写这个方法。 方法重写是指:子类中定义一个方法,这个方法的类 型和父类的方法的类型一致或者是父类的方法的类型的 子类型,并且这个方法的名字、参数个数、参数的类型 和父类的方法完全相同。 2.重写的目的 子类通过方法的重写可以隐藏继承的方法,子类通 过方法的重写可以把父类的状态和行为改变为自身的状 态和行为。 ----------父类子类具有同名成员(方法)
方法具有不同的 参数列表
2015/12/6
第 31 页
2015/12/6
/*** 无参数可显示/ 方法重载 2 void display() { System.out.println("无参数可显示!!"); } /** * @param num 传递至 display 方法的参数 * @param num1 传递至 display 方法的参数 */ void display(int num, int num1) { System.out.println("两个整数是:" + num + " " + num1); } /** * @param型的 count 由 display 方法接收 */ void display(double count) { System.out.println("在 display(double)方法内:" + 演示:示例 4 count)
2015/12/6
第 25 页
多态性
子类 - 绘制和移动三角形
Triangle Draw () { DrawTraingle } Move () { MoveTriangleVertices }
父类 Shape
子类 - 绘制和移动矩形
Rectangle Draw () { DrawRectangle } Move () { MoveRectangleCorner }
final 关键字可以修饰类、成员变量和方 法中的局部变量。
2015/12/6
第 17 页
§5.6.1 final类
可以使用final将类声明为final类。final 类不能被继承,即不能有子类。如:
final class A { … … }
2015/12/6
第 18 页
§5.6.2 final方法
A a; a=new B(); 或 A a; B b=new B(); a=b;
这时,称对象a是对象b的上转型对象。
2015/12/6
第 21 页
1.上转型对象不能操作子类新增的成员变量;不能调用子类新增的方法。 2.上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承 的方法或子类重写的实例方法。上转型对象操作子类继承的方法或子类重写 的实例方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写 了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定 是调用了子类重写的实例方法。
2015/12/6
第 10 页
§5.3 子类与对象
5.3.1 子类对象的特点 子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量 被分配了内存,而且父类的成员变量也都分配了内存空间,但只将子类继 承的那部分成员变量作为分配给子类对象的变量 。 子类中有一部分方法是从父类继承的,这部分方法可以操作子类未继 承的变量 。
注意:开始用功了!
子类与继承
2015/12/6
第 1 页
主要内容 • 子类与父类 • 子类的继承性 • 子类与对象 • 成员变量的隐藏和方法重写 • super关键字 • final关键字 • 对象的上转型对象 • 继承与多态 • abstract类与abstract方法 • 面向抽象编程 • 开-闭原则
2015/12/6
第 13 页
3.重写的注意事项
重写父类的方法时,不允许降低方法的访问权限,但可以提 高访问权限(访问限制修饰符按访问权限从高到低的排列顺序 是:public、protected、友好的、private。)
4.JDK1.5对重写的改进
在JDK1.5版本之后,允许重写方法的类型可以是父类方法 的类型的子类型,即不必完全一致(JDK1.5版本之前要求必须 一致),比如父类的方法的类型是 People ,重写方法的类型可 以是Student(假设Student是People的子类)
调用父类方法
调用子类方法
2015/12/6
第 27 页
class Square extends Rectangle { Square(int len) { length = len; } /* 计算周长.*/ void getPerimeter() { System.out.println(“正方形的周长为" + (4 * length)); } }
5.3.2 关于instanceof运算符 instanceof运算符是Java独有的双目运算符,其左面的操作元是对象,右 面的操作元是类,当左面的操作元是右面的类或其子类所创建的对象时, instanceof运算的结果是true,否则是false
2015/12/6
第 11 页
§5.4 成员变量的隐藏和方法重写
§5.4.1 成员变量的隐藏
对于子类可以从父类继承的成员变量,只要 子类中声明的成员变量和父类中的成员变量同 名时,子类就隐藏了继承的成员变量,子类自 己声明定义的方法操作与父类同名的成员变量 是指子类重新声明定义的这个成员变量。 ----------父类子类具有同名成员(变量)
2015/12/6
第 12 页
第 32 页
public static void main(String [ ] arg) { int count = 25; DisplayNumber dispObj = new DisplayNumber(); dispObj.display(); dispObj.display(10 , 20); /* 不存在具有一个 int 型参数的方法, *int 型值自动转化为 double 型值 */ System.out.println(“调用 display(double) 方法," + “使用 int 变量: " + count);
2015/12/6
第 4 页
§5.1 继承(子类与父类)
利用继承,可以先编写一个 共有属性的一般类,根据该一 般类再编写具有特殊属性的新 类,新类继承一般类的状态和 行为,并根据需要增加它自己 的新的状态和行为。 由继承而得到的类称为子类, 被继承的类称为父类(超类)。
2015/12/6
第 5 页
2015/12/6
第 8 页
§5.2.1 子类和父类在同一包中的继承性
子类和父类在同一包中:继承了其父类中不
是private的成员,访问权限保持不变。
子类和父类不在同一包中:继承了其父类中
同一包 否 继承 继承 继承 不同包 否 否 继承 继承
第 9 页
protected、public 的成员,访问权限保持不变。
2015/12/6
第 7 页
§5.2 子类的继承性 所谓子类继承父类的成员变量作为自己的一个成 员变量,就好象它们是在子类中直接声明一样,可以 被子类中自己定义的任何实例方法操作。 所谓子类继承父类的方法作为子类中的一个方法, 就好象它们是在子类中直接定义了一样,可以被子类 中自己定义的任何实例方法调用。
2015/12/6
第 14 页
§5.5 super关键字
5.5.1 用super操作被隐藏的成员变量和方法
子类可以隐藏从父类继承的成员变量和方法, 如果在子类中想使用被子类隐藏的成员变量或 方法就可以使用关键字super。比如super.x、 super.play()就是访问和调用被子类隐藏的成 员变量x和方法play().
2015/12/6
第 28 页
class Rectangle { int length; int width; Rectangle(int len , int wid) { length = len; width = wid; } /* 计算矩形的周长.*/ void getPerimeter() { System.out.println(“矩形的周长为" + (2 * (length + width))); } }
如果用 final 修饰父类中的一个方法,那么 这个方法不允许子类重写。
2015/12/6
第 19 页
§5.6.3 常量
如果成员变量或局部变量被修饰为 final的, 就是常量。
2015/12/6
第 20 页
§5.7 对象的上转型对象
假设,A类是B类的父类,当用子类创建一个对象, 并把这个对象的引用放到父类的对象中时,比如:
2015/12/6
第 22 页
回顾:继承的特点
继承的特点
具有层次结构
子类继承了父类的 属性和方法
2015/12/6
第 23 页
回顾:继承的优点
继承的优点
代码的可重用性
可以轻松地自定义 子类 设计应用程序变 得更加简单
第 24 页
父类的属性和方 法可用于子类
2015/12/6
5.8 多态性 • 多态性是指“多种形式” • 它使用不同的实例而执行不同操作 • 多态包括方法重写和方法重载
2015/12/6
第 29 页
方法重写
方法重写
子类和父类的方法具 有相同的名称和类型
super.methodname() 用于 调用父类中的方法
用子类对象调用子类 中的重写方法
2015/12/6
第 30 页
方法重载1
方法重载 方法重载
类中有多个具 类中有多个具有相 有相同名称的 同名称的方法 方法
第 6 页
5.1.2类的树形结构
Java的类按继承关系形成树形结构这个树形结构中,根节点是Object类 (Object是java.lang包中的类),即Object是所有类的祖先类。 除了Object类每个类有且仅有一个父类,一个类可以有多个或零个子类。 如果一个类(除了Object类)的声明中没有使用 extends 关键字,这个类被系 统默认为是Object的子类,即类声明“class A”与“class A extends Object”是等 同的。
5.1.1 声明子类 使用关键字extends来定义一个类的子类,格式如下: class 子类名 extends 父类名 { … }
例如: class Student extends People { … } 把Student类定义为People类的子类、People类是Student类的父类
2015/12/6
2015/12/6
第 15 页
§5.5.2 使用super调用父类的构造方法
子类不继承父类的构造方法,因此,子类如果想使用父类的 构造方法,必须在子类的构造方法中使用,并且必须使用关键 字super来表示,而且super 必须是子类构造方法中的头一条语 句。
例子
2015/12/6
第 16 页
§5.6 final关键字
2015/12/6
§5.2.2 继承关系(Generalization)的UML图 如果一个类是另一个 类 的 子 类 , 那 么 UML 通 过使用一个实线连接两 个 类 的 UML 图 来 表 示 二 者之间的继承关系,实 线的起始端是子类的 UML 图 , 终 点 端 是 父 类 的 UML 图 , 但 终 点 端 使 用一个空心的三角形表 示实线的结束。
2015/12/6
第 2 页
回顾
• 面向对象三个特征 • 封装的好处 --编程思维接近人类思维习惯 --使操作具有行为主体 --减少参数传递
2015/12/6
第 3 页
代码复用
•人类文明不断地进步,并不是现在的人比 古代的人要聪明,而是我们能不断地 “复用”前人的知识、经验。
•一切皆可复用 •举例
Hale Waihona Puke Baidu
Draw ()
Move ()
子类 - 绘制和移动五边形
Pentagon
Draw () { DrawPentagon } Move () { MovePentagonVertices }
2015/12/6
第 26 页
方法重写
• 父类和子类中具有相同名称和类型的方法
public static void main(String [] arg) { Rectangle rectObj = new Rectangle(10, 15); rectObj.getPerimeter(); Rectangle sqObj= new Square(15); sqObj.getPerimeter(); }
§5.4.2 方法重写(Override) 子类通过重写可以隐藏已继承的实例方法。 1.重写的语法规则 如果子类可以继承父类的某个实例方法,那么子类就 有权利重写这个方法。 方法重写是指:子类中定义一个方法,这个方法的类 型和父类的方法的类型一致或者是父类的方法的类型的 子类型,并且这个方法的名字、参数个数、参数的类型 和父类的方法完全相同。 2.重写的目的 子类通过方法的重写可以隐藏继承的方法,子类通 过方法的重写可以把父类的状态和行为改变为自身的状 态和行为。 ----------父类子类具有同名成员(方法)
方法具有不同的 参数列表
2015/12/6
第 31 页
2015/12/6
/*** 无参数可显示/ 方法重载 2 void display() { System.out.println("无参数可显示!!"); } /** * @param num 传递至 display 方法的参数 * @param num1 传递至 display 方法的参数 */ void display(int num, int num1) { System.out.println("两个整数是:" + num + " " + num1); } /** * @param型的 count 由 display 方法接收 */ void display(double count) { System.out.println("在 display(double)方法内:" + 演示:示例 4 count)
2015/12/6
第 25 页
多态性
子类 - 绘制和移动三角形
Triangle Draw () { DrawTraingle } Move () { MoveTriangleVertices }
父类 Shape
子类 - 绘制和移动矩形
Rectangle Draw () { DrawRectangle } Move () { MoveRectangleCorner }
final 关键字可以修饰类、成员变量和方 法中的局部变量。
2015/12/6
第 17 页
§5.6.1 final类
可以使用final将类声明为final类。final 类不能被继承,即不能有子类。如:
final class A { … … }
2015/12/6
第 18 页
§5.6.2 final方法
A a; a=new B(); 或 A a; B b=new B(); a=b;
这时,称对象a是对象b的上转型对象。
2015/12/6
第 21 页
1.上转型对象不能操作子类新增的成员变量;不能调用子类新增的方法。 2.上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承 的方法或子类重写的实例方法。上转型对象操作子类继承的方法或子类重写 的实例方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写 了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定 是调用了子类重写的实例方法。
2015/12/6
第 10 页
§5.3 子类与对象
5.3.1 子类对象的特点 子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量 被分配了内存,而且父类的成员变量也都分配了内存空间,但只将子类继 承的那部分成员变量作为分配给子类对象的变量 。 子类中有一部分方法是从父类继承的,这部分方法可以操作子类未继 承的变量 。
注意:开始用功了!
子类与继承
2015/12/6
第 1 页
主要内容 • 子类与父类 • 子类的继承性 • 子类与对象 • 成员变量的隐藏和方法重写 • super关键字 • final关键字 • 对象的上转型对象 • 继承与多态 • abstract类与abstract方法 • 面向抽象编程 • 开-闭原则
2015/12/6
第 13 页
3.重写的注意事项
重写父类的方法时,不允许降低方法的访问权限,但可以提 高访问权限(访问限制修饰符按访问权限从高到低的排列顺序 是:public、protected、友好的、private。)
4.JDK1.5对重写的改进
在JDK1.5版本之后,允许重写方法的类型可以是父类方法 的类型的子类型,即不必完全一致(JDK1.5版本之前要求必须 一致),比如父类的方法的类型是 People ,重写方法的类型可 以是Student(假设Student是People的子类)
调用父类方法
调用子类方法
2015/12/6
第 27 页
class Square extends Rectangle { Square(int len) { length = len; } /* 计算周长.*/ void getPerimeter() { System.out.println(“正方形的周长为" + (4 * length)); } }
5.3.2 关于instanceof运算符 instanceof运算符是Java独有的双目运算符,其左面的操作元是对象,右 面的操作元是类,当左面的操作元是右面的类或其子类所创建的对象时, instanceof运算的结果是true,否则是false
2015/12/6
第 11 页
§5.4 成员变量的隐藏和方法重写
§5.4.1 成员变量的隐藏
对于子类可以从父类继承的成员变量,只要 子类中声明的成员变量和父类中的成员变量同 名时,子类就隐藏了继承的成员变量,子类自 己声明定义的方法操作与父类同名的成员变量 是指子类重新声明定义的这个成员变量。 ----------父类子类具有同名成员(变量)
2015/12/6
第 12 页
第 32 页
public static void main(String [ ] arg) { int count = 25; DisplayNumber dispObj = new DisplayNumber(); dispObj.display(); dispObj.display(10 , 20); /* 不存在具有一个 int 型参数的方法, *int 型值自动转化为 double 型值 */ System.out.println(“调用 display(double) 方法," + “使用 int 变量: " + count);
2015/12/6
第 4 页
§5.1 继承(子类与父类)
利用继承,可以先编写一个 共有属性的一般类,根据该一 般类再编写具有特殊属性的新 类,新类继承一般类的状态和 行为,并根据需要增加它自己 的新的状态和行为。 由继承而得到的类称为子类, 被继承的类称为父类(超类)。
2015/12/6
第 5 页
2015/12/6
第 8 页
§5.2.1 子类和父类在同一包中的继承性
子类和父类在同一包中:继承了其父类中不
是private的成员,访问权限保持不变。
子类和父类不在同一包中:继承了其父类中
同一包 否 继承 继承 继承 不同包 否 否 继承 继承
第 9 页
protected、public 的成员,访问权限保持不变。
2015/12/6
第 7 页
§5.2 子类的继承性 所谓子类继承父类的成员变量作为自己的一个成 员变量,就好象它们是在子类中直接声明一样,可以 被子类中自己定义的任何实例方法操作。 所谓子类继承父类的方法作为子类中的一个方法, 就好象它们是在子类中直接定义了一样,可以被子类 中自己定义的任何实例方法调用。
2015/12/6
第 14 页
§5.5 super关键字
5.5.1 用super操作被隐藏的成员变量和方法
子类可以隐藏从父类继承的成员变量和方法, 如果在子类中想使用被子类隐藏的成员变量或 方法就可以使用关键字super。比如super.x、 super.play()就是访问和调用被子类隐藏的成 员变量x和方法play().
2015/12/6
第 28 页
class Rectangle { int length; int width; Rectangle(int len , int wid) { length = len; width = wid; } /* 计算矩形的周长.*/ void getPerimeter() { System.out.println(“矩形的周长为" + (2 * (length + width))); } }
如果用 final 修饰父类中的一个方法,那么 这个方法不允许子类重写。
2015/12/6
第 19 页
§5.6.3 常量
如果成员变量或局部变量被修饰为 final的, 就是常量。
2015/12/6
第 20 页
§5.7 对象的上转型对象
假设,A类是B类的父类,当用子类创建一个对象, 并把这个对象的引用放到父类的对象中时,比如:
2015/12/6
第 22 页
回顾:继承的特点
继承的特点
具有层次结构
子类继承了父类的 属性和方法
2015/12/6
第 23 页
回顾:继承的优点
继承的优点
代码的可重用性
可以轻松地自定义 子类 设计应用程序变 得更加简单
第 24 页
父类的属性和方 法可用于子类
2015/12/6
5.8 多态性 • 多态性是指“多种形式” • 它使用不同的实例而执行不同操作 • 多态包括方法重写和方法重载
2015/12/6
第 29 页
方法重写
方法重写
子类和父类的方法具 有相同的名称和类型
super.methodname() 用于 调用父类中的方法
用子类对象调用子类 中的重写方法
2015/12/6
第 30 页
方法重载1
方法重载 方法重载
类中有多个具 类中有多个具有相 有相同名称的 同名称的方法 方法
第 6 页
5.1.2类的树形结构
Java的类按继承关系形成树形结构这个树形结构中,根节点是Object类 (Object是java.lang包中的类),即Object是所有类的祖先类。 除了Object类每个类有且仅有一个父类,一个类可以有多个或零个子类。 如果一个类(除了Object类)的声明中没有使用 extends 关键字,这个类被系 统默认为是Object的子类,即类声明“class A”与“class A extends Object”是等 同的。
5.1.1 声明子类 使用关键字extends来定义一个类的子类,格式如下: class 子类名 extends 父类名 { … }
例如: class Student extends People { … } 把Student类定义为People类的子类、People类是Student类的父类
2015/12/6
2015/12/6
第 15 页
§5.5.2 使用super调用父类的构造方法
子类不继承父类的构造方法,因此,子类如果想使用父类的 构造方法,必须在子类的构造方法中使用,并且必须使用关键 字super来表示,而且super 必须是子类构造方法中的头一条语 句。
例子
2015/12/6
第 16 页
§5.6 final关键字