类的封装、继承和多态
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
System.out.println(“d1:”+d1+“d2:”+d2+” d1==d2?”+
(d1==d2)+”,d1.equals(d2)?”+(d1.equals(d2)));
//将对象转换为字符串,默认调用 d1.toString();
d2=new MyDate();
//创建另一个实例
d2.set(d1);
3.1.2 对象
public class MyDate
//类声明
{
int year,month,day;
//成员变量,表示年、月、日
void set(int y,int m,int d)
//成员方法,设置日期值
{
//无返回值,有3个参数
year = 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是否相等
• 隐藏类的实现细节; • 迫使用户通过接口去访问数据; • 增强代码的可维护性。
封装的措施有:
构造方法、析构方法、方法重载、设置访问控制权限。
《Java程序设计实用教程(第3版)》
3.2.1 构造方法
• 声明及调用构造方法
public class MyDate
{
int year,month,day;
《Java程序设计实用教程(第3版)》
3.2.3 访问控制
• 类的访问权限:只有public和缺省两种 。
public class MyDate class MyDate_ex
• 类中成员的访问权限
权限修饰符
同一类 同一包 不同包的子类
public(公有)
✓
✓
✓
• 声明prosteectte(d)(和保护ge) t()方法✓ 存取对✓象的属性✓
《Java程序设计实用教程(第3版)》
3.2.6 浅拷贝与深拷贝
1. 浅拷贝
《Java程序设计实用教程(第3版)》
3.2.6 浅拷贝与深拷贝
2. 深拷贝
有如下的类定义:
public class Person { String name;
//错
《Java程序设计实用教程(第3版)》
3.2.1 构造方法
2. 默认构造方法
public MyDate() //没有声明任何构造方法时系统提供 使用默认构造方法实例化对象时进行初始化约定: 整数0、浮点数0.0、字符’\u0000’、布尔false、引用数据类型null public class MyDate {
3.2.2 this引用和instanceof对象运算符
• this引用
• 指代对象本身
• this
• 访问本类的成员变量和成员方法
• this.成员变量 • this.成员方法([参数列表])
• 调用本类重载的构造方法
• this([参数列表])
• instanceof对象运算符
• MyDate d=new MyDate(); • d instanceof MyDate
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.1.2 对象
一个对象的生命周期是: 创建→运行→消亡。
• 声明对象
类 对象 MyDate d;
• 创建实例
对象 = new 类的构造方法([参数列表])
d=new MyDate();或 MyDate d=new MyDate();
《Java程序设计实用教程(第3版)》
d1.set(2009,7,16);
//调用类的成员方法
MyDate d2 = d1;
//对象引用赋值
System.out.println(“d1:”+d1.toString()+“d2:”+d2.toString()+
” d1==d2?”+(d1==d2));
d2.year=2008;
//修改实例成员变量值
(d) 修改d2实例的成员 变量值,影响d1对象
3.1.2 对象
5. 对象的关系运算与比较相等
d1
2009 7 16
d2
d1 2009 7 16
d2 2009 7 16
MyDate d2 = d1; (a) 两个对象引用一个实例,
MyDate d2 = new MyDate(); d2.set(d1);
void set(int y,int m,int d) //成员方法
{
year=y;
//设置日期值
month=m;
day=d;
}
} 《Java程序设计实用教程(第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)
声明成员方法格式:
[修饰符] 返回值类型 方法([参数列表]) [throws 异常类]
{ 语句序列; [return [返回值]];
}
《Java程序设计实用教程(第3版)》
3.1.1 类
例3.1 声明日期类
public class MyDate
//类声明
{
int year,month,day;
//成员变量
第3章 类的封装、继承和多态
• 3.1 类和对象 • 3.2 类的封装性 • 3.3 类的继承性 • 3.4 类的多态性 • 3.5 类的抽象性
《Java程序设计实用教程(第3版)》
3.1 类和对象
类(class):是既包括数据又包括作用于数据的一组操作的封装体。 对象(object):是类的实例(instance)。 类具有封装性、继承性、多态性和抽象性。 3.1.1 类 3.1.2 对象
int year,month,day; public MyDate( ) //声明构造方法 { //构造方法与类同名,构造方法返回该类的一个实例
year = 1970; month = 1; day = 1; } }
《Java程序设计实用教程(第3版)》
3.2.1 构造方法
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版)》
d2.year d2.month d2.day
d2 20082008 8 8 8 8
图3.3 实例成员变量与静态成员变量的存储结构不同
《Java程序设计实用教程(第3版)》
3.2.5 析构方法
public void finalize() {
语句序列; }
//析构方法
作用是:释放实例,并执行特定的操作。 如:a. finalize() ;
d1==d2结果是true,
(b) 设置d2对象值同d1实例,
d1.equals2(0d20)9结果7是true16 d1==d2结果是false,d1.equals(d2)结果是true
d1 d2
(c) 改
6
dd12 20209008 7 8 16 8
6
, ,果是true
d2 2008 8 8
d2.set(2008,8,8); (c) 改变d2.ds2et对(20象08,,8,不8);影《响Javda1程对序象设计实用教程(第3版)》
3.1.2 对象
3. 引用对象的成员变量和调用对象方法
➢引用成员变量
对象.成员变量 如: d.year=2008;
➢调用成员方法
对象.成员方法([参数列表]) 如: d.set(2009,7,28);
➢Java语言回收机制自动释放对象。 【例3.1】声明日期类及使用日期对象。
《Java程序设计实用教程(第3版)》
3.2.1 构造方法
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)
《Java程序设计实用教程(第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.2 类的封装性
• 封装(encapsulation)的含义是:类的设计者 把类设计成一个黑匣子,使用者只能看见类中 定义的公共方法,而看不见方法的实现细节, 也不能直接对类中的数据进行操作。 • 封装的目的有:
}
public static int getThisYear() //静态成员方法
{
return thisYear;
//访问静态成员变量
} }
《Java程序设计实用教程(第3版)》
3.2.4 静态成员
静态成员变量的初始化:
static
//静态初始化块
{
静态成员变量的初始化;
}
【例3.2】封装的日期类。
《Java程序设计实用教程(第3版)》
3.1.1 类
• 声明类
类声明
{
成员变量的声明;
成员方法的声明及实现; }
类
结 [修饰符] class 类<泛型> [extends 父类] [implements 接口列表]
构
《Java程序设计实用教程(第3版)》
3.1.1 类
2.声明成员变量和成员方法
声明成员变量格式: [修饰符] 数据类型 变量[=表达式] [,变量[=表达式]];
System.out.println(“d1:”+d1+“d2:”+d2+” d1==d2?”+
(d1==d2)+”,d1.equals(d2)?”+(d1.equals(d2)));
}
}
3.1.2 对象
4. 对象的引用模型
实例 year month day
Βιβλιοθήκη Baidu
year month day
d1
000
d1 2009 7 16
d1
MyDate d1 = new MyDate();
d1.set(2009,7,16);
(a) 声明对象并引用实例 (b) 对象调用类的成员方法
d2 M
(c) 对
对
d1 2009 7 16
d2 MyDate d2 = d1;
d1 2008 7 16
d2 d2.year = 2008;
法
(c) 对象引用赋值,两个 对象引用一个实例
缺省
✓
✓
private(私有)
✓
所有类 ✓
3.2.4 静态成员
public class MyDate
{
private int year,month,day;
//实例成员变量
private static int thisYear;
//静态成员变量
static
//静态成员变量初始化
{
thisYear=2009;
{
return this==d||d!=null&&year==d.year&&month==d.month&&day==d.day;
}
//this指代调用本方法的当前对象
3.1.2 对象
public static void main(String args[])
{
MyDate d1 = new MyDate() ; //声明对象,创建实例,引用赋值
态成员变量 MyDate.thisYear 2009
静态成员变量 MyDate.thisYear 2009
实例成员 实变 例量 成员d变 1.y量eard1d.1y.emarondt1h.mdo1n.dthayd1.day
d1
d21008 20088
88
8
d2
d2.year d2.month d2.day