JAVA程序设计(第五章 子类与继承)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1:中国人、北京人和美国人
编写程序模拟中国人、美国人是人,北京人是中国人 。除了主类外,程序中还有4个类People、ChinaPeople 、AmericanPeople和BeijingPeople类。要求如下: People类有权限是protected的double型成员变量height 和weight,以及public void speakHello(),public void averageHeight()和public void averageWeight()方法。 ChinaPeople类是People的子类,新增了public void chinaGongfu()方法。要求ChinaPeople重写父类的public void speakHello()、public void averageHeight()和public void averageWeight()方法。
12
成员变量的隐藏和方法的重写
方法重写
如果父类的方法 f() 被子类重写,子类就隐藏了父类 的 f() 方法,则子类对象调用的 f() 方法是子类重写的 f() 方法
子类重写的方法可以调用从父类继承的成员变量和 成员方法,也可以操作子类新声明的成员变量和方法 ,但无法操作被子类隐藏的父类的成员变量和方法
UniverStudent
mike
成员变量的隐藏和方法的重写
成员变量的隐藏
当子类中定了和父类中同名的成员变量(类型可以 不同),父类中的成员变量在子类中被隐藏
子类对象及子类自己定义的方法中操作与父类同名 的成员变量时,实际上操作的是子类自己定义的这个 成员变量
子类继承的方法操作的成员变量是被子类隐藏的父 类的成员变量
4
子类的继承性
子类和父类在同一个包中的继承性
子类继承其父类中不是 private 的成员变量和成员方 法作为自己的成员变量和成员方法,继承的成员变量 和成员方法访问权限保持不变
例1:所有的类都在无名包中
Example5_1 People Student UniverStudent
5
子类的继承性
31
面向抽象编程
面向抽象编程的目的是为了应对用户需求的变化,将 某个类中经常因需求变化而需要改动的代码从该类中 分离出去,让类中每种可能的变化对应的交给抽象类 的一个子类去负责,从而让该类的设计不去关心具体 的实现 例13 Pillar
32
面向抽象编程
开-闭原则: 对扩展开放, 对修改关闭
33
子类不继承父类的构造方法,故在子类的构造方法 中需用super来调用父类的构造方法,且super必须是子 类构造方法中的第一条语句
18
super关键字
用super调用父类的构造方法
如果在子类的构造方法中未明显的写成 super关键字 来调用父类的某个构造方法,则默认有:
super();
当父类中定义了多个构造方法时,应当包括一个不 带参数的构造方法,以防子类省略super时出现错误
public class Pillar { Circle bottom; double height; Pillar (Circle bottom,double height) { this.bottom=bottom; this.height=height; } public double getVolume() { return bottom.getArea()*height; //bottom可以调用子类重写的getArea方法 } }
如果子类和父类不在同一个包中,子类不继承父类 的友好成员变量
子类从父类继承过来的方法可以操作上述这两部分 未被继承的变量
例2
9
子类与对象
关于instanceof运算符
当左边的操作元是右边的类或其子类所创建的对象时 ,instanceof运算结果为true,否则为false
kate instanceof student
A
如果在类 D 中创建了 D 本身的对 象,那么该对象可以通过“ . ”运 算符访问继承的或自己的 protected变量和方法
B
C
D
7
子类的继承性
protected的进一步说明
在Other类中创建了 D 类的对象 obj ,则 protected 的成员变量和成员方 法权限如下:
只要 Other 类和 D 类在同一个包中, obj 对 象 可 以 访 问 D 类 自 己 声 明 的 protected成员变量和方法
14
成员变量的隐藏和方法的重写
方法重写
重写父类方法时 ,不 能降低方法的访问权限 ,可以提高访问权限
class A{ protected float f(float x,float y){ return x-y; } } class B extends A{ //非法,降低了访问权限 float f(float x,float y){ return x+y; } } class C extends A{ //合法,提高了访问权限 public float f(float x,float y){ return x*y; } }
A a;
B b=new BBiblioteka Baidu); a=b;
22
a=b;
a 是对象 b 的上转型对 象,好比“老虎是动物”
对象的上转型对象
上转型对象不能操作子类新增的成员变量;不能 调用子类新增的方法。
上转型对象可以访问子类继承或隐藏的成员变量 ,也可以调用子类继承的方法或子类重写的实例 方法。
如果子类重写了父类的某个实例方法后,当对象 的上转型对象调用这个实例方法时一定是调用了 子类重写的实例方法。
子类和父类不在同一个包中的继承性
子类只继承父类中的protected和public访问权限的成 员变量和成员方法
父类中的 private 和友好访问权限的成员变量和成员 方法不被继承
6
子类的继承性
protected的进一步说明
类 A 中的 protected 成员变量和方 法可以被它的子孙类继承
常量
如果 成员变量或局部变量被修饰为 final 的,就是常
量
例9
21
对象的上转型对象
假设, A 类是 B 类的父类,当用子类创建一个对 象,并把这个对象的引用放到父类的对象中时, 比如:
A a; a=new B(); 或 这 时 , 称对象a 是对象b 的 上 转 型对象。
Animal a; Tiger b=new Tiger ();
8
对于子类D从父类继承的protected成 员变量和方法,需要追溯这些protected 成员变量或方法的祖先,如A类,只要 Other 类和 A 类在同一个包中, obj 对象 能访问继承的protected成员变量和方法
子类与对象
子类对象的特点
子类不继承父类的private成员变量
用extends来定义一个子类:
class 子类名 extends 父类名
{ … } class Student extends People { …
3
}
子类与父类
类的树形结构
•任何类都是Object的子孙类 •每个类有且仅有一个父类 •一个类可有多个子类 •一个类的定义中无extends,则默认是 Object的子类
abstract类的对象作上转型对象
注意2点:
abstract类可以没有abstract方法 如果一个abstract类是abstract类的子类,它可以重写父类的 abstract方法,也可以继承父类的abstract方法 例12
29
面向抽象编程
在设计一个程序时,可以通过在abstract类中声明若干 个abstract方法,表明这些方法在整个系统设计中的重 要性,方法体的内容细节由它的非abstract子类去完成 。 使用多态进行程序设计的核心技术之一是使用上转型 对象,即将abstract类声明对象作为其子类的上转型对 象,那么这个上转型对象就可以调用子类重写的方法 。
例4 Example5_4 University ImportantUniversity 例5
13
成员变量的隐藏和方法的重写
方法重写
例 5 中若将 computer() 方法的返回类型改为 double 将 产生编译错误,原因:
不是重写了父类的computer()方法
类中不能同时存在两个方法名相同、参数也相同,但返 回值不同的同名方法,不符合重载的语法规则
15
成员变量的隐藏和方法的重写
方法重写
允许重写方法的类型可以是父类方法类型的子类型
例6
16
super关键字
用super操作被隐藏的成员变量和成员方法
如果在子类中想使用被子类隐藏的成员变量或方法 需要使用super关键字
例7
17
super关键字
用super调用父类的构造方法
当用子类的构造方法创建一个子类的对象时,子类 的构造方法总是先调用父类的某个构造方法,如果子 类的构造方法没有明显的指明使用父类的哪个构造方 法,子类就调用父类的不带参数的构造方法
27
//无方法体
abstract类和abstract方法
注意2点:
不允许使用final和abstract同时修饰一个方法或类 不允许使用static修饰abstract方法
abstract类中可以有abstract方法,也可以有非abstract 方法(非abstract类中不可以有abstract方法)
JAVA程序设计
Java2 实用教程(第四版) 陈艳
1
第五章 子类与继承
子类与父类 子类的继承性 子类与对象 成员变量的隐藏和方法 重写
对象的上转型对象 继承与多态
abstract类与
abstract方法
面向抽象编程
开-闭原则
super关键字
final关键字类
2
子类与父类
abstract class A{ abstract int min(int x,int y); int max(int x,int y){ return x>y?x:y; } }
28
abstract类和abstract方法
abstract类不能用new运算符创建对象
如果一个非抽象类是抽象类的子类,则它必须重写父类的 抽象方法 可以使用abstract类声明对象,该对象可以成为子类的上转 型对象
30
面向抽象编程
所谓面向抽象编程,是指当设计某种重要的类时,不 让该类面向具体的类,而是面向抽象类,即所设计类 中的重要数据是抽象类声明的对象,而不是具体类声 明的对象。
public class Circle { double r; Circle(double r) { this.r=r; } public double getArea() { return(3.14*r*r); } }
People
kate instanceof People
ture
mike instanceof People mike instanceof student mike instanceof UniverStudent
Student
kate
false
10
kate instanceof UniverStudent
例3 Example5_3 CheapGoods Goods
11
成员变量的隐藏和方法的重写
方法重写
子类中定义和父类同名的方法,这个方法的类型和 父类的方法的类型一致或者是父类的方法的类型的子 类型(如,父类方法的类型为类 A ,那么允许子类的 重写的方法的类型是 A 的子类),且方法名、参数个 数、参数的类型和父类的方法完全相同,子类如此定 义的方法称作子类重写的方法
23
对象的上转型对象
24
对象的上转型对象
注意:
不要将父类创建的对象和子类对象的上转型对象混淆; 可以将对象的上转型对象再强制转换到一个子类对象,这 时,该子类对象又具备了子类所有的属性和功能; 不可以将父类创建的对象的引用赋值给子类声明的对象
例10
25
继承与多态
多态性就是指父类的某个方法被其子类重写时, 可以各自产生自己的功能行为
例11
26
abstract类和abstract方法
用关键字 abstract 修饰的类称为 abstract 类(抽象 类)。如:
abstract class A { …… } 用关键字 abstract 修饰的方法称为 abstract 方法( 抽象方法),例如:
abstract int min(int x,int y);
例8
19
final关键字
final关键字可以修饰类、方法、成员变量和方法中 的局部变量。
final类 final类不能被继承,即不能有子类。如: final class A { …… }
20
final关键字
final方法
如果用final修饰父类中的一个方法,那么这个方法 不允许子类重写。