1、对象的3种关系
包含
关联
继承
2、Java中的继承
3、重写
1、现实世界中对象之间主要存在3种关系:包含、关联和继承。
包含:当对象A是对象B的一个组成部分时,称对象B包含对象A。称为“has-a”。被包含对象将被保存在包含它的对象的内部,例如发动机对象被保存在汽车对象的内部,作为汽车对象的一个组成部分。利用一个已有对象构造另一个对象,在面向对象程序语言中称为合成(composition),是代码重用的一种重要方式。
关联:当对象A中需要保存对象B的一个引用而不是对象B本身时,称对象A和对象B之间是关联关系。此时表示对象B表达对象A的某种属性,但不是对象A的一个组成部分。
继承:当对象A是对象B的特例时,称对象A继承了对象B。例如山地车和自行车(”is-a”)。继承也是面向对象的多态性的基础。
2、Java中的继承
单继承
继承可以分为单继承和多继承。在单继承方式下,类的层次结构为树型结构,而多重继承是网状结构。Java只支持类之间的单继承,多重继承要通过接口实现。单继承的优点是可以避免多个直接父类之间可能产生的冲突,使代码更可靠。通过接口实现多继承。
继承优点:提高代码复用性,实现对现实世界更好的抽象
单继承而非多继承:单继承避免多个父类之间可能的冲突,多继承会引起混乱,继承链复杂,维护难
子类对象可以作为父类对象使用。子类与父类的差异主要体现在两个方面:子类往往对父类进行了扩充,增加了新的变量和方法,所以在Java中继承用关键字 extends 。另外,更重要的一方面是子类可以改变父类继承而来的方法,称为方法的重写(overriding)。重写意味着子类使用与父类相同的接口,但实现不同的行为。
下列是子类不能继承的:
(1) 带private修饰符的属性、方法是不能被继承的
(2) 构造方法不能被继承
3、重写
重载:方法名相同但是参数不同
重写和重载没有关系!!!
子类方法重写时,可以在方法里通过super调用父类
(1)子类中父类成员的隐藏
在类层次结构中,当子类的成员变量与父类的成员变量同名时,子类的成员变量会隐藏父类的成员变量;当子类的方法与父类具有相同的名字、参数列表、返回值类型时,子类的方法重写了父类的方法,在父类定义的方法就被隐藏。“隐藏”的含义是,通过子类对象调用子类中与父类同名的变量和方法时,操作的是这些变量和方法在子类中的定义。子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为。
(2)方法重写
指子类重写父类的成员方法。
方法重写遵守的规则:
① 子类中重写方法的返回值类型必须与父类中被重写方法的返回值类型相同。
② 子类中重写方法的访问权限不能缩小
③ 子类中重写方法不能抛出新的异常。
(《疯狂java讲义》)重写要遵循“两同两小一大”规则:“两同”即方法名、形参列表相同,“两小”即子类方法返回值类型应比父类返回值类型更小或相同、子类方法声明抛出的异常应比父类方法声明抛出的异常类更小或相等,“一大”指子类方法的访问权限应比父类方法更大或相同。覆盖方法或被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。
返回值类型小于等于父类:仅当父类方法返回是类类型时,子类重写可返回子类类型,父类返回person,子类返回Student(子类扩展了父类,子类也是一个父类),当是基本类型返回时,必须一致(否则编译报错incompatible with不相符)。