继承与多态 课后动手动脑

  1. 动手实验:继承条件下的构造方法调用

 

若两个super方法都隐藏,则输出:

 

若第一个super不隐藏,第二个隐藏,则输出:

 

若两个都不隐藏或第二个不隐藏,则不能输出,即输出错误。

故,结论为:通过super调用基类构造方法,必须是子类构造方法中的第一个语句。

2.动手动脑,请自动编写代码测试,在子类中,若调用父类中被覆盖的方法,可以使用super关键字。

 

运行结果:

 

3.动脑总结

1》以下代码会得到怎样的运行结果?

 

2》你如何解释会得到这样的输出?

第一个:首先创建了父类对象parent,parent调用父类printValue方法,输出100。

第二个:然后创建了子类对象child,child调用子类printValue方法,输出200。

第三个:接着把子类对象赋值给父类对象,赋值后的parent.printValue();即相当于child.printValue();所以输出200。

第四个:虽然把子类对象赋值给父类对象,但被赋值后的父类对象对数据成员的操作依然是对父类的数据成员进行操作,并没有对子类数据成员进行操作,所以parent.myValue++;只是将父类的myValue值+1,而子类的myValue值并没有改变,所以 parent.printValue();输出200。

第五个:((Child)parent).myValue++;使用了强制类型转换,即结果是对子类的myValue+1,而parent已经被子类对象赋值,所以parent.printValue();输出201。

3计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

这个特性实际上就是面向对象“多态”特性的具体表现。

如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

如果子类被当作父类使用,则通过子类访问的字段是父类的!

 

posted @ 2017-11-09 16:48  鱼小妹闯天涯  阅读(121)  评论(0编辑  收藏  举报