第03章类的封装、继承和多态(信息学院2013级)_第1页
第03章类的封装、继承和多态(信息学院2013级)_第2页
第03章类的封装、继承和多态(信息学院2013级)_第3页
第03章类的封装、继承和多态(信息学院2013级)_第4页
第03章类的封装、继承和多态(信息学院2013级)_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 学习目标学习目标 正确使用属性、方法完成类设计正确使用属性、方法完成类设计 定义继承、多态、重载、覆盖和虚拟方法调用定义继承、多态、重载、覆盖和虚拟方法调用 理解访问修饰符理解访问修饰符private、protected、package(缺省)和(缺省)和public 描述构造器和构造方法重载的概念描述构造器和构造方法重载的概念 描述完整的对象结构和初始化操作描述完整的对象结构和初始化操作武汉理工大学信息学院Java程序设计实用教程(第4版)1第第3章章 类的封装、继承和多态类的封装、继承和多态2武汉理工大学信息学院Java程序设计实用教程(第4版)章节内容章节内容 3.1 类和对象类和对象

2、 3.2 类的封装性类的封装性 3.3 类的继承性类的继承性 3.4 类的多态性类的多态性 3.5 类的抽象性类的抽象性面向过程和面向对象区别面向过程和面向对象区别武汉理工大学信息学院Java程序设计实用教程(第4版)3 面向过程中,数据和对数据的操作是分离的。这种机制限制的功能扩充,增加维护难度。 面向对象将属性和行为封装在一起。面向过程和面向对象示例面向过程和面向对象示例面向过程和面向对象的区别示例(以去乌鲁木齐面向过程和面向对象的区别示例(以去乌鲁木齐为例)为例) 面向过程面向过程我要决定乘哪种交通工具,如何换车,每趟车的时间我要决定乘哪种交通工具,如何换车,每趟车的时间是多少是多少 面

3、向对象面向对象乘车人对象、交通工具对象(汽车、火车、飞机)、乘车人对象、交通工具对象(汽车、火车、飞机)、城市对象城市对象 武汉理工大学信息学院Java程序设计实用教程(第4版)43.1 类和对象类和对象武汉理工大学信息学院Java程序设计实用教程(第4版)5定义定义1.类类 类类(class)是既包括数据又包括作用于数据的是既包括数据又包括作用于数据的一组操作的封装体一组操作的封装体。类中的数据称为。类中的数据称为成员变量成员变量,类中对数据的操作称为类中对数据的操作称为成员方法成员方法(method)。成员。成员变量反映类的状态和特征,成员方法表示类的行变量反映类的状态和特征,成员方法表示

4、类的行为能力。不同的类具有不同的特征和功能。为能力。不同的类具有不同的特征和功能。类具有类具有封装性封装性、继承性、多态性和抽象性。、继承性、多态性和抽象性。武汉理工大学信息学院Java程序设计实用教程(第4版)6定义定义2.对象对象 对象对象(object)是类的实例()是类的实例(instance)。)。 对象与类的关系对象与类的关系就像变量与数据类型的关系一样,就像变量与数据类型的关系一样, 例如,例如,10是是int类型的一个值,一个类型的一个值,一个int变量变量i能够获能够获得并保存得并保存10这个值。这个值。 对象是动态的对象是动态的,每个对象都有自己的生存周期,都,每个对象都有

5、自己的生存周期,都会经历一个从创建、运行到消亡的变会经历一个从创建、运行到消亡的变 化过程。化过程。3.1.1 类类71. 声明类声明类类声明类声明 成员变量的声明成员变量的声明; 成员方法的声明及实现成员方法的声明及实现;类声明:类声明:修饰符修饰符 class 类类 extends 父类父类 implements 接口列表接口列表成员变量属性成员方法行为2. 声明成员变量和成员方法声明成员变量和成员方法8成员变量声明格式:成员变量声明格式:修饰符修饰符 数据类型数据类型 变量变量 =表达式表达式,变量变量 =表达式表达式成员方法声明格式:成员方法声明格式:修饰符修饰符 返回值类型返回值类型

