类的封装继承和多态.ppt
Java程序设计实用教程(第3版)程序设计实用教程(第3版),第3章 类的封装、继承和多态,3.1 类和对象3.2 类的封装性3.3 类的继承性3.4 类的多态性3.5 类的抽象性,Java程序设计实用教程(第3版)程序设计实用教程(第3版),在面向对象概念中,类是数据和对数据操作的封装体。类具有封装性、继承性和多态 性。封装性是面向对象方法的基础.继承性是面向对象方法的技术关键多态性提供了面向 对象方法设计的灵活性。这三个面向对象的核心特性为应用程序构建可重用软件系统奠定了基础。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.1.1 类,类是既包括数据又包括作用于数据的一组操作的封装体。类中的数据称为成员变量,类中对数据的操作称为成员方法。类具有封装性、继承性、多态性和抽象性。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.1.1 类,声明类类声明 成员变量的声明;成员方法的声明及实现;修饰符 class 类 extends 父类 implements 接口列表,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.1.1 类,声明成员变量和成员方法成员变量修饰符 static final transient 数据类型 变量;关键字static用于声明类成员变量,final用于声明常量,transient用于声明临时变量。成员方法修饰符 返回值类型 方法(参数列表)throws 异常类 语句序列;return 返回值;成员方法重载,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.1.2 对象,对象是类的实例。对象能获取并保存类的一个实例。对象是动态的,每个对象都有自己的生存周期,都会经历一个从创建、运行到消亡的变化过程。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.1.2 对象,声明对象类 对象创建实例对象=new 类的构造方法(参数列表)注意:类的构造方法是类中与类同名的特殊成员方法,用于创建类的实例并初始化对象。每个类都有构造方法,若类没有声明构造方法,则Java会自动为该类生成一个无参数的构造方法。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.1.2 对象,引用对象的成员变量和调用对象方法对象.成员变量对象.成员方法(参数列表)Java语言自动释放对象。【例3.1】声明日期类及使用日期对象。对象与基本数据类型变量有一点重要的不同之处,就是对象能够调用方法,而变量不能。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),4.对象的引用模型,Java程序设计实用教程(第3版)程序设计实用教程(第3版),5.对象的关系运算与比较相等,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.2 类的封装性,封装性是面向对象的核心特征之一,它提供一种信息隐藏技术。类的封装性包含两层含义:一是将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位。(实现软件模块化设计)二是实现信息隐藏,类要提供与外部联系的方法,同时又要尽可能隐藏类的实现细节。(实现设计和使用分离),Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.2 类的封装性,3.2.1 构造方法3.2.2 this引用和instanceof对象运算符3.2.3 访问控制 3.2.4 静态成员3.2.5 析构方法3.2.6 浅拷贝与深拷贝,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.2.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);/构造方法返回该类的一个实例默认构造方法public MyDate(),Java程序设计实用教程(第3版)程序设计实用教程(第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句功能相当于以下两句:MyDate d2=new MyDate();d2.set(d1);,Java程序设计实用教程(第3版)程序设计实用教程(第3版),4.构造方法重载,public MyDate(int y,int m,int d)public MyDate()public MyDate(MyDate d),Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.2.3 this引用和instanceof对象运算符,this引用指代对象本身this访问本类的成员变量和成员方法this.成员变量(局部变量或形参与成员变量同名时,必须用this引用成员变量)this.成员方法(参数列表)调用本类重载的构造方法this(参数列表)(构造方法中this必须是首句)instanceof对象运算符d instanceof MyDate/运算结果是boolean型,Java程序设计实用教程(第3版)程序设计实用教程(第3版),类的访问权限:只有public和缺省两种。public class MyDate(所有类能访问,文件中只有一个)class MyDate_ex(同一包的类能访问)类中成员的访问权限public说明该类成员可被所有类的对象访问。protected说明该类成员能被同一类中的其他成员或其子类成员,保护成员在子类和非子类中具有不同的访问权限。缺省以包为界划定访问权限范围。private说明该类成员只能被同一类中的其他成员访问。,3.2.4 访问控制,Java程序设计实用教程(第3版)程序设计实用教程(第3版),声明set()和get()方法存取对象的属性(尤其对私有变量),3.2.4 访问控制,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.2.5 静态成员,public class MyDate private int year,month,day;/实例成员变量 private static int thisYear;/静态成员变量 static/静态成员变量初始化 thisYear=2009;public static int getThisYear()/静态成员方法 return thisYear;/访问静态成员变量,Java程序设计实用教程(第3版)程序设计实用教程(第3版),【例3.2】封装的日期类。,图3.3 实例成员变量与静态成员变量的存储结构不同,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.2.5 析构方法,public void finalize()/析构方法 语句序列;析构方法(destructor)是类中一种特殊的成员方法,用于释放类的实例并执行特定操作。Java语言的资源回收机制能够自动释放不再被使用的对象。类只能有一个析构方法。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.2.6 浅拷贝与深拷贝,浅拷贝,Java程序设计实用教程(第3版)程序设计实用教程(第3版),2.深拷贝,public Person(Person p)this(p.name,new MyDate(p.birthday);【例3.3】使用对象作为成员变量并实现深拷贝的Person类。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.3 类的继承性,3.3.1 由继承派生类3.3.2 继承原则及作用 3.3.3 子类的构造方法,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.3.1 由继承派生类,修饰符 class 类 extends 父类 implements 接口列表public class Student extends Person String speciality;/专业【例3.4】Student类继承Person类。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.3.2 继承原则及作用,继承原则子类继承父类的成员变量子类继承父类除构造方法以外的成员方法子类不能继承父类的构造方法子类可以增加成员,可以重定义从父类继承来的成员,但不能删除它们。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),2.继承的作用,子类对象即是父类对象。继承是实现软件可重用性的一种重要方式。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.Object类,public class Object public Object()/构造方法 public String toString()/描述对象 public boolean equals(Object obj)/比较对象相等 protected void finalize()throws ThrowableJava中的类都是Object的子类,都继承了它的成员。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),4.子类对父类成员的访问权限,子类不能访问父类的私有成员(private)。子类能够访问父类的公有成员(public)和保护成员(protected)。子类对父类的缺省权限成员的访问控制,以包为界分两种情况,可以访问当前包中。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.3.3 子类的构造方法,可以调用父类的一个构造方法初始化从父类继承的成员变量。使用super()调用父类构造方法super(参数列表)public Student(String name,MyDate birthday,String spec)super(name,birthday);/调用父类同参数的构造方法 this.speciality=spec;默认执行super()类没有声明构造方法时,Java提供的默认构造方法调用super();子类声明了构造方法,但没有调用this或super。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.4 类的多态性,3.4.1 什么是多态3.4.2 运行时多态性,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.4 类的多态性,多态性是面向对象的核心特征之一。类的多态性提供类中方法设计的灵活性和执行多样性。多态的特别之处是,使程序能够处理类层次 中共享同一超类的对象,就好像它们都是超类的对象一样。多态(polymorphism):一个名字可具有多种语义。多态主要有方法的多态和类型的多态。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.4.1 子类重定义从父类继承来的成员,子类隐藏父类成员变量子类覆盖父类成员方法覆盖(override)是指子类声明并实现父类中的同名方法并且参数列表也完全相同。子类继承并重载父类成员方法重载(overload)是指同一个类中的多个方法可以同名但参数列表必须不同。【例3.5】Student类重定义从父类继承来的成员。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),super引用,调用父类的构造方法super(参数列表)引用父类同名成员子类隐藏父类成员变量super.成员变量子类覆盖父类成员方法super.成员方法(参数列表),Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.4.2 类型的多态,子类对象即是父类对象(isA)new Student()instanceof Person/truenew Person()instanceof Student/false 父类对象引用子类实例Person p=new Student();Object obj=new Person();public int olderThen(Person p)p1.olderThen(s1)s1.olderThen(p1),Java程序设计实用教程(第3版)程序设计实用教程(第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(),Java程序设计实用教程(第3版)程序设计实用教程(第3版),2.运行时多态性,Person p2=new Student(张小莉,new MyDate(1989,1,5);/父类对象引用子类实例p2.toString()/执行Student类的toString(),Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.4.4 多态的方法实现,多态的toString()方法Object类声明:public String toString()/返回当前对象的信息字符串 return getClass().getName()+Integer.toHexString(hashCode();,Java程序设计实用教程(第3版)程序设计实用教程(第3版),2.多态的equals()方法,Object类声明:public boolean equals(Object obj)return this=obj;,Java程序设计实用教程(第3版)程序设计实用教程(第3版),【例3.6】在对象数组中查找。,对象数组及计数运行时多态性体现System.out.println(tablei.toString();注意例3.6的运行结果。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.5 类的抽象性,3.5.1 用继承刻画包含关系3.5.2 抽象类3.5.3 最终类,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.5.1 用继承刻画包含关系,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.5.2 抽象类,声明抽象类与抽象方法public abstract class ClosedFigure/闭合图形抽象类 public abstract double area();/计算面积,抽象方法,以分号;结束,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.5.2 抽象类,抽象类的特点构造方法、静态成员方法不能被声明为抽象方法。一个非抽象类必须实现从父类继承来的所有抽象方法。不能创建抽象类的实例。例如:ClosedFigure g=new ClosedFigure();/语法错抽象类与抽象方法的作用,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.5.2 抽象类,抽象类与抽象方法的作用抽象类用于描述抽象概念;抽象方法为多个子类约定方法声明,在子类中表现出多态性。,Java程序设计实用教程(第3版)程序设计实用教程(第3版),【例3.7】闭合图形抽象类及其子类,Java程序设计实用教程(第3版)程序设计实用教程(第3版),3.5.3 最终类,声明最终类public final class Math extends Object/数学类,最终类声明最终方法public class Circle1 extends Graphics1 public final double area()/最终方法,不能被子类覆盖 return Math.PI*this.radius*this.radius;,Java程序设计实用教程(第3版)程序设计实用教程(第3版),实验3 类的封装、继承和多态,目的:类的封装、继承、多态和抽象性。要求:掌握类的封装措施,理解对象的引用模型;掌握类的继承原则,使用重载和覆盖等多态设计可复用方法,理解运行时多态;理解抽象类和最终类的作用。掌握JDK创建自定义包、声明导入包的方法。重点:类的封装、继承原则,重载和覆盖等多态,运行时多态性。难点:运行时多态性。,