180 likes | 301 Views
深入面向对象编程. 授课人:于军. 下一页. 本讲主要内容. 构造函数 类的继承 重载与多态. 构造函数( constructor). 问题的提出 Java 试图在每个对象一诞生时,就给它一确定的状态,但有时这种系统的缺省初值不 合适;所以在创建一个新对象时,需用构造 函数完成合法的初始化,使类内成员的初始 化工作不依赖于外界完成。 体现了面向对象的 autonomy 原则。. 构造函数(二). 构造函数是一种特殊的类成员函数, 在 创建每个新的类对象时自动执行 以保证新对象的各成员有合法、确定的数值。 构造函数的名字就是类的名字。 构造函数没有返回类型
E N D
深入面向对象编程 授课人:于军 下一页
Java语言与面向对象程序设计:第四讲 本讲主要内容 • 构造函数 • 类的继承 • 重载与多态
Java语言与面向对象程序设计:第四讲 构造函数(constructor) • 问题的提出 • Java试图在每个对象一诞生时,就给它一确定的状态,但有时这种系统的缺省初值不合适;所以在创建一个新对象时,需用构造函数完成合法的初始化,使类内成员的初始化工作不依赖于外界完成。 • 体现了面向对象的autonomy原则。
Java语言与面向对象程序设计:第四讲 构造函数(二) • 构造函数是一种特殊的类成员函数,在创建每个新的类对象时自动执行以保证新对象的各成员有合法、确定的数值。 • 构造函数的名字就是类的名字。 • 构造函数没有返回类型 • 构造函数只能在创建类对象时由系统隐含调用,而不能直接引用 • 构造函数内部可以调用其他的函数, 但一般不在其中创建新的其他类的对象
Java语言与面向对象程序设计:第四讲 例子:构造函数 class BankAccount { static private int m_nNextAccNum; private int m_nAccNum; static final double m_dLOWESTB = 10.0; private double m_dBalance; BankAccount ( ) { m_nAccNum = m_nNextAccNum++; m_dBalance = m_dLOWESTB; } }
Java语言与面向对象程序设计:第四讲 类对象的创建 • 利用运算符 new 在内存中开辟专用空间,存放指定的类的实例(对象) • 自动执行类的构造函数,初始化新对象的成员变量 • 在程序中,以对象名为前缀,可访问对象成员变量、调用方法 baMyBankAccount = new BankAccount(); baMyBankAccount . saveMoney(sAmount) ;
Java语言与面向对象程序设计:第四讲 静态初始化器 • 静态数据成员、复杂数据成员的初始化可在静态初始化器中完成 • 静态初始化器中的语句在类加载内存时执行,这种初始化操作要比构造函数执行得更早。 • static { . . . . . . }
Java语言与面向对象程序设计:第四讲 课堂练习 • 在UseAccount2的基础上,创建新应用程序BankConstructor • 要求 • 利用构造函数完成所有的初始化工作 • 余额 • 帐户号码(提示:使用静态初始化器)
Java语言与面向对象程序设计:第四讲 Java中类的继承(一) • 创建类时指明它为某存在类的子类 • extends超类/父类名 • 父类 • 来自系统类库 • 用户自定义类 • 子类将继承除 private 外所有父类成员 • Java不支持多重继承 • 例子:支票帐户、存款帐户
Java语言与面向对象程序设计:第四讲 Java中类的继承(二) • 子类对父类可做扩展和特殊化 • 创建新的成员:变量和方法 • m_lSaveAccNum, m_lCheckAccNum • 重新定义父类中已有的变量:隐藏 • m_dInterestRate • 重新定义父类中已有的方法:重载(override )子类中的重载方法应与父类中的被重载方法有完全相同的:参数列表、返回值 • setInterestRate( ) , getAccountNumber( )
Java语言与面向对象程序设计:第四讲 类的继承(三)this,super • 引用类的成员变量或方法时的前缀 • this:当前类的方法或变量 • super:直接父类的成员(只能上溯一层) • 直接调用父类的方法可减少代码的重复 例:BankAccount类 CheckAccount子类 this.Fee():收取支票帐户的特殊费用 super.Fee():收取所有帐户的公共费用 • 父类对象可类型转换成子类对象 if ( Ba instanceOf (SaveAccount ))SaveAccount MySa = (SaveAccount) Ba;
Java语言与面向对象程序设计:第四讲 构造函数的继承 • 子类自动继承父类不含参数的构造函数并在创建新子类对象时自动执行,子类有自己的构造函数时也同时执行 • 子类的构造函数如调用父类的含参数的构造函数,需用SUPER关键字,且该调用语句必须是子类构造函数的第一个可执行语句。
Java语言与面向对象程序设计:第四讲 构造函数的其他问题 • 不用构造函数声明类对象 BankAccount b = new BankAccount( ba ); BankAccount b = ba;(是否开辟独立的内存单元) • 一构造函数可利用this调用其他的构造函数,此时this应是第一个可执行语句 BankAccount( ) { this(10); }//调用下面函数 BankAccount(double InitBalance ) { m_dBalance = InitBalance; }
Java语言与面向对象程序设计:第四讲 例子:类的继承 • InheritClass程序 • 创建扩展类SaveAccount和CheckAccout • 继承BankAccount类的 • 变量:m_dBalance, m_dInterestRate • 方法:Yearly(), AccumulateInterest(),... • 定义自己的变量 • 重载父类的方法:setInterestRate( )等 • 构造函数的继承
Java语言与面向对象程序设计:第四讲 例子:类的继承 • InheritClass程序 • 创建扩展类SaveAccount和CheckAccout • 继承BankAccount类的 • 变量:m_dBalance, m_dInterestRate • 方法:Yearly(), AccumulateInterest(),... • 定义自己的变量 • 重载父类的方法:setInterestRate( )等 • 构造函数的继承
Java语言与面向对象程序设计:第四讲 FINALIZER { . . . . . . } • 一种特殊的函数 • 在一个对象被返还给系统存储HEAP之前自动执行 • Java的垃圾回收机制: 每个对象有自己的REFERENCE计数器,计数 器减为零时对象丢失,系统在其后某个时刻自动回收不再可用的对象 • 类似于析构函数,完成资源释放操作
Java语言与面向对象程序设计:第四讲 Java中的多态与重载 • 多态:同名的不同方法共存 • 重载(overload):同名方法被多次重新定义 • 同名提高了抽象程度,降低维护工作量 • 定义、调用时如何区别被重载的方法 • 同类中的同名方法 用不同的参数列表来区别同名的不同方法 不能用返回值(可忽略)来区别 • 不同类中的同名方法:冠以类名以示区别
Java语言与面向对象程序设计:第四讲 例子:多态与重载 • OverrideClass程序 在已有的BankAccount类的基础上 重载BankAccount类的构造函数