6、 方法方法(参数列表参数列表) throws 异常类异常类 语句序列语句序列; return 返回值返回值;3. 成员方法重载类中可以有多个同名的方法名,前提是参数列表不同93.1.2 对象对象声明对象声明对象类类 对象对象创建实例创建实例对象对象 = new 类的构造方法类的构造方法(参数列表参数列表) 引用对象的成员变量和调用对象方法引用对象的成员变量和调用对象方法对象对象.成员变量成员变量对象对象.成员方法成员方法(参数列表参数列表)Java语言自动释放对象。语言自动释放对象。类和对象的示例类和对象的示例收银员对象顾客对象姓名:朱丽叶年龄:48体重:52千克操作:购买商品属性属性姓名:布

7、兰尼职衔:收银员年龄:35体重:60千克操作:收款打印帐单行为行为武汉理工大学信息学院Java程序设计实用教程(第4版)10如何定义这个例子中的类?哪些是对象?类和对象的区别类和对象的区别 类是概念模型, 定义对象的所 有特性和所需 的操作对象是真实的模型类和对象类定义实体模型对象是实际的实体类是对象的原型类是对象的原型所有属于同一个类所有属于同一个类的对象都具有相同的对象都具有相同的特性和操作的特性和操作武汉理工大学信息学院Java程序设计实用教程(第4版)11【例【例3.1】声明日期类及使用日期对象】声明日期类及使用日期对象 public class MyDate /类声明类声明 /成员变

8、量成员变量 int year, month, day; /成员变量,表示年、月、日成员变量,表示年、月、日 /成员方法成员方法 void set(int y, int m, int d) /成员方法,设置日期值成员方法,设置日期值 void set(MyDate d) /将当前对象值设置为参数值,重载将当前对象值设置为参数值,重载 public String toString() /返回中文日期字符串返回中文日期字符串 public boolean equals(MyDate d) /比较当前日期值与比较当前日期值与d是否相等是否相等 public static void main(Strin

9、g args) MyDate d1 = new MyDate(); /声明对象、创建实例、引用赋值声明对象、创建实例、引用赋值 d1.set(2009,7,16); /调用类的成员方法调用类的成员方法 MyDate d2 = d1; /对象引用赋值对象引用赋值 武汉理工大学信息学院Java程序设计实用教程(第4版)1213武汉理工大学信息学院Java程序设计实用教程(第4版)4. 对象的引用模型对象的引用模型 MyDate d1 = new MyDate();(a) 声明对象并引用实例d1.set(2009,7,16);(b) 对象调用类的成员方法d1实例MyDate d2 = d1; (c)

10、 对象引用赋值,两个对象引用一个实例000year month dayd17162009d17162009d2year month dayd1d2.year = 2008; (d) 修改d2实例的成员变量值,影响d1对象d27162008 MyDate d1 = new MyDate();(a) 声明对象并引用实例d1.set(2009,7,16);(b) 对象调用类的成员方法d1实例MyDate d2 = d1; (c) 对象引用赋值,两个对象引用一个实例000year month dayd17162009d17162009d2year month dayd1d2.year = 2008;

11、(d) 修改d2实例的成员变量值,影响d1对象d2716200814武汉理工大学信息学院Java程序设计实用教程(第4版)对象的关系运算与比较相等对象的关系运算与比较相等MyDate d2 = new MyDate();d2.set(d1);(b) 设置d2对象值同d1实例,d1=d2结果是false,d1.equals(d2)结果是trued2.set(2008,8,8);(c) 改变d2对象,不影响d1对象d17162009d27162009d17162009d2882008MyDate d2 = d1; (a) 两个对象引用一个实例,d1=d2结果是true,d1.equals(d2)结

12、果是trued17162009d2MyDate d2 = new MyDate();d2.set(d1);(b) 设置d2对象值同d1实例,d1=d2结果是false,d1.equals(d2)结果是trued2.set(2008,8,8);(c) 改变d2对象,不影响d1对象d17162009d27162009d17162009d2882008MyDate d2 = d1; (a) 两个对象引用一个实例,d1=d2结果是true,d1.equals(d2)结果是trued17162009d2MyDate d2 = new MyDate();d2.set(d1);(b) 设置d2对象值同d1实

13、例,d1=d2结果是false,d1.equals(d2)结果是trued2.set(2008,8,8);(c) 改变d2对象,不影响d1对象d17162009d27162009d17162009d2882008MyDate d2 = d1; (a) 两个对象引用一个实例,d1=d2结果是true,d1.equals(d2)结果是trued17162009d2153.2 类的封装性类的封装性信息隐藏信息隐藏,隐藏对象的实现细节,不让用户看到隐藏对象的实现细节,不让用户看到将东西包装在一起,然后以新的完整形式呈现出来将东西包装在一起,然后以新的完整形式呈现出来例如,两种或多种化学药品组成一个胶囊

