6.1 继承的基本概念
在讲解继承的基本概念之前,读者可以先想一想这样一个问题:现在假设有一个Person类,里面有name与age两个属性,而另外一个Student类,需要有name、age、school 3个属性,如图6-1所示,具体代码如下。
图6-1 Person和Student类
【例6.1】Person类
【例6.2】Student类
从上面的代码中可以发现Person类中已经存在name和age两个属性,所以不希望在Student类中再重新声明这两个属性,这个时候就需要考虑是不是可以将Person类中的内容继续保留到Student类中,这也就是继承所要解决的问题。
在Java中如果要想实现继承,可以直接使用如下的语法来表示。
【格式6-1 类的继承格式】
下面依照以上的格式进行继承的操作,具体代码如下。
【例6.3】继承的实现
程序执行结果:
从以上的程序中读者可以发现,在Student类中并没有定义任何的操作,但是通过继承的功能可以直接把父类中的操作直接拿到子类中使用。当然,子类也可以定义自己的属性或方法,如下面代码所示。
【例6.4】通过子类扩展父类的功能
程序执行结果:
以上的程序Student类扩充了Person,增加了学校的属性及对应的setter、getter方法。也就是说此时Student类中已经存在了3个属性及3组setter()、getter()方法,如图6-2所示。
图6-2 Person与Student类的继承图
注意
只允许多层继承不能多重继承。
在Java中只允许单继承,不能使用多重继承,即:一个子类只能继承一个父类,如图6-3所示;允许进行多层继承,即:一个子类可以有一个父类,一个父类还可以有一个父类,如图6-4所示。
图6-3 多重继承
图6-4 多层继承
实例1:错误的继承代码
由上面的代码可以发现类C同时继承了类A与类B,也就是说C类同时继承了两个父类,这是不允许的。
实例2:多层继承
由上面可以发现类B继承了类A,而类C又继承了类B,也就是说类B是类A的子类,而类C则是类A的孙子类。
同样,在类图的表示中对于继承也是有明确的要求的,可以使用如下形式的图形表示类的继承关系。
图6-5 继承的类图表示
提示
继承的子类有时也称为派生类。
使用extends关键字可以实现继承的关系,但是这个关键字的本身含义是“扩展”,更准确地说是一个类扩展已有类的功能,在其他的书中也会经常把子类称为派生类。
在使用继承的时候也应注意的是:子类是不能直接访问父类中的私有成员的,但是子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员,如图6-6所示。
图6-6 子类访问的限制
【例6.5】子类访问限制
编译时错误:
上面的代码中,子类直接访问了父类中的私有属性,所以在编译的时候编译器会通知用户name和age属性无法访问,如果此时不直接访问name()或age()属性,而是直接通过setter()或getter()方法调用的话,就可以访问。
【例6.6】通过getter方法间接取得属性内容