子类可以继承父类中的非私有成员,也就是不能继承父类中的私有成员,同时,子类也不能继承父类中的构造方法。
【例4-2】 有三个类:Farther类、Son类、Grandson类。
Father类的代码如下:
第3~5行代码,定义了Father类中的无参的构造方法。有Son类继承了Father类,代码如下:
第3~5行代码,定义了Son类中无参数的构造方法。有Grandson类继承了Son类,代码如下:
第3~5 行,定义了Grandson 类中无参数的构造方法。类Son 继承了Father类,类Grandson继承了Son类,则Father类为Grandson类的间接父类。
创建一个ConsrtucterInInherit Test测试类,代码如下:
上述代码的运行结果如下:
第4、5、6行代码分别调用Grandson 类、Son 类和Father类中的无参构造创建了三个对象。
分析程序运行结果,前三行结果是第4行代码的运行结果,中间两行是第5行代码的运行结果,而最后一行是第6行代码的运行结果。从运行结果我们看出,调用Grandson类的无参构造时,会去调用其父类Son类的无参构造,而调用Son类的无参构造时,会去调用Son类的父类Father类的无参构造。前面提过,Object类是任何类的父类。故调用Grandson类的无参构造时,执行顺序为:首先执行Object类中的无参构造,然后执行Father类的无参构造,接下来执行Son类的无参构造,最后执行Grandson类的无参构造。那么调用Son类的无参构造时,执行顺序是什么呢?请读者自行分析。
子类既然不能继承父类的构造方法,那么子类是如何调用父类的构造方法呢?就是通过“super();”这条语句,而且这条语句可以省略。但是如果把“super();”这条语句写出来,它一定要在第一条的位置,否则会编译出错。故Father类中第3、4条语句之间有一条“super();”语句,只不过这条语句没有写出来,这条语句调用了Object类中的无参构造。Son类中第3、4条语句之间也有一条“super();”语句,该语句的作用是调用Father 类中的无参构造。GrandSon类中第3、4条语句之间也有一条“super();”,该语句的作用是调用Son类中的无参构造。
“super();”这条语句的作用就是调用父类中无参数的构造方法,所以当父类中没有无参构造时,子类中的构造方法中第一条语句必须显示地用super调用父类中有参数的构造方法,否则编译会出错。(www.xing528.com)
【例4-3】 教师类和学生类具有共同的属性:姓名、年龄、性别、身份证号,而学生还具有学号和所学专业两个属性,教师还具有教龄和所教专业两个属性。
因为教师类和学生类有共同属性,故提取出来放在“人类”中,代码如下:
第3~6行代码定义了成员变量,第7~12行是带参数的构造方法,第13~20是系统生成的toString方法。
教师类继承人类,代码如下:
第3、4行代码定义了Teacher类自己的私有成员变量,第5~9行是Teacher类的带参构造,第6行代码通过super关键字调用了Person类的带参构造,并传入参数。第10~19行代码是系统生成的toString方法。
学生类继承人类,代码如下:
第3、4行代码定义了Student类自己的私有成员变量,第5~10行是Student类的带参构造,第7行代码通过super关键字调用了Person类的带参构造,并传入参数。第11~20行代码是系统生成的toString方法。
创建测试类ConsrtucterInInherit Test1来测试带参构造,代码如下:
上述代码的运行结果如下:
第4~5 行创建了student对象,第6~7 行创建了teacher对象,第8、9 行分别输出student和teacher对象。注意,输出对象时,默认调用toString 方法,故第10 行代码与“System.out.println(student.toString())”等价,第11 行代码与“System.out.println(teacher.toString())”等价。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。