14、例如,两种或多种化学药品组成一个胶囊隐藏属性、方法或实现细节的过程称为封装。是软件模块化的重要机制。隐藏属性、方法或实现细节的过程称为封装。是软件模块化的重要机制。武汉理工大学信息学院Java程序设计实用教程(第4版)封装包含了两层含义: 将数据和对数据的操作组成起来构成类,变成一个不可分割的独立单元 实现信息隐藏,类既要提供与外部联系的方法,又要尽可能地隐藏实现细节封装的示例封装的示例 3-1接口 采购经理罗杰斯先生法拉公司汽车元件制造商.迪斯尼汽车公司.市场经理雪莉女士 要求武汉理工大学信息学院Java程序设计实用教程(第4版)16 封装的示例封装的示例 3-2有选择地提供数据法拉公司迪斯

15、尼汽车公司公共电话号码电子邮箱产品种类私有备件的制造方法备件库存备件的制造成本公共电话号码电子邮箱汽车种类私有汽车的组装方法汽车库存汽车的组装成本武汉理工大学信息学院Java程序设计实用教程(第4版)17封装的示例封装的示例 3-3 实体法拉公司实体迪斯尼汽车公司Auti Ltd.Buto Ltd.属性电话号码电子邮箱产品种类现有存货数量雇员详情所需物料详情属性电话号码电子邮箱汽车种类汽车规格雇员详情库存详情经销商详情方法接收订单备件的制造方法计算备件的制造成本计算利润率方法发出订单汽车的组装方法计算汽车的组装成本计算工资发出订单编制必要报告武汉理工大学信息学院Java程序设计实用教程(第4版

16、)18蓝色为公开蓝色为公开变量和方法,变量和方法,红色为私有红色为私有变量和方法变量和方法19武汉理工大学信息学院Java程序设计实用教程(第4版)3.2.1 类的构造方法类的构造方法1. 声明及调用构造方法声明及调用构造方法public class MyDate public MyDate(int y, int m, int d) /声明构造方法 /构造方法与类同名,构造方法返回该类的一个实例 year = y; month = m; day = d; MyDate d = new MyDate(2009,7,18);2. 默认构造方法默认构造方法public MyDate()构造方法用于创

17、建一个类的实例并对实例的成员变量进行初始化。构造方法与类同名。20武汉理工大学信息学院Java程序设计实用教程(第4版)3. 拷贝构造方法拷贝构造方法public MyDate(MyDate d) year = d.year; month = d.month; day = d.day;调用语句如下:调用语句如下: MyDate d1 = new MyDate(2009,7,16); MyDate d2 = new MyDate(d1); 第第2句功能相当于以下两句:句功能相当于以下两句:MyDate d2 = new MyDate(); d2.set(d1);类构造方法的参数是该类对象,则称为

18、拷贝构造方法。MyDate d2 = d1两条语句有何不同两条语句有何不同21武汉理工大学信息学院Java程序设计实用教程(第4版)4. 构造方法重载构造方法重载public MyDate(int y, int m, int d);public MyDate(MyDate d);public MyDate();构造方法使用注意: 如果没有任何构造函数,可以直接使用new MyDate()初始化一个对象;系统会把基本数据类型变量初始化为0,引用数据类型变量初始化为NULL。 如果类中声明了有参的构造函数,就不能用无参的默认构造方法初始化一个对象。22武汉理工大学信息学院Java程序设计实用教程(

19、第4版)3.2.2 对象的引用和运算对象的引用和运算this引用引用指代对象本身指代对象本身nthis访问本类的成员变量和成员方法访问本类的成员变量和成员方法nthis.成员变量nthis.成员方法(参数列表)调用本类重载的构造方法调用本类重载的构造方法nthis(参数列表)逻辑运算符逻辑运算符 = !=用于判断是否同一个实例,不支持重载用于判断是否同一个实例,不支持重载instanceof对象运算符对象运算符nd instanceof MyDate this区分成员变量和局部变量区分成员变量和局部变量public MyDate(int y, int m, int d) year = y; m

