Java中类的继承

  • 格式:doc
  • 大小:30.00 KB
  • 文档页数:5

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java中类的继承

1、方法重载

重载方法必须满足以下条件:

#方法名相问.

#方法的参数类型、个数、顺序至少有一项不相同。

#方法的返回类型可以不相同。

#方法的修饰符可以不相同.

方法覆盖

(1)子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致.

(2)子类方法不能缩小父类方法的访问权限.

(3)子类方法不能抛出比父类方法史多的异常,

(4)方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间.在同一个

类中方法只能被重载,不能被扭盖。

(5)父类的静态方法不能被子类覆盖为非静态方法。

(6)子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法.在编译时,子类定义的静态方法也必须满足与方法覆盖类似的约束。

(7)父类的非静态方法不能被了类覆盖为静态方法。

(8)父类的私有方法不能被子类覆盖。

(9)父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法:二是子类重新声明父类的抽象方法。

(10)父类的非抽象方法可以被覆盖为抽象方法.

方法覆盖与方法重载的异同

方法覆盖和方法重载具有以下相同点:

#都要求方法同名.

#都可以用于抽象方法和非抽象方法之间.

方法筱盖和方法重载具有以下不同点:

#.方法覆盖要求参数签名必须一致.而方法重载要求参数签名必须不一致.

#.方法覆盖要求返回类型必须一致,而方法重载对此不做限制.

#.方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方d (包括从父类中继承而来的方法)。

#.方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这力面没有任何限制。

#.父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次。

super关键字

super和this关键字都可以用来履盖Java语言的默认作用域.使被屏蔽的方法或变

盆变为可见。在以下场合会出现方法或变量被屏蔽的现象.

.场合一:在一个方法内.当局部变量和类的成员变量同名,或者局部变量和父类的成员变量同名时,按照变量的作用域规则,只有局部变量在方法内可

见。

.场合二:当子类的某个方法覆盖了父类的一个方法。在子类的范围内,父类

的方法不可见.

.场合三:当子类中定义了和父类同名的成员变量时,在子类的范围内,父类

的成员变量不可见。

在程序中,在以下情况下会使用super关键字:

#在类的构造方法中,通过super语句调用这个类的父类的构造方法。

#在子类中访问父类的被屏蔽的方法和属性。

多态性

它是指当系统A访问系统B的服务时,系统B可以通过多种实现方式来提供服务,

而这一切对系统A是透明的.

多态的各种特性

(1)对于一个引用类型的变量,Java编译器按照它声明的类型来处理.

(2)对于一个引用类型的变盆.运行时Java虚拟机按照它实际引用的对象来处理.例如以下代码虽然编译可以通过,但运行时会抛出ClassCastException运行时异常.

Sub sub=new Sub();

Base base=(Base)sub;

在运行时,子类的对象可以转换为父类类型,而父类的对象实际上无法转换为子

类类型。因为通俗地讲,父类拥有的成员子类肯定也有,而子类拥有的成员父类不一

定有。

(3)在运行时环境中.通过引用类型变量来访问所引用对象的方法和属性时,Java 虚拟机采用以下绑定规则。

#实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,

因为是在运行时由Java虚拟机动态决定的.

#.静态方法与引用变量所声明的类型的方法绑定.这种绑定属于静态绑定,因

为实际上是在编译阶段就己经做了绑定.

.#成员变量(包括静态变且和实例变量)与引用变量所声明的类型的成员变量

绑定,这种绑定属于静态绑定,因为实际卜是在编译阶段就已经做了绑定.

继承的利弊和使用原则

继承树的层次不可太多

继承树(不考虑顶层的Object类)的层次应该尽蚤保持在两到三层。

如果继承树的层次很多,会导致以下弊端:

(1)对象模型的结构太复杂,难以理解,增加了设计和开发的难度。继承树底层

的子类会继承上层所有直接父类或间接父类的方法和属性,假如子类和父类之间还有

频繁的方法覆盖和属性被屏蔽的现象,那么会增加运用多态机制的难度,难以预计在

运行时方法和属性到底和哪个类绑定。

(2)影响系统的可扩展性。继承树的层次越多,在继承树上增加一个新的继承分

支需要创建的类越多。

继承树的上层为抽象层

当一个系统使用一棵继承树上的类时,应该尽可能地把引用变量声明为继承树的上层类型,这可以提高两个系统之间的松耦合

位于继承树上层的类具有以下作用:

#定义了下层子类都拥有的相同属性和方法,井且尽可能地为多数方法提供默认的实现,从而提高程序代码的可重用性。

#代表系统的接口,描述系统所能提供的服务。

在设计继承树时,首先进行自下而上的抽象,即识别子类之间所拥有的共同属性和功能,然后抽象出共同的父类,位于继承树最七层的父类描述系统对外提供哪些服

务。如果某种服务的实现方式适用于所有子类或者大多数子类,那么在父类中就实现

这种服务。如果某种服务的实现方式取决于各个子类的特定属性和实现细节,那么在

父类中无法实现这种服务.只能把代表这种服务的方法定义为抽象方法,并且把父类

定义为抽象类。

由干继承树卜层的父类描述系统对外提供的服务,但不一定实现这种服务,因此

把继承树的上层称为抽象层。在进行对象模型设计时,应该充分地f}计系统现在必须

具备的功能,以及将来需要新增的功能.然后在抽象层中声明它们.抽象层应该比较

稳定,这可以提高与其他系统的松耦合及系统本身的可维护性。

继承关系最大的弱点:打破封装

继承关系最大的弱点就是打破了封装。每个类都应诊建寸装它的属性及实现细节,

这样,当这个类的实现细节发生变化时,不会对其他依赖它的类造成影响。而在继承

关系中,子类能够访问父类的属性和方法,也就是说.子类会访问父类的实现细节,子

类与父类之间是紧密耦合关系,当父类的实现发生变化时,子类的实现也不得不随之

变化,这削弱了子类的独立性.

精心设计专门用于被继承的类