如图我们定义一个teacher类,然后我们定义一种teach方法,即teacher类中的对象可以调用teach方法,并且teach方法的参数类型是Studentq,接着在这个teach方法的方法体中调用Studentq中定义过的方法study。
然后我们定义两个类来作为Studentq的子类,分别是UNStudentq和UNNStudentq,这两个类都是Studentq的子类,但是在这两个类中对study方法都重新进行了方法重写,并且方法体不一样。然后在主程序中创建Teacher类新对象调用teach函数,并且函数的参数分别取UNStudentq中的对象以及UNNStudentq中的对象。
可能这里我们会疑惑teach的函数参数设定时已经将参数类型确定为Studentq,这里UNStudentq和UNNStudentq作为Studentq的子类,其类中对象是不可以作为函数参数的,事实上是可以的,即某一个方法它的参数类型是某一个类,那么这个类的子类的对象也可以作为这个定义的方法的参数。此外,这里两个子类中的新对象zzms和kzms都被作为了teach方法的参数,得到的结果是不一样的,显然,得到的结果是根据两个子类中对study方法各自重写的的新的方法体得到的。
综上所述,方法定义了参数类型为某个类,那么这个类的子类们的对象也可以作为方法的参数,如果方法中涉及子类对这个(父)类重写的(其他)方法,那么优先按照子类中的重写的(其他)方法的方法体来得到结果。这个特点很有用,比如我们这个例子,一个老师可以教很多种学生,大学生,中学生,小学生,他们各自学习得到的结果是不同的,老师只需要说明是教哪一种学生,就可以得到相应的结果,非常的方便。