20、onth = m; day = d; 武汉理工大学信息学院Java程序设计实用教程(第4版)23当方法中的变量和类的成员变量同名时,必须当方法中的变量和类的成员变量同名时,必须用用this来区分来区分public MyDate(int year, int month, int day) this.year = year; this.month = month; this.day = day; 类成员变量和方法变量同名,类成员变量和方法变量同名,一定要使用一定要使用this来区分。来区分。24武汉理工大学信息学院Java程序设计实用教程(第4版)3.2.3 访问控制访问控制类的访问类的访问 1.

21、 类的访问权限类的访问权限:只有:只有public和缺省两种和缺省两种 。public class MyDate; /能被同一项目中所有类访问能被同一项目中所有类访问class MyDate_ex; /只能被同一个包的类访问只能被同一个包的类访问类访问权限举例类访问权限举例package chapter03.ClassAccess;public class ClassPubAccess package chapter03.ClassAccess;class ClassDefaultAccess package chapter03.ClassAccess;public class ClassAc

22、cessTest public static void main(String args) ClassPubAccess pubAccess = new ClassPubAccess();ClassDefaultAccess defaultAccess = new ClassDefaultAccess();武汉理工大学信息学院Java程序设计实用教程(第4版)25把这个文件移动到把这个文件移动到chapter03包中包中2. 类中成员的访问权限类中成员的访问权限:有四种:有四种武汉理工大学信息学院Java程序设计实用教程(第4版)263.2.3 访问控制访问控制类成员变量的访问类成员变量的访问

23、 权限修饰符权限修饰符同一类同一类同一包同一包不同包的子类不同包的子类所有类所有类public(公有公有) protected(保护保护) 缺省缺省 private(私有私有) 27访问修饰符访问修饰符 3-2信息隐藏是信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原最重要的功能之一,也是使用访问修饰符的原因因信息隐藏的原因包括:信息隐藏的原因包括:对任何实现细节所作的更改不会影响使用该类的代码对任何实现细节所作的更改不会影响使用该类的代码防止用户意外删除数据防止用户意外删除数据此类易于使用此类易于使用 访问修饰符访问修饰符访问修饰符访问修饰符privateprotected默认p

24、ublic武汉理工大学信息学院Java程序设计实用教程(第4版)访问修饰符访问修饰符 3-3该类或非该类均该类或非该类均可访问可访问public只有该类可以访只有该类可以访问问private相同数据包中的相同数据包中的类可以访问类可以访问默认默认该类及其子类的该类及其子类的成员可以访问,成员可以访问,同一个包中的类同一个包中的类也可访问也可访问protected武汉理工大学信息学院Java程序设计实用教程(第4版)28成员访问权限举例成员访问权限举例package chapter03.MemberAccess;public class MemberAcess public int var1;

25、protected int var2; int var3; private int var4;public void method1()System.out.println(print in method1); protected void method2()System.out.println(print in method2);void method3()System.out.println(print in method3);private void method4()System.out.println(print in method4);public void accessMembe

26、r() var1 = 1; var2 = 2; var3 = 3 ; var4 = 4;this.method1(); this.method2();method3();method4();武汉理工大学信息学院Java程序设计实用教程(第4版)29在同一个类中,在同一个类中,所有访问权限的所有访问权限的成员变量和方法成员变量和方法都是可以访问的。都是可以访问的。成员访问权限举例成员访问权限举例package chapter03.MemberAccess;public class MemberAccessTest public static void main(String args) Memb

27、erAcess acc = new MemberAcess();acc.var1 = 5; acc.var2 = 6; acc.var3=7;/acc.var4 = 8; /private变量只能被本类访问变量只能被本类访问acc.method1();acc.method2();acc.method3(); /acc.method4(); /private方法只能被本类访问方法只能被本类访问武汉理工大学信息学院Java程序设计实用教程(第4版)30把本类移动到把本类移动到chapter03包中,包中,var3变量和变量和method3方法就不能被访问了。方法就不能被访问了。3. 对象属性的存取

28、方法对象属性的存取方法set()和和get()为了保障对象属性的隐藏性,一般不采用为了保障对象属性的隐藏性,一般不采用d.month=10这种直这种直接的赋值语句,而采用接的赋值语句,而采用set()或或get()来操作属性变量。来操作属性变量。武汉理工大学信息学院Java程序设计实用教程(第4版)31如:在如:在MyDate类中增加方法类中增加方法public int getYear() return year; public void setYear(int year) this.year = year;public int getMonth() return month;public v

