JAVA进阶 面向对象程序设计——第4章 继承与多态【不同访问属性使子类在使用这些成员时不同】

第4章 继承与多态


4.1 继承
4.2 子类父类关系
4.3 多态变量和向上造型
4.4 多态
4.5 类型系统


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


4.1 继承


面向对象程序设计语言有三大特性:封装、继承和多态性。

继承是面向对象语言的重要特征之一,没有继承的语言只能被称作“使用对象的语言”。

继承是非常简单而强大的设计思想,它提供了我们代码重用和程序组织的有力工具。


资料库的故事

资料库设计


继承【得到父类的所有(成员函数)

public   class   DVD   extends  Item  {

   }


子类可以直接使用父类的调用函数


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


4.2 子类父类关系


对理解继承来说,最重要的事情是,知道哪些东西被继承了,或者说,子类从父类那里得到了什么。

答案是:所有的东西,所有的父类的成员,包括变量和方法,都成为了子类的成员,除了构造方法。构造方法是父类所独有的,因为它们的名字就是类的名字,所以父类的构造方法在子类中不存在。除此之外,子类继承得到了父类所有的成员。

但是得到不等于可以随便使用。每个成员有不同的访问属性,子类继承得到了父类所有的成员,但是不同的访问属性使得子类在使用这些成员时有所不同

有些父类的成员直接成为子类的对外的界面,有些则被深深地隐藏起来,即使子类自己也不能直接访问。

下表列出了不同访问属性的父类成员在子类中的访问属性:


public            protected                缺省                  private


public的成员直接成为子类的public的成员,protected的成员也直接成为子类的protected的成员。

Java的protected的意思是包内和子类可访问,所以它比缺省的访问属性要宽一些。


父类的private的成员在子类里仍然是存在的,只是子类中不能直接访问。

我们不可以在子类中重新定义继承得到的成员的访问属性。

如果我们试图重新定义一个在父类中已经存在的成员变量,那么我们是在定义一个与父类的成员变量完全无关的变量,在子类中我们可以访问这个定义在子类中的变量,在父类的方法中访问父类的那个。

尽管它们同名但是互不影响。




在构造一个子类的对象时,父类的构造方法也是会被调用的,而且父类的构造方法在子类的构造方法之前被调用。

在程序运行过程中,子类对象的一部分空间存放的是父类对象。因为子类从父类得到继承,在子类对象初始化过程中可能会使用到父类的成员。

所以父类的空间正是要先被初始化的,然后子类的空间才得到初始化。在这个过程中,如果父类的构造方法需要参数,如何传递参数就很重要了。



子类父类关系

程序运行顺序



。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。





4.3 多态变量和向上造型



类定义了类型,DVD类所创建的对象的类型就是DVD。

类可以有子类,所以由那些类定义的类型可以有子类型。在DoME的例子中,DVD类型就是Item类型的子类型。

子类型类似于类的层次,类型也构成了类型层次。子类所定义的类型是其超类的类型的子类型。


当把一个对象赋值给一个变量时,对象的类型必须与变量的类型相匹配,如:
    Car myCar = new Car(); 

是一个有效的赋值,因为Car类型的对象被赋值给声明为保存Car类型对象的变量。但是由于引入 了继承,这里的类型规则就得叙述得更完整些:
    一个变量可以保存其所声明的类型或该类型的任何子类型。

对象变量可以保存其声明的类型的对象,或该类型的任何子类型的对象。
Java中保存对象类型的变量是多态变量。“多态”这个术语(字面意思是许多形态)是指一个变量可以保存不同类型(即其声明的类型或任何子类型)的对象。



多态变量

子类的对象可以当作父类的对象来使用【赋值给父类的变量,传递给需要父类对象的函数,放进存放父类对象的容器里】

子类和子类型的关系


多态变量

向上造型

子类向父类赋值,对象管理

造型【括号围起来放在类型前面,对象本身没有发生任何变化,


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。



4.4 多态


如果子类的方法覆盖了父类的方法,我们也说父类的那个方法在子类有了新的版本或者新的实现。

覆盖的新版本具有与老版本相同的方法签名:相同的方法名称和参数表。

因此,对于外界来说,子类并没有增加新的方法,仍然是在父类中定义过的那个方法。

不同的是,这是一个新版本,所以通过子类的对象调用这个方法,执行的是子类自己的方法



覆盖关系并不说明父类中的方法已经不存在了,而是当通过一个子类的对象调用这个方法时,子类中的方法取代了父类的方法,父类的这个方法被“覆盖”起来而看不见了。



当调用一个方法时,究竟应该调用哪个方法,这件事情叫做绑定。

绑定表明了调用一个方法的时候,我们使用的是哪个方法。

绑定有两种:一种是早绑定,又称静态绑定,这种绑定在编译的时候就确定了;另一种是晚绑定,即动态绑定。

动态绑定在运行的时候根据变量当时实际所指的对象的类型动态决定调用的方法。Java缺省使用动态绑定。



多态



。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。




4.5 类型系统
 

OBJECT类

单根结构

Object类的函数:toString(),equals()


DOME的新媒体类型



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值