在面向对象程序设计中,继承机制可以有效地组织类的结构、确定类之间的关系,在已有类的基础上开发新的类。继承机制在程序代码复用、提高软件开发效率、降低软件系统维护成本等方面具有重要作用。
在客观事物中,同类事物既有共性也有其特殊性。例如小轿车、客轮、客机都有载人数,发动机,转向,停止等共性,但每个具体事物又有其特殊性,如小轿车有前档、后档。客轮有吃水线和吨位,客机有飞行高度、巡航速度等。 摘自《利用案例轻松学java》。
我们可以吧交通工具定义为一个类,称为一般类。它具有小轿车,客轮和客机都拥有的发动机、载人数量、转向、停止等共性。还具有自己的属性和方法。
如果类B具有类A的全部属性和方法,而且又具有自己特有的属性和方法。则把类A称为一般类,把类B称作特殊。 上述交通工具是一般类,小汽车,客轮,客机为特殊类。
面向对象程序设计的继承机制是指在由一般类和特殊类形成的一般 --- 特殊之间的类结构中,把一般类和所有特殊类的对象实例都共同具有的属性和操作一次性的在一般类中进行定义,在特殊类中不在重复定义一般类中已经定义的属性和操作,特殊类自动拥有一般类(以及所有更上层的一般类)中定义的属性和操作。特殊类的对象拥有其一般类的对象的全部属性和操作(除非进行限制),称为一般类对特殊类的继承。
*注子类可以从父类那里继承所有非private的数据成员和方法作为自己的成员,即子类不能直接访问父类的私有成员(包括数据成员和成员方法) 如果需要访问私有数据成员,则通过getter和setter方法实现。如果定义一个类而不给出extends关键字及父类名,默认这个类是系统类Object的之类
如果类B继承了类A,那么类B具有类A的全部或部分属性和方法。我们将被继承的类A称为基类(超类,父类),继承类B为类A的子类(派生类)。
例如:
class A
{
int x=12;//被继承
static double y=34;//被继承
final int xx=123;//被继承,不能修改xx的搜索值,一经初始化就被看作常量使用
private float r=12.0f;//不能被继承
A()//不能被继承
{
//====构造方法体
}
public void f(){}//被继承
protected void d(){}//被继承
private void k(){}//不能被继承
final void gg(){}//被继承,不能被覆盖
void w(){}//被继承
//也就是说构造函数和被关键字private修饰的东西都不能被继承
}
class B extends A
{
//========
//=======
//A的类体
}
利用继承机制能有效避免重复描述一般类与特殊类之间的共性,同时通过继承可以清晰的表达每一个共同特征所适应的概念范围。
方法覆写:
方法覆写指子类的方法与父类的方法在方法名,参数个数和参数类型完全一致;
*注方法覆写时子类方法的访问控制权限不能小于父类中的方法的访问控制权限。(如父类访问控制权限为public时,子类也只能是public的 );
方法重载:
方法名相同,但参数个数或参数类型不同;
*注 两者区别在于: 方法覆写存在于子类与父类之间,重载存在于类内部方法之间
继承具有以下特征:
(1) 继承的关系是传递的
(2)继承简化了人们对客观事物的认识和描述,能清晰体现相关类之间的层次结构关系。
(3)继承提供了软件复用的能力
(4)继承减少了模块间的接口与界面,争强软件易维护性。
(5)提供多层继承机制,(但只允许单重继承。即一个子类只能继承一个父类)
但是虽然继承给我们带来诸多好处但是我们还是要慎用继承!!
继承会破坏封装,父对于类而言,他的实现细节对子类来书是透明的。
父类变,子类就必须变,继承也是一种强耦合关系。所以我们要慎用继承,但是我们合时使用继承呢?
《Think in java》中提供了解决办法:当我们必须要从子类向父类进行向上转型。则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。
本人学习总结所用,如有纰漏错误之处请指正,定虚心学习改正!谢谢。