29、oid setMonth(int month) this.month = month;public int getDay() return day;public void setDay(int day) this.day = day; 这样,外界都是通过这些get()和set()方法来存取MyDate类中的year、month和day变量。 在Eclipse,提供自动生成成员变量的get()和set()的方法。武汉理工大学信息学院Java程序设计实用教程(第4版)323.2.4 静态成员静态成员 Java类中的成员分为2种;实例成员和静态成员。其中static声明的成员为静态成员,否则为实例成

30、员。 实例成员属于对象,只有创建了实例,才能被访问。 静态成员属于类,不需要创建实例,可以通过类名访问。 如Math里面的很多方法就是定义为静态成员(Math.random())。静态成员规则静态成员规则在类外部使用ClassName.variableName访问成员变量;在类外部使用ClassName.methodName访问成员方法;在静态方法中,不能使用this或者super访问实例在类方法中,不能声明static变量; 规规 则则可以调用其他静态方法直接访问静态变量不能使用 this或super 关键字武汉理工大学信息学院Java程序设计实用教程(第4版)33 public stati

31、c void main(String arg) /*初始化变量*/ MyDate d = new MyDate(2009,7,18); MyDate.nextYear(d1); System.out.println(d1); 使用类名称调用使用类名称调用 static 方法方法public static void nextYear(MyDate d)d.year+;访问访问static方法举例方法举例武汉理工大学信息学院Java程序设计实用教程(第4版)3435武汉理工大学信息学院Java程序设计实用教程(第4版)【例例3.2】日期类的封装日期类的封装public class MyDate p

