继承要点
什么是继承?Java继承有哪些特性?
Java语言是一种典型的面向对象的面向对象程序设计语言,因此Java也支持类的继承。Java的继承有以下特性:
- 不支持多重继承。与C++不同,Java语言不支持多重继承,在Java中一个子类至多有一个父类,但是Java可以通过实现多个接口来达到多重继承的目的
- 继承的权限问题。对于继承关系来说,如果子类和父类处于同一个包内,则子类可继承父类中的public,protected和default访问权限的成员和方法;如果子类和父类不在同一个包中,则子类只能继承父类中的public、protected访问权限的成员和方法;如果子类和父类不在同一包内,则子类只能继承父类中的public,protected访问权限的成员和方法
- 成员变量和方法存在覆盖关系。子类中定义的成员变量或者方法,此时不会发生继承
- 继承是面向对象的一个重要特性,通过继承实现代码的复用。Java继承的主要特性包括:1.不支持多重继承,可实现多个接口;2.子类只能继承父类的非私有成员变量和方法;子类可覆盖父类的成员变量和方法;3。子类可覆盖父类的成员变量和方法
- 特别提示
- Java的继承中最显著的特点就是Java不支持多重继承,只能单继承,但可以实现多个接口。这是Java继承与C++继承的最显著区别。
简述继承和组合的区别
继承和组合都是实现代码复用的重要手段,但是两者存在本质区别
对于继承来说,父类是其所有子类共性的抽象,而子类则是父类的某类特例,因此也有人说在继承中子类和父类的关系是一种"is a"的关系,就像在知识点梳理中举出的例子那样"Chinese is a People"“American is a People”。另外,在继承关系中,虽然一个子类的对象中包含其父类的对象,但这种包含是隐式的。
组合则是另一种形式的代码复用,所谓组合是指在一个新类中嵌入一个旧类的对象,从而重复利用已有类的功能。通常情况下,新类作为整体类而存在,旧类作为局部类存在,新类和旧类之间存在整体和部分的关系。所以也有人说在组合中新类和旧类的关系是一种“has a”的关系。另外,在新类的对象中包含旧类的对象,这种包含是显式。
关于继承和组合的区别,可以通过下面这段示例的代码理解:
public class Vehicle{
........
class Bus extends Vechicle{
Wheel mWheel=new Wheel();
public void run(){
//定义bus开动的方法,调用mWheel的rotation方法
mWheel.roation();
}
}
class Wheel{
public void roation(){
........
}
}
}
上面的代码只是一段示意代码,是为了说明组合继承的区别。Vehicle是交通工具类。而Bus只是交通工具的一种,所以Bus和Vehicle之间是"is -a"的关系,因此将Bus作为Vehicle的派生类扩展出来是比较合理的
Wheel表示车轮类,它显然只是Bus的一部分,所以Bus和Wheel类之间应该是“has-a”的关系,在Bus类中不需要再定义有关车轮的其他属性,也需要定义描述车轮转动的rotation方法,而是直接复用Wheel类的rotation方法。假如还要定义一个Car类,则仍然可以复用Wheel类作为其属性,而不是再重新定义。
虽然继承可以很好地实现的复用,但是继承本身存在先天的不足。其最大的缺点就是破坏了类的封装性。由于在访问权限允许的前提下,子类可以直接访问父类的属性和方法。这样就造成了子类和父类之间的深度耦合,这种情况并不有利代码的维护和扩展。所以除非两个类之间存在明确的“is-a”关系,否则不应轻易使用继承,通过实现接口和使用组合的方式同样可以达到实现多态和代码复用的目的
继承和组合都是实现代码复用的方式,继承的子类与父类之间是一种"is-a"的关系,组合的新类和旧类之间是一种"has-a"的关系。
在实际应用尽量少用继承,因为它可能造成子类和父类之间的深度耦合,从而使代码变得用臃肿而不利于维护,建议更多地使用组合的方式实现代码复用