《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类1.声明类类声明{成员变量的声明;成员方法的声明及实现;}[修饰符]class类泛型[extends父类][implements接口列表]类结构《Java程序设计实用教程(第3版)》3.1.1类2.声明成员变量和成员方法声明成员变量格式:[修饰符]数据类型变量[=表达式][,变量[=表达式]];声明成员方法格式:[修饰符]返回值类型方法([参数列表])[throws异常类]{语句序列;[return[返回值]];}《Java程序设计实用教程(第3版)》3.1.1类publicclassMyDate//类声明{intyear,month,day;//成员变量voidset(inty,intm,intd)//成员方法{year=y;//设置日期值month=m;day=d;}}例3.1声明日期类《Java程序设计实用教程(第3版)》3.1.1类3.成员方法重载voidset(inty,intm,intd)//重载方法,参数个数不同voidset(intm,intd)voidset(intd)voidset(MyDated)//重载方法,参数数据类型不同以下方法是错误的:voidset(inty,intm,intd)voidset(intm,intd,inty)《Java程序设计实用教程(第3版)》3.1.2对象一个对象的生命周期是:创建→运行→消亡。1.声明对象类对象MyDated;2.创建实例对象=new类的构造方法([参数列表])d=newMyDate();或MyDated=newMyDate();《Java程序设计实用教程(第3版)》3.1.2对象3.引用对象的成员变量和调用对象方法引用成员变量对象.成员变量如:d.year=2008;调用成员方法对象.成员方法([参数列表])如:d.set(2009,7,28);Java语言回收机制自动释放对象。【例3.1】声明日期类及使用日期对象。publicclassMyDate//类声明{intyear,month,day;//成员变量,表示年、月、日voidset(inty,intm,intd)//成员方法,设置日期值{//无返回值,有3个参数year=y;month=m;day=d;}voidset(MyDated)//将当前对象值设置为参数值,重载{set(d.year,d.month,d.day);//调用重载的同名成员方法}publicStringtoString()//返回中文日期字符串{returnyear+”年”+month+”月”+day+”日”;}publicbooleanequals(MyDated)//比较当前日期值与d是否相等{returnthis==d||d!=null&&year==d.year&&month==d.month&&day==d.day;}//this指代调用本方法的当前对象3.1.2对象publicstaticvoidmain(Stringargs[]){MyDated1=newMyDate();//声明对象,创建实例,引用赋值d1.set(2009,7,16);//调用类的成员方法MyDated2=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)));//将对象转换为字符串,默认调用d1.toString();d2=newMyDate();//创建另一个实例d2.set(d1);System.out.println(“d1:”+d1+“d2:”+d2+”d1==d2?”+(d1==d2)+”,d1.equals(d2)?”+(d1.equals(d2)));}}3.1.2对象4.对象的引用模型MyDated1=newMyDate();(a)声明对象并引用实例d1.set(2009,7,16);(b)对象调用类的成员方法d1实例MyDated2=d1;(c)对象引用赋值,两个对象引用一个实例000yearmonthdayd17162009d17162009d2yearmonthdayd1d2.year=2008;(d)修改d2实例的成员变量值,影响d1对象d27162008MyDated1=newMyDate();(a)声明对象并引用实例d1.set(2009,7,16);(b)对象调用类的成员方法d1实例MyDated2=d1;(c)对象引用赋值,两个对象引用一个实例000yearmonthdayd17162009d17162009d2yearmonthdayd1d2.year=2008;(d)修改d2实例的成员变量值,影响d1对象d271620083.1.2对象《Java程序设计实用教程(第3版)》5.对象的关系运算与比较相等MyDated2=newMyDate();d2.set(d1);(b)设置d2对象值同d1实例,d1==d2结果是false,d1.equals(d2)结果是trued2.set(2008,8,8);(c)改变d2对象,不影响d1对象d17162009d27162009d17162009d2882008MyDated2=d1;(a)两个对象引用一个实例,d1==d2结果是true,d1.equals(d2)结果是trued17162009d2MyDated2=newMyDate();d2.set(d1);(b)设置d2对象值同d1实例,d1==d2结果是false,d1.equals(d2)结果是trued2.set(2008,8,8);(c)改变d2对象,不影响d1对象d17162009d27162009d17162009d2882008MyDated2=d1;(a)两个对象引用一个实例,d1==d2结果是true,d1.equals(d2)结果是trued17162009d2MyDated2=newMyDate();d2.set(d1);(b)设置d2对象值同d1实例,d1==d2结果是false,d1.equals(d2)结果是trued2.set(2008,8,8);(c)改变d2对象,不影响d1对象d17162009d27162009d17162009d2882008MyDated2=d1;(a)两个对象引用一个实例,d1==d2结果是true,d1.equals(d2)结果是trued17162009d23.1.2对象《Java程序设计实用教程(第3版)》3.2类的封装性3.2.1构造方法3.2.2this引用和instanceof对象运算符3.2.3访问控制3.2.4静态成员3.2.5析构方法3.2.6浅拷贝与深拷贝《Java程序设计实用教程(第3版)》3.2类的封装性1.封装(encapsulation)的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共方法,而看不见方法的实现细节,也不能直接对类中的数据进行操作。2.封装的目的有:①隐藏类的实现细节;②迫使用户通过接口去访问数据;③增强代码的可维护性。封装的措施有:构造方法、析构方法、方法重载、设置访问控制权限。《Java程序设计实用教程(第3版)》3.2.1构造方法1.声明及调用构造方法publicclassMyDate{intyear,month,day;publicMyDate(inty,intm,intd)//声明构造方法{//构造方法与类同名,构造方法返回该类的一个实例year=y;month=m;day=d;}}MyDated=newMyDate(2009,7,18);//对MyDated=newMyDate();//错《Java程序设计实用教程(第3版)》3.2.1构造方法2.默认构造方法publicMyDate()//没有声明任何构造方法时系统提供使用默认构造方法实例化对象时进行初始化约定:整数0、浮点数0.0、字符’\u0000’、布尔false、引用数据类型nullpublicclassMyDate{intyear,month,day;publicMyDate()//声明构造方法{//构造方法与类同名,构造方法返回该类的一个实例year=1970;month=1;day=1;}}《Java程序设计实用教程(第3版)》3.拷贝构造方法publicMyDate(MyDated){year=d.year;month=d.month;day=d.day;}调用语句如下:MyDated1=newMyDate(2009,7,16);MyDated2=newMyDate(d1);第2句功能相当于以下两句:MyDated2=newMyDate();d2.set(d1);3.2.1构造方法《Java程序设计实用教程(第3版)》4.构造方法重载publicMyDate(inty,intm,intd)publicMyDate(inty,intm)publicMyDate(inty)publicMyDate()publicMyDate(MyDated)3.2.1构造方法《Java程序设计实用教程(第3版)》3.2.2this引用和instanceof对象运算符1.this引用①指代对象本身this②访问本类的成员变量和成员方法this.成员变量this.成员方法([参数列表])③调用本类重载的构造方法this([参数列表])2.instanceof对象运算符MyDated=newMyDate();dinstanceofMyDate3.2.3访问控制1.类的访问权限:只有public和缺省两种。publicclassMyDateclassMyDate_ex2.类中成员的访问权限3.声明set()和get()方法存取对象的属性权限修饰符同一类同一包不同包的子类所有类public(公有)protected(保护)缺省private(私有)《Java程序设计实用教程(第3版)》3.2.4静态成员publicclassMyDate{privateintyear,month,day;//实例成员变量privatestaticintthisYear;//静态成员变量static//静态成员变量初始化{thisYear=2009;}publicstaticintgetThisYear()//静态成员方法{returnthisYear;//访问静态成员变量}}《Java程序设计实用教程(第3版)》静态成员变量的初始化:static//静态初始化块{静态成员变量的初始化;}【例3.2】封装的日期类。2009静态成员变量MyDate.thisYeard1实例成员变量882008d1.yeard1.monthd1.dayd2882008d2.yeard2.monthd2.day2009静态成员变量MyDate.thisYeard1实例成员变量882008d1.yeard1.monthd1.dayd2882008d2.yeard2.monthd2.day图3.3实例成员变量与静态成员变量的存储结构不同3.2.4静态成员《Java程序设计实用教程(第3版)》3.2.5析构方法publicvoidfinalize()//析