第三章 类的封装、继承和多态
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p2
birthday birthday 1979
3197915 3
(a) 浅拷贝传递引用,不能复制实例 (a) 浅拷贝传递引用,不能复制实例
(b) 深拷贝,创建新实例,复制实例 (b) 深拷贝,创建新实例,复制实
26
类的封装、继承和多态
析构方法
Public void finalize()
3
在一个对象占用的内存空间被返还给系
d1.set(2009,7,16); (b) 对象调用类的成员方法
d1 d2 2008 7 16
方法
类的封装、继承和多态
d2.year = 2008; (d) 修改d2实例的成员 变量值,影响d1对象
20
对象的关系运算与比较相等 3
d1 d2 d2 2009 7 16 MyDate d2 = d1; MyDate d2 = new MyDate(); (a) 两个对象引用一个实例, d2.set(d1); d1 d1==d2结果是true, 2009 7 16 d1 2009 7 16 (b) 设置d2对象值同d1实例, d1.equals(d2)结果是true d1==d2结果是false,d1.equals(d2)结果是true d2 2009 7 16 d2 2008 8 8 2009 7 16 d1 2009 7 16
– 这时,内存中为BankAccount类创建了几个 实例呢? – 这个实例有几个引用(reference)呢?
BankAccount r2=new BankAccount(r1); – 这时又有几个BankAccount类的实例和引用 呢?
类的封装、继承和多态 25
拷贝构造方法
3
使用拷贝构造方法复制实例 – 浅拷贝:对象成员变量都为基本数据类型 – 深拷贝:对象成员变量为引用数据类型
类的封装、继承和多态 13
类的封装性
例:
3
class shape{ private protected int x; private static int y; static final float MAX_AREA=100.0f; …………………….. }
类的封装、继承和多态 14
类的封装性
3
方法的声明语法: [修饰符] 返回类型 方法名(参数列表) [ throws 异常名 ] { 方法体; } 定义对类内成员变量(数据)的操作 谁可以调用方法、接受哪些参数、如何
返回信息
类的封装、继承和多态
15
类的封装性
修饰符(Modifier): – 访问控制符:
public、private、protected、private protected
类的封装、继承和多态 11
类的封装性
声明成员变量〔member〕的语法: [修饰符] 数据类型 变量名;
引用:对象名.变量
3
修饰符
– 访问控制符
• public:可被所有其他类引用 • protected:可被本包中的类及子类引用
类的封装、继承和多态 12
类的封装性
3
• 缺省:可被本包中的类引用 • private protected:可被该类自身、子类引 用 • private:仅可被该类自身引用和修改,不 能被其他任何类(包括子类)引用 – static:类成员变量,对所有的实例一致,引 用时前缀可使用类名或对象名 – final:数值不变常量,定义同时应对其进行 初始化
类的封装、继承和多态 19
对象的引用模型
实例 year month day d1 0 0 0 d1 2009 7
3
year month day 16
y
MyDate d1 = new MyDate(); (a) 声明对象并引用实例
d1 d2 MyDate d2 = d1; (c) 对象引用赋值,两个 对象引用一个实例 2009 7 16
父类继承声明:extends 父类名 实现接口(interface):implements 接口名
类的封装、继承和多态 10
类的封装性
例:
3
public abstract class shape{…………} class rectangle extends shape{…………} final class roundrect extends rectangle {………………….} ?? final可以与abstract一起使用吗?
类的封装、继承和多态
3
9
类的封装性
类修饰符(Modifier):
3
– public:允许其他类(没有限制)访问本类,一个 源文件仅可以有一个public类 – 缺省:可被当前包中的其他类访问 – abstract:没有实例的抽象概念类,必需派生子类 – final:不能再被扩展,不包含子类的类;易于安全 性的实现,或用于创建固定功能的类
类的封装、继承和多态 7
JAVA中的OOP(续)
3
Java中的类结构 – 基类:所有JAVA的类都派生自Object – Java的类可组织在包(package)中 – Java提供的标准类库分布在一系列的包中, public class Object 如ng,java.util,等 { public Object() //构造方法 – 编程的过程就是继承基类或标准类而创建、 public String toString() //描述对象 定义特殊子类的过程
d2.set(2008,8,8); (c) 改变d2对象,不影响d1对象
21
类的封装、继承和多态
例,
构造方法(constructor)
问题的提出
3
– Java试图在每个对象一诞生时,就给它一确定的状 态,但有时这种系统的缺省初值(系统定义构造方 法赋值)不合适;所以在创建一个新对象时,需用 自定义构造方法完成合法的初始化,使类内成员的 初始化工作不依赖于外界完成。
3
类的封装、继承和多态
金陵科技学院 刘晶 2011.3
复
数据类型
习
3
基本语法规则 运算符与表达式
流程控制语句 – 分支语句 – 循环语句
Java的数组和字符串
类的封装、继承和多态 2
主要内容
OOP的概念 – 类和对象 OOP的特点
– – – – 类的封装性 类的继承性 类的多态性 类的抽象性
类的封装、继承和多态
23
构造方法(续)
3
一个类中可创建多个构造方法(重载) 当类中声明了用户自定义的构造方时,
则覆盖不带参数的默认构造方法
– 例:BankTester.java
类的封装、继承和多态
24
一个小问题?
BankAccount r1=new BankAccount( );
3
BankAccount r2=r1;
3
类的封装、继承和多态
3
OOP概念
过程式程序设计
函数 函数 函数 函数
方法
3
OOP程序设计
消息
数据
方法
公共数据
数据
算法+数据结构
对象+消息
类的封装、继承和多态 4
OOP的主要特点
3
封装性(encapsulation) – 即实现了信息的隐藏 – 提高了程序的模块化及安全性,且易于维护
继承性(inheritance)
3
调用本类重载的构造方法 – this([参数列表])
类的封装、继承和多态 28
this引用
例子:
3
//this指代本类对象
//this调用本类带பைடு நூலகம்个整形参数的构造方法
class Point{ int x,y; Point(int x,int y)
{this.x=x;this.y=y;}
Point(){this(0,0);} public Point getPoint()
– 体现了面向对象的autonomy原则。
类的封装、继承和多态
22
构造方法(续)
构造方法与类同名 构造方法没有返回值(无需void说明) 构造方法不能被继承
3
构造方法只能在创建类对象时由系统隐含调用
(new 构造方法),而不能直接调用 当创建类对象时,自动执行类的构造方法,初 始化新对象的成员变量
name p1 birthday
name
p1
李小明
李小明
p1
15
birthday 1979
3 1979 3 15
name p1 name 李小明 李小明 birthday birthday 1979 3197915 3 name p2
name 李小明 李小明
p2
name p2 birthday
name birthday
类的封装、继承和多态 18
对象
3
创建对象过程 – 声明对象:为引用类型变量分配引用空间 – 创建实例(对象实例化):为实例分配存储空间, 并对实例属性初始化
• 默认初始化 • 显示初始化(可省) • 执行构造方法初始化
– 为对象赋值(必为地址值)
对象的使用:用点操作符访问对象中的成员 【例3.1】声明日期类及使用日期对象。
车 交通工具 父类/超类 船 飞机 汽车 Java仅支持 单重继承
火车
子类 (subclass)
(superclass)
类的封装、继承和多态
5
OOP的主要特点(续)
3
继承性(续) – 体现了对现实世界的抽象模拟 – 提高了代码的复用性,增强了软件的扩充性
多态性(polymorphism) – 用同一个名字调用实现不同操作的方法 – 方式1:不同的类之间的同名方法 如:中国人/日本人/美国人 说话 – 方式2:参数不同的同名方法(如加法) – 使用灵活方便,且降低了维护和编程量
3
– static:静态方法,又称类方法
• 使用类名或对象名作为前缀,建议使用类名 • 在static方法体中只能直接使用static变量和static方法 • 不可被覆盖(重写)
– abstract:只有声明没有语句,要在子类中通过重新 定义(override)来实现 – final:不可被覆盖(重写) (override)
统存储堆之前自动执行 也可对象调用执行:d.finalize(); Java的垃圾回收机制:
每个对象有自己的REFERENCE计数器,计数 器减为零时对象丢失,系统在其后某个时刻自 动回收不再可用的对象,调用析构方法
类的封装、继承和多态 27
this引用
指代对象本身 – this
访问本类的成员变量和成员方法 – this.成员变量 – this.成员方法([参数列表])
d1
d2
(c) 改
16 MyDate d2 = new MyDate(); 7 d1 2009 16 d2.set(d1); 16 (b) 设置d2对象值同d1实例, d2 2008 8 8 ==d2结果是false,d1.equals(d2)结果是true e(); d2.set(2008,8,8);
类及其成员的访问权限
类中成员的访问权限
权限修饰符 public(公有) protected(保护) 缺省 private(私有) 同一类 同一包 不同包的子类
3
所有类
类的访问权限:只有public和缺省两种 。 public class Date1 //公有的类 class Date1_ex //默认的类 声明公有的set()和get()方法存取对象的属性
类的封装、继承和多态 16
类的封装性
返回类型:void、return 参数列表:值传递 PassTest.java
3
throws: – 通告本方法中会产生的例外(异常)类型, 提醒调用者要对相应的可能例外进行处理。 当执行此方法并发生了例外时,程序会转入 调用者编制的例外处理程序段。
类的封装、继承和多态 17
}
public boolean equals(Object obj)//比较对象相等 protected void finalize() throws Throwable
类的封装、继承和多态 8
类的封装性
类说明语法: [ 类修饰符] class 类名<泛型>
[ extends 超类名 ] [ implements 接口名 ] { 成员变量定义; 类体 成员方法定义; }
类的封装、继承和多态 6
JAVA中的OOP
几个概念
3
– 类:既包括数据又包括作用于数据的一
组操作的封装体
• 系统类库中已定义好的类 • 用户自定义的类
– 对象(实例instance):类的实例
• 创建某个类的具体对象(类似变量声明) 类名 欲创建的对象名 = new 类名( 参数表 ) ;
例如: String s = new String( “Hello!” ) ;
memberjava3类封装性实例例32日期类的封装?设计并重载构造方法?成员变量设计为私有的访问权限限制其他类对成员变量的访问?成员方法设计为公有的访问权限提供给其他类使用?使用this引用增强程序的可维护性?使用类名调用静态方法例33使用对象作为成员变量并实现深拷贝的person类类的封装继承和多态373类封装小结?类中的数据使用private定义?使用public方法来操作数据?把逻辑上相关联的数据封装成新的类来?把逻辑上相关联的数据封装成新的类来使用类似结构体类的封装继承和多态38?不要定义太庞大的类要把无关的功能适当分离?培养良好的编程风格3java中类的继承?创建类时指明它为某存在类的子类extends超类父类名?父类来自系统类库用户自定义类用户自定义类?子类继承的部分父子类在同一个包中时子类继承除private外所有父类成员父子类在不同包中时子类继承公开级和保护级父类成员?子类不能继承父类构造方法?java不支持多重继承但可用接口实现类的封装继承和多态393类的继承续?子类对父类可做扩展和特殊化保留父类原有的成员变量和成员方法创建新的成员变量和方法重新定义父类中已有的变量重新定义父类中已有的变量