1 问题描述

这个问题是来源于我的导师给我提出的问题,在学习子类与父类的关系之后,子类可以继承父类的属性及方法。那么子类是否可以继承父类的所有方法和属性呢?子类与父类的具体继承关系是怎样的呢?本文围绕这个问题展开说明。

2 问题分析

这个问题涉及到多种可能性,因此我们只有通过实验的方式来得到我们想要的结果。我认为这个实验需要4个类才能完成,三个类用于实现继承关系,一个类用于测试。接下来就来看一下我实验的具体结果。

3 解决方案

首先我创建了四个类,如下:

子类成员数目一定大于等于父类成员数目_编程

然后我给每个类(除了Test类)都给了他们自己的方法和属性:

子类成员数目一定大于等于父类成员数目_编程_02

子类成员数目一定大于等于父类成员数目_编程_03

子类成员数目一定大于等于父类成员数目_编程_04

然后我们来继承一下:

子类成员数目一定大于等于父类成员数目_编程_05

 

我发现类和类之间的继承和接口的实现不同,一个类可以同时实现多个接口,但是一个子类只能继承一个父类,我试了一下同时继承两个父类,但是没有成功,但是类之间可以多重继承,意思就是子类继承父类,然后“孙类”继承父类,子子孙孙无穷无尽。

子类成员数目一定大于等于父类成员数目_编程_06

子类成员数目一定大于等于父类成员数目_编程_07

 

完成子类和父类的继承关系测试之后,我们来看看子类到底能继承父类多少东西。这里就字需要用到三个类了,两个有继承关系的类和一个测试类。这里我就只用到了Rectangle类和Shape类,还有一个测试类。首先我们在测试类里面实例化一个Shape对象,调用一下他和他父类的所有属性和方法:

子类成员数目一定大于等于父类成员数目_编程_08

 

我们看到,无论是父类的private(私有的)属性和方法还是他自己本身的private(私有的)属性和方法都无法被调用,图片中红色字体和红色下划线的都为报错。

子类成员数目一定大于等于父类成员数目_编程_09

 

子类成员数目一定大于等于父类成员数目_编程_10

子类成员数目一定大于等于父类成员数目_编程_11

最后,在没有改变属性的private属性的情况下,我只能给这个私有属性添加一个公共的set和get方法,才成功的在测试类中调用到了他,意思就是当属性为私有的时候,我们需要通过反射的方法去调用这个属性。那么私有的方法怎么办呢?

子类成员数目一定大于等于父类成员数目_编程_12

子类成员数目一定大于等于父类成员数目_编程_13

 

调用私有方法也是一样,因为java是一个安全性能很高的编程语言,所以私有变量就只能在内部类里面调用,这样才符合面向对象的编程思想。因此我们可以在内部类里面用公有的方法去调用私有方法之后,在测试类中我们就可以间接的调用私有方法。

4 总结

我们都知道,在java语言中的类可以存在继承关系,子类和父类的关系就好比一个儿子和一个父亲,父亲的财产总是会交给儿子,儿子拿到财产之后,儿子还可以创造自己的财产,这样儿子的财产就比父亲原来的财产多了。然后儿子的儿子也就是这里所说的父亲的孙子,还可以继续继承他自己父亲的财产。但是我们发现私有类只能在内部类里面调用,上面的实验也证明了这一点,并且无论是父类的私有类还是子类自己的私有类,我们在测试类中都无法直接调用,需要间接的调用。但是这并不是代表子类不能继承父类的私有类,只是私有类无法直接调用而已。因此,我得出的结论还是子类成员数目一定大于等于父类成员数目,只是私有成员变量我们要通过一些特殊方式才能调用。

更多精彩文章: