类的封装、继承和多态ppt课件_第1页
类的封装、继承和多态ppt课件_第2页
类的封装、继承和多态ppt课件_第3页
类的封装、继承和多态ppt课件_第4页
类的封装、继承和多态ppt课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

1、Java程序设计实用教程(第3版,第3章 类的封装、继承和多态,3.1 类和对象 3.2 类的封装性 3.3 类的继承性 3.4 类的多态性 3.5 类的抽象性,Java程序设计实用教程(第3版,3.1 类和对象,类(class):是既包括数据又包括作用于数据的一组操作的封装体。 对象(object):是类的实例(instance)。 类具有封装性、继承性、多态性和抽象性。 3.1.1 类 3.1.2 对象,Java程序设计实用教程(第3版,3.1.1 类,声明类 类声明 成员变量的声明; 成员方法的声明及实现; 修饰符 class 类 extends 父类 implements 接口列表,类

2、结构,Java程序设计实用教程(第3版,3.1.1 类,声明成员变量和成员方法 声明成员变量格式: 修饰符 数据类型 变量=表达式 ,变量=表达式; 声明成员方法格式: 修饰符 返回值类型 方法(参数列表) throws 异常类 语句序列; return 返回值;,Java程序设计实用教程(第3版,3.1.1 类,public class MyDate /类声明 int year,month,day; /成员变量 void set(int y,int m,int d) /成员方法 year=y; /设置日期值 month=m; day=d;,例3.1 声明日期类,Java程序设计实用教程(第3

3、版,3.1.1 类,3.成员方法重载 void set(int y,int m,int d) /重载方法,参数个数不同 void set(int m,int d) void set(int d) void set(MyDate d) /重载方法,参数数据类型不同 以下方法是错误的: void set(int y,int m,int d) void set(int m,int d,int y,Java程序设计实用教程(第3版,3.1.2 对象,一个对象的生命周期是: 创建运行消亡。 声明对象 类 对象 MyDate d; 创建实例 对象 = new 类的构造方法(参数列表) d=new MyDa

4、te();或 MyDate d=new MyDate(,Java程序设计实用教程(第3版,3.1.2 对象,3. 引用对象的成员变量和调用对象方法 引用成员变量 对象.成员变量 如: d.year=2008; 调用成员方法 对象.成员方法(参数列表) 如: d.set(2009,7,28); Java语言回收机制自动释放对象。 【例3.1】声明日期类及使用日期对象,public class MyDate /类声明 int year,month,day; /成员变量,表示年、月、日 void set(int y,int m,int d) /成员方法,设置日期值 /无返回值,有3个参数 year

5、= y; month = m; day = d; void set(MyDate d) /将当前对象值设置为参数值,重载 set(d.year,d.month,d.day); /调用重载的同名成员方法 public String toString() /返回中文日期字符串 return year+”年”+month+”月”+day+”日”; public boolean equals(MyDate d) /比较当前日期值与d是否相等 return this=d|d!=null /this指代调用本方法的当前对象,3.1.2 对象,public static void main(String a

6、rgs) MyDate d1 = new MyDate() ; /声明对象,创建实例,引用赋值 d1.set(2009,7,16); /调用类的成员方法 MyDate d2 = d1; /对象引用赋值 System.out.println(“d1:”+d1.toString()+“d2:”+d2.toString()+ ” d1=d2?”+(d1=d2); d2.year=2008; /修改实例成员变量值 System.out.println(“d1:”+d1+“d2:”+d2+” d1=d2?”+ (d1=d2)+”,d1.equals(d2)?”+(d1.equals(d2); /将对象转

7、换为字符串,默认调用 d1.toString(); d2=new MyDate(); /创建另一个实例 d2.set(d1); System.out.println(“d1:”+d1+“d2:”+d2+” d1=d2?”+ (d1=d2)+”,d1.equals(d2)?”+(d1.equals(d2);,3.1.2 对象,4. 对象的引用模型,3.1.2 对象,Java程序设计实用教程(第3版,5. 对象的关系运算与比较相等,3.1.2 对象,Java程序设计实用教程(第3版,3.2 类的封装性,3.2.1 构造方法 3.2.2 this引用和instanceof对象运算符 3.2.3 访问

8、控制 3.2.4 静态成员 3.2.5 析构方法 3.2.6 浅拷贝与深拷贝,Java程序设计实用教程(第3版,3.2 类的封装性,封装(encapsulation)的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共方法,而看不见方法的实现细节,也不能直接对类中的数据进行操作。 封装的目的有: 隐藏类的实现细节; 迫使用户通过接口去访问数据; 增强代码的可维护性。 封装的措施有: 构造方法、析构方法、方法重载、设置访问控制权限,Java程序设计实用教程(第3版,3.2.1 构造方法,声明及调用构造方法 public class MyDate int year,month,d

9、ay; public MyDate(int y, int m, int d) /声明构造方法 /构造方法与类同名,构造方法返回该类的一个实例 year = y; month = m; day = d; MyDate d = new MyDate(2009,7,18); /对 MyDate d = new MyDate( ); /错,Java程序设计实用教程(第3版,3.2.1 构造方法,2. 默认构造方法 public MyDate() /没有声明任何构造方法时系统提供 使用默认构造方法实例化对象时进行初始化约定: 整数0、浮点数0.0、字符u0000、布尔false、引用数据类型null p

10、ublic class MyDate int year,month,day; public MyDate( ) /声明构造方法 /构造方法与类同名,构造方法返回该类的一个实例 year = 1970; month = 1; day = 1;,Java程序设计实用教程(第3版,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句功能相当于以下两句:

11、 MyDate d2 = new MyDate(); d2.set(d1,3.2.1 构造方法,Java程序设计实用教程(第3版,4. 构造方法重载,public MyDate(int y, int m, int d) public MyDate(int y, int m) public MyDate(int y) public MyDate() public MyDate(MyDate d,3.2.1 构造方法,Java程序设计实用教程(第3版,3.2.2 this引用和instanceof对象运算符,this引用 指代对象本身 this 访问本类的成员变量和成员方法 this.成员变量 t

12、his.成员方法(参数列表) 调用本类重载的构造方法 this(参数列表) instanceof对象运算符 MyDate d=new MyDate(); d instanceof MyDate,3.2.3 访问控制,类的访问权限:只有public和缺省两种 。 public class MyDate class MyDate_ex 类中成员的访问权限 声明set()和get()方法存取对象的属性,Java程序设计实用教程(第3版,3.2.4 静态成员,public class MyDate private int year,month,day; /实例成员变量 private static i

13、nt thisYear; /静态成员变量 static /静态成员变量初始化 thisYear=2009; public static int getThisYear() /静态成员方法 return thisYear; /访问静态成员变量,Java程序设计实用教程(第3版,静态成员变量的初始化:static /静态初始化块 静态成员变量的初始化;【例3.2】封装的日期类,图3.3 实例成员变量与静态成员变量的存储结构不同,3.2.4 静态成员,Java程序设计实用教程(第3版,3.2.5 析构方法,public void finalize() /析构方法 语句序列; 作用是:释放实例,并执行

14、特定的操作。 如:a. finalize(),Java程序设计实用教程(第3版,3.2.6 浅拷贝与深拷贝,1. 浅拷贝,public class Person String name; Mydate birthday; public Person(String name,Mydate birthday) =name; this.birthday=birthday; public Person(Person p) this(, p.birthday);,3.2.6 浅拷贝与深拷贝,2. 深拷贝 有如下的类定义,Person p1=new Person(“李小明”,

15、new Mydate(1979,3,15); Person p2=new Person(p1,3.2.6 浅拷贝与深拷贝,2. 深拷贝 有如下的调用构造方法,public class Person String name; Mydate birthday; public Person(String name,Mydate birthday) =name this.birthday=birthday; public Person(Person p) this(, p.birthday);,3.2.6 浅拷贝与深拷贝,2. 深拷贝,new MyDate(p.birth

16、day,String是常量字符串类,当改变一个对象时自动创建新的,Java程序设计实用教程(第3版,3.2.6 浅拷贝与深拷贝,2. 深拷贝,例3.3】 使用对象作为成员变量并实现 深拷贝的Person类,Java程序设计实用教程(第3版,3.3 类的继承性,继承是一种由已有类创建新类的机制。 3.3.1 由继承派生类 3.3.2 继承原则及作用 3.3.3 子类的构造方法,Java程序设计实用教程(第3版,3.3.1 由继承派生类,修饰符 class 类 extends 父类 implements 接口列表 例如: public class Student extends Person St

17、ring speciality; /专业 【例3.4】 Student类继承Person类,Java程序设计实用教程(第3版,3.3.1 由继承派生类,public class Student extends Person String speciality; /专业 public static void main(String args) Person p1=new Person(“李小明”,new Mydate(1979,3,15); Student s1=new Student(); s1.howMany(); System.out.println(“p1:”+p1+“,s1:”+s1)

18、; s1.set(“王江”,Mydate(1987,9,1); System.out.println(s1+“,”+p1.getname()+“比”+ s1.getname()+”大”+p1.olderThen(s1)+”岁”); s1.finalize(); Person.howMany();,Java程序设计实用教程(第3版,3.3.2 继承原则及作用,继承原则 子类继承父类的成员变量 子类继承父类除构造方法以外的成员方法 子类不能继承父类的构造方法 子类可以增加成员,可以重定义从父类继承来的成员,但不能删除它们,2. 继承的作用,3.3.2 继承原则及作用,Java程序设计实用教程(第3

19、版,3. Object类,public class Object public Object() /构造方法 public String toString() /描述对象 public boolean equals(Object obj)/比较对象相等 protected void finalize() throws Throwable Java中的类都是Object的子类 public class Person extends Object,3.3.2 继承原则及作用,Java程序设计实用教程(第3版,4. 子类对父类成员的访问权限,子类不能访问父类的私有成员(private)。 子类能够访

20、问父类的公有成员(public)和保护成员(protected)。 子类对父类的缺省权限成员的访问控制,以包为界分两种情况,可以访问当前包中成员,3.3.2 继承原则及作用,Java程序设计实用教程(第3版,3.3.3 子类的构造方法,使用super()调用父类构造方法 super(参数列表) public Student(String name, MyDate birthday, String spec) super(name, birthday); /调用父类同参数的构造方法 this.speciality = spec; 默认执行super() public Student() /Jav

21、a提供的默认构造方法 super(); /调用父类构造方法Person(),Java程序设计实用教程(第3版,3.4 类的多态性,3.4.1 子类重定义从父类继承来的成员 3.4.2 类型的多态 3.4.3 编译时多态和运行时多态 3.4.4 多态的方法实现,Java程序设计实用教程(第3版,3.4.1 子类重定义从父类继承来的成员,多态(polymorphism)意为一个名字可具有多种语义。如: +1 1+2 “1”+ “2” 多态性是面向对象的核心特征之一。 主要有方法多态和类型的多态,Java程序设计实用教程(第3版,3.4.1 子类重定义从父类继承来的成员,子类隐藏父类成员变量 子类覆

22、盖父类成员方法 覆盖(override)是指子类声明并实现父类中 的同名方法并且参数列表也完全相同。 子类继承并重载父类成员方法 重载(overload)是指同一个类中的多个方法可以同名但参数列表必须不同。 【例3.5】 Student类重定义从父类继承来的成员,this.count super.count,p1.toString(); s2.toString(); s1.finalize(,s2.set(“张晓丽”,new Mydate(1982,4,3); s2.set(“胡东东”,new Mydate(1982,4,3), “电子信息工程”,Java程序设计实用教程(第3版,4. sup

23、er引用,调用父类的构造方法 super(参数列表) 引用父类同名成员 子类隐藏父类成员变量 super.成员变量 子类覆盖父类成员方法 super.成员方法(参数列表,3.4.1 子类重定义从父类继承来的成员,Java程序设计实用教程(第3版,3.4.2 类型的多态,子类对象即是父类对象 new Student() instanceof Person /true new Person() instanceof Student /false 父类对象引用子类实例 Person p=new Student(); Object obj = new Person(); public int olde

24、rThen(Person p) p1.olderThen(s1) s1.olderThen(p1,Person类方法,Java程序设计实用教程(第3版,3.4.3 编译时多态和运行时多态,编译时多态性 方法重载都是编译时多态。 Person p1 = new Person(李小明, new MyDate(1979,3,15); p1.toString() /执行Person类的toString() Student s1= new Student(p1,计算机); s1.toString() /执行Student类的toString(,2. 运行时多态性,Person p2 = new Stud

25、ent(张小莉, new MyDate(1989,1,5); /父类对象引用子类实例 p2.toString() /执行Student类的toString(,父类对象不能 执行子类增加 的成员方法。 如,p2.setSpeciality(“电子信息”,Java程序设计实用教程(第3版,3.4.4 多态的方法实现,多态的toString()方法 Object类声明: public String toString() /返回当前对象的信息字符串 return getClass().getName() + + Integer.toHexString(hashCode();,Java程序设计实用教程(

26、第3版,2. 多态的equals()方法,Object类声明: public boolean equals(Object obj) return this = obj; /引用比较,3.4.4 多态的方法实现,Java程序设计实用教程(第3版,Person类声明: public boolean equals(Object obj) if(this=obj) return true; if(obj!=null,3.4.4 多态的方法实现,此处覆盖Object类的方法,Java程序设计实用教程(第3版,例3.6】在对象数组中查找,对象数组及计数 运行时多态性体现 System.out.printl

27、n(tablei.toString(); indexOf(Object table,Object obj) Oldest(Person table) /getAge()年龄,Java程序设计实用教程(第3版,3.5 类的抽象性,3.5.1 用继承刻画包含关系 3.5.2 抽象类 3.5.3 最终类,Java程序设计实用教程(第3版,3.5.1 用继承刻画包含关系,Java程序设计实用教程(第3版,3.5.2 抽象类,声明抽象类与抽象方法 public abstract class ClosedFigure /闭合图形抽象类 public abstract double area(); /计算面积,抽象方法,以分号;结束,Jav

温馨提示

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

评论

0/150

提交评论