我认为一个软件开发初学者在
Java
编程语言中最难以学习的就是面向对象的概念,尤其以面向父类,面向接口编程尤为困难。作为学术研究人员,我翻阅了很多
Java
书籍,试图来找寻解决上述问题的方法。但是目前市场上的书籍对于刚才这些问题的阐述都比较肤浅,很难讲述给学员,因此我自己对面向父类,面向接口编程的概念作出了总结,并在多个班级中进行了实践,结果还是相当不错的,作为学习,我将自己总结的原则写于博客中,希望给更多的软件学习者提供帮助。
在面向对象的学习过程中,我为学员提出的总结性原则是:“左声明右实现”,那么如何来理解这句话呢?我们来看一个我上课一直沿用的案例:
package
cn.softworks.oojava.demo;
/***
坦克类,它是所有坦克的父类*/
class
Tank {
publicvoid
printTank()
{
System.
out
.println(
"This is Tank"
);
}
}
/***
M1
坦克类,它继承了坦克父类*/
class
M1Tank
extends
Tank
{
//
该方法重写了父类中的printTank
publicvoid
printTank()
{
System.
out
.println(
"This is M1Tank"
);
}
//M1Tank
自己的方法
publicvoid
showName()
{
System.
out
.println(
"M1Tank"
);
}
}
/***
虎式坦克类,它继承了坦克父类*/
class
TigerTank
extends
Tank
{
//
该方法重写了父类中的printTank
publicvoid
printTank()
{
System.
out
.println(
"This is TigerTank"
);
}
}
/***
坦克类的测试类
*/
publicclass
ClassMain {
publicstaticvoid
main(String args[]) {
Tank
tank
=
new
TigerTank();
//
最终的输出结果为:This is TigerTank
tank.printTank();
}
}
|
以上代码的最终运行结果是:
This is TigerTank
我们再来看看“左声明右实现”这句话,作为以下语句而言:
Tank
tank
=
new
TigerTank();
|
等号的左侧是
Tank tank
,而等号的右侧是
new TigerTank(),
根据“左声明右实现”的原则可以肯定左侧的
Tank tank
代码只是用来告诉编译器,在
Tank
类中拥有
printTank
方法,它只是对
printTank
方法进行了一次声明并没有真正实现
(
开辟空间
)
,而真正的实现是在右侧的,
new TigerTank()
明确告诉了编译器,左侧的
printTank
方法由
TigerTank
来实现,因此最终使用的是
TigerTank
类中的
printTank
方法而并非是
Tank
类中的
printTank
方法,打印结果也就理所当然的为
This is TigerTank
了。
如果我们将代码写成以下形式:
Tank
tank
=
new
M1Tank();
|
最终的运行结果为:
This is M1Tank
。
根据“左声明右实现”的原则可以理解为
Tank tank
中所声明的
printTank
方法应该有
M1Tank()
来实现,因此最终使用的是
M1Tank
中的
printTank
方法。
请同学们注意:以上这个原则可以在任何地方使用,包括在接口和抽象类中,软件初学者可以以这个原则来理解面向父类的编程方法。
请同学用“左声明右实现”原则来考虑以下代码的运行结果:
Tank
tank
=
new
M1Tank();
tank.showName();
|
答案为:编译出错,错误提示:没有
showName
这个方法,
请同学们
考虑一下这是为什么呢 :-) ?