32、rivate int year,month,day; /实例成员变量实例成员变量 private static int thisYear; /静态成员变量静态成员变量 static thisYear=2012; /静态成员初始化静态成员初始化 public static int getThisYear() /静态成员方法静态成员方法 return thisYear; /访问静态成员变量访问静态成员变量. public static void main(String args) System.out.println(今年是今年是+MyDate.getThisYear()+,闰年?,闰年?+MyD

33、ate.isLeapYear(MyDate.getThisYear(); MyDate d1 = new MyDate(2012,12,31);MyDate d2 = new MyDate(d1); /调用拷贝构造方法复制实例调用拷贝构造方法复制实例 d1.tomorrow();静态成员静态成员方法访问方法访问thisYear,d1,d2存储位置和值?存储位置和值?武汉理工大学信息学院Java程序设计实用教程(第4版)36静态成员变量静态成员变量 MyDate.thisYear2012d1,d2这两个这两个对像引用对像引用d1,d2这两个这两个对象实例对象实例把MyDate d2 = new

34、MyDate(d1); 修改为MyDate d2 = d1; 程序执行后,d1和d2的值? P70例例3.2中对象值变化情况中对象值变化情况武汉理工大学信息学院Java程序设计实用教程(第4版)3738武汉理工大学信息学院Java程序设计实用教程(第4版)3.2.6 浅拷贝与深拷贝浅拷贝与深拷贝 浅拷贝:使用一个已知实例采用拷贝构造方法初始化新实例。1. 如果对象成员变量是基本类型时,成员变量逐个赋值,浅拷贝也能复制实例 public MyDate(MyDate d) this.year = d.year; this.month = d.month; this.day = d.day;39武汉

35、理工大学信息学院Java程序设计实用教程(第4版)2. 当对象成员变量也是对象时,只复制了引用,没有复制实例。public class Person String name; MyDate birthday; public Person(Person p) /拷贝构造方法拷贝构造方法 = name; this.birthday = birthday; /引用赋值引用赋值 Person p1 = new Person(“李小明李小明”), MyDate(1994,3,15);Person p2 = new Person(p1);p2.birthday.set(1987,2,2

36、7); 结果?结果?武汉理工大学信息学院Java程序设计实用教程(第4版)40深拷贝:在包含引用数据类型的类的拷贝构造方法中,不仅要复制所用非引用成员变量值,还要为引用数据类型的成员变量创建新实例并初始化。这种复制方式为深拷贝。public Person(Person p) = name; this.birthday = new MyDate(p.birthday); /创建实例创建实例 Person p1 = new Person(“李小明李小明”), MyDate(1994,3,15);Person p2 = new Person(p1); =“张小明张小

37、明”武汉理工大学信息学院Java程序设计实用教程(第4版)41【思考题思考题3-3】为为Person类增加以下方法:类增加以下方法:public int getAge(int year) /返回当前返回当前对象在对象在year年份的年龄年份的年龄public int getAge() /返回当前对象今年的年龄,重载返回当前对象今年的年龄,重载public boolean equals(Person p) /比较当前对象与比较当前对象与p引用实例对应成员变量值是引用实例对应成员变量值是否相等否相等42武汉理工大学信息学院Java程序设计实用教程(第4版)3.3 类的继承性类的继承性继承提供使用现

38、有类的所有功能,并在无需重新编写原来的类情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或者“超类”。继承的过程,就是从一般到特殊的过程。继承概念继承概念父父 类类 子类子类 父类父类/ /子类子类是相对的是相对的Cow类Lion类Tiger类类Animals类Carnivorous类Herbivorous类Coat类武汉理工大学信息学院Java程序设计实用教程(第4版)43什么是继承什么是继承继承:一个类得到另一个类的全部或部分属性及方法的操作叫做继承父类:具有该体系类通用的属性和方法子类:从父类得到,同时也有自己的方法和属性武汉理工大学

39、信息学院Java程序设计实用教程(第4版)44继承提供了在已有类的基础上创建新类的方式。继承的特点继承的特点继承的特点具有层次结构子类继承了父类的属性和方法武汉理工大学信息学院Java程序设计实用教程(第4版)45继承的优点继承的优点继承的优点代码的可重用性父类的属性和方法可用于子类设计应用程序变得更加简单可以轻松地自定义子类武汉理工大学信息学院Java程序设计实用教程(第4版)46继承是面向对象的核心特性,是实现抽象和共享、构造可复用软件的有效机制,最大限度地实现代码复用。47武汉理工大学信息学院Java程序设计实用教程(第4版)3.3.1 由继承派生类由继承派生类修饰符修饰符 class

40、类类 extends 父类父类 implements 接口列表接口列表public class Student extends Person String speciality; /专业专业【例例3.4】 Student类继承类继承Person类。类。/P77 Student继承了父类的继承了父类的name、birthday等属性和等属性和howMany、set等方法等方法Java继承举例继承举例/*Test.java */package chapter03;public class Test public void printHello()System.out.println(Hello);

41、 /*TestExtend.java*/package chapter03;public class TestExtend extends Test public static void main(String args) TestExtend t = new TestExtend();t.printHello();武汉理工大学信息学院Java程序设计实用教程(第4版)48t.printHello可以被调用吗?可以被调用吗?输出结果是什么?输出结果是什么?继承的继承的JAVA实现举例实现举例 演示:示例演示:示例 1编写一个父类编写一个父类使用使用 extends 关键字,编写子类关键字,编写

42、子类class Car extends Vehicles /*构造方法. */ Car() /* 显示子类 Car 的信息. */ void show() System.out.println(“从子类 Car 中输出的信息 ); System.out.println(“交通工具的名称 - + name); System.out.println(“交通工具的颜色 - + color); System.out.println(“座位的数量 - + seats); System.out.println(=); class Vehicles /*存储交通工具的名称. */ protected Str

43、ing name = Honda Civic; /* 存储颜色信息.*/ protected String color = Red; /* 存储座位信息. */ protected int seats = 5; /* 构造方法.*/ Vehicles() /* *显示父类汽车的详细信息 */ void showDetail() System.out.println(从父类 Vehicles 中输出的信息); System.out.println(名称 - + name); System.out.println(颜色 - + color ); public class CarTest /* *构

44、造方法*/ CarTest() /* * 这是 main 方法 * param args 传递至 main 方法的参数 */ public static void main(String args) /* 声明一个对象*/ Car vehicle = new Car(); vehicle.show(); vehicle.showDetail(); 武汉理工大学信息学院Java程序设计实用教程(第4版)4950武汉理工大学信息学院Java程序设计实用教程(第4版)3.3.2 继承原则及作用继承原则及作用 继承原则继承原则子类继承父类的成员变量子类继承父类的成员变量子类继承父类除构造方法以外的成员

45、方法子类继承父类除构造方法以外的成员方法子类不能继承父类的构造方法子类不能继承父类的构造方法子类可以增加成员,可以重定义从父类继子类可以增加成员,可以重定义从父类继承来的成员,但不能删除它们。承来的成员,但不能删除它们。2. 继承的作用继承的作用武汉理工大学信息学院Java程序设计实用教程(第4版)51 继承是实现软件复用的重要措施,继承增加软件的可扩充能力,提高了软件的可维护性。52武汉理工大学信息学院Java程序设计实用教程(第4版)3. Object类是所有类是所有Java的默认基类的默认基类public class Object public Object() /构造方法构造方法 pu

46、blic String toString() /描述对象描述对象 public boolean equals(Object obj)/比较对象相等比较对象相等 protected void finalize() throws ThrowableJava中的类都是中的类都是Object的子类的子类public class Person extends Object53武汉理工大学信息学院Java程序设计实用教程(第4版)4. 子类对父类成员的访问权限子类对父类成员的访问权限子类不能访问父类的私有成员(子类不能访问父类的私有成员(private)。)。子类能够访问父类的公有成员(子类能够访问父类的

47、公有成员(public)和保)和保护成员(护成员(protected)。)。子类对父类的缺省权限成员的访问控制,以包子类对父类的缺省权限成员的访问控制,以包为界分两种情况,可以访问当前包中为界分两种情况,可以访问当前包中权限修饰符权限修饰符同一类同一类同一包同一包不同包的子类不同包的子类所有类所有类public(公有公有) protected(保护保护) 缺省缺省 private(私有私有) 54武汉理工大学信息学院Java程序设计实用教程(第4版)3.3.3 子类的构造方法子类的构造方法使用使用super()调用父类构造方法调用父类构造方法super(参数列表参数列表)public Stud

48、ent(String name, MyDate birthday, String spec) super(name, birthday); /调用父类同参数的构造方法调用父类同参数的构造方法 this.speciality = spec;默认执行默认执行super()public Student() /Java提供的默认构造方法提供的默认构造方法 super(); /调用父类构造方法调用父类构造方法Person()子类不能继承父类的构造方法子类能调用父类的构造方法调用父类的构造方法目的:初始化从父类继承的成员变量子类的构造方法没有调用子类的构造方法没有调用super()或或this(),将,将

49、默认执行默认执行super() public Person() super(); /调用父类构造方法调用父类构造方法Object()public Student() super(); /默认调用默认调用 speciality=; 武汉理工大学信息学院Java程序设计实用教程(第4版)55Student类中会默认调用类中会默认调用Person父类构造函数。父类构造函数。如果父类中没有默认构造函数,如果父类中没有默认构造函数,就会出现错误。就会出现错误。调用父类构造方法的语法为:调用父类构造方法的语法为:super() 或或 super(参数列表参数列表) ;super () 方法始终指向调用类的

50、父类方法始终指向调用类的父类 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,会出错。武汉理工大学信息学院Java程序设计实用教程(第4版)56调用父类构造方法举例调用父类构造方法举例关键字关键字 super 的用法的用法class FictionAuthor extends Author /* 存储作者的小说类型.*/ String storytype; /* 子类构造方法. param name 传递至构造方法的参

51、数 param type 传递至构造方法的参数*/ FictionAuthor(String name, String type) super(name); storytype = type; System.out.println(“从 Fiction Author 类输出); System.out.println(“小说类型为 + storytype); 调用父类构造方法Author(String str) name = str; System.out.println(“从 Author 类输出); System.out.println(“姓名为 + name); 注意:子类如果显式调用父类

52、构造函数,一定要在初始化子类属性之前调用。武汉理工大学信息学院Java程序设计实用教程(第4版)57构造函数使用注意构造函数使用注意一个类只有一个父类,一个父类可以有多个子类一个类只有一个父类,一个父类可以有多个子类在子类中,凡是继承来的属性,必须要调用父类在子类中,凡是继承来的属性,必须要调用父类的构造方法来初始化的构造方法来初始化武汉理工大学信息学院Java程序设计实用教程(第4版)58图图3.7 子类构造方法逐个执行成员对象和父类的构造方法子类构造方法逐个执行成员对象和父类的构造方法 武汉理工大学信息学院Java程序设计实用教程(第4版)59public Student(String n

53、ame,MyDate birthday,String Specicality) super(name,birtyday); this.speciality = speciality;super使用使用调用父类的构造方法调用父类的构造方法super(参数列表参数列表)引用父类同名成员引用父类同名成员子类隐藏父类成员变量子类隐藏父类成员变量nsuper.成员变量成员变量子类覆盖父类成员方法子类覆盖父类成员方法nsuper.成员方法成员方法(参数列表参数列表)武汉理工大学信息学院Java程序设计实用教程(第4版)60在子类里面调用被隐藏或者在子类里面调用被隐藏或者覆盖的父类成员的方式覆盖的父类成员的

54、方式61武汉理工大学信息学院Java程序设计实用教程(第4版)3.4 类的多态性类的多态性3.4.1 子类重定义父类成员子类重定义父类成员3.4.2 类型的多态类型的多态3.4.3 编译时多态和运行时多态性编译时多态和运行时多态性3.4.4 多态的方法实现多态的方法实现多态性多态性 概念概念什么是多态:一种定义,多种实现。即同一种方什么是多态:一种定义,多种实现。即同一种方法作用与不同的对象产生不同的结果的机制;法作用与不同的对象产生不同的结果的机制;它使用不同的实例而执行不同操作;它使用不同的实例而执行不同操作;如如Java中中+运算符,可以是两个数想加,也可以运算符,可以是两个数想加,也可

55、以是两个字符串连接。具体执行哪种操作是由运算是两个字符串连接。具体执行哪种操作是由运算的对象实例决定。的对象实例决定。武汉理工大学信息学院Java程序设计实用教程(第4版)62多态性多态性 举例举例父类子类子类 - - 绘制和移动三角形绘制和移动三角形子类子类 - - 绘制和移动矩形绘制和移动矩形 子类子类 - - 绘制和移动五边形绘制和移动五边形ShapeDraw ()Move ()TriangleDraw () DrawTraingleMove () MoveTriangleVerticesRectangleDraw () DrawRectangleMove () MoveRectangl

56、eCornerPentagonDraw () DrawPentagonMove () MovePentagonVertices武汉理工大学信息学院Java程序设计实用教程(第4版)63多态性作用多态性作用提供了公共访问接口,可在父类中定义形式提供了公共访问接口,可在父类中定义形式,由各个子类自行实现,由各个子类自行实现可以用父类的引用指向不同的子类的对象,可以用父类的引用指向不同的子类的对象,实现一次性操作多个对象的机制实现一次性操作多个对象的机制武汉理工大学信息学院Java程序设计实用教程(第4版)64 3.4.1 子类重定义父类成员子类重定义父类成员多态性实现方法多态性实现方法重定义父类成

57、员变量,则隐藏父类成员变量子类覆盖父类成员方法覆盖(override)是指子类声明并实现父类中的同名方法并且参数列表也完全相同。子类继承并重载父类成员方法重载(overload)是指同一个类中的多个方法可以同名但参数列表必须不同。武汉理工大学信息学院Java程序设计实用教程(第4版)65武汉理工大学信息学院Java程序设计实用教程(第4版)66【例例3.5】 Student类重定义从父类继承来的成员。类重定义从父类继承来的成员。方法名和参数完全相同,则被覆盖;方法名和参数完全相同,则被覆盖;方法名同而参数不同,则重载方法名同而参数不同,则重载例例3.5分析分析Student和和Person类中

58、都声明私有的静态成员变类中都声明私有的静态成员变量量count,Person的的count在子类中被隐藏,需在子类中被隐藏,需要使用要使用super.count访问;访问;howMany方法在子类方法在子类Student中采用扩展的方式中采用扩展的方式重写重写Set方法被子类方法被子类Student继承并重载继承并重载6768武汉理工大学信息学院Java程序设计实用教程(第4版)3.4.2 类型的多态类型的多态1. 子类对象即是父类对象子类对象即是父类对象new Student() instanceof Person /truenew Person() instanceof Student /

59、false 2. 父类对象引用子类实例父类对象引用子类实例Person p = new Student(); /赋值相容赋值相容Student s = new Person(); /语法错语法错Object obj = new Person(); /赋值相容赋值相容 子类通过继承扩展父类,子类是父类的一种特殊情况,子类对象包含了父类的所有成员变量。通过引用通过引用p能访能访问到问到Student类类中的所有成员吗?中的所有成员吗?p只能访问父类Person类中声明的方法,但是执行的是被子类重载的方法。父类对象引用子类实父类对象引用子类实例成立,反之错误例成立,反之错误父类对象引用子类实例举例父

60、类对象引用子类实例举例public class Test public void printHello()System.out.println(Hello); public class TestExtend extends Test public void printWorld() System.out.println( World); public void printHello() System.out.println(Hello in extend Class); public static void main(String args) Test t = new TestExtend();t.p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论