关于构造器内部的多态方法的行为

原问题:关于构造器内部的多态方法的行为
分类:编程开发 > 最后更新时间:【2017-07-26 19:11:14】
问题补充:

eg:

public class Father{

public void eat(){

System.out.prinln("Father");

}

public Father(){

eat();

}

}

public class Son extends Father{

public void eat(){

System.out.println("Son"); }

public static void main(String[] args){

new Son();

}

}

输出结果:Son

为什么父类构造器中的eat()是被子类重写的eat()?

最佳答案

所谓的【多态】,作用是

把不同的子类对象都当作父类来看,

可以屏蔽不同子类对象之间的差异,

写出通用的代码,做出通用的编程,以适应需求的不断变化。

赋值之后,父类型的引用

就可以根据当前赋值给它的子对象的特性以不同的方式运作。

也就是说,父亲的行为像儿子,

而不是儿子的行为像父亲。

举个例子:

从一个基类中派生,响应一个虚命令,产生不同的结果。

比如从某个基类派生出多个子类,

其基类有一个虚方法eat,

然后其子类也有这个方法,但行为不同,

然后这些子类对象中的任何一个可以赋给其基类对象的引用,

或者说将子对象地址赋给基类指针,

这样其基类的对象就可以执行不同的操作了。

举例:

public class mainTest
{
public static void main(String[]fuzi)
{
fu f1 = new z1();
fu f2 = new z2();
fu f = new fu();
f.eat();
f1.eat();
f2.eat();
/*可以发现
* 同样的fu类型的对象
* f、f1和f2
* 会有不同的eat表现,
* 因此会称其为【多态】。
* */
}
}
class fu
{
public void eat()
{
System.out.println("eat_0");
}
}
class z1 extends fu
{
public void eat()
{
System.out.println("eat_1");
}
}
class z2 extends fu
{
public void eat()
{
System.out.println("eat_2");
}
}

实际上你是在通过其基类的引用来访问其子类对象的,

你要做的就是一个赋值操作。

使用继承性的结果就是当创建了一个类的家族,

在认识这个类的家族时,

就是把子类的对象当作基类的对象,

这种认识又叫作upcasting(向上转型)。

这样认识的重要性在于:

我们可以只针对基类写出一段程序,

但它可以适应于这个类的家族,

因为编译器会自动找出合适的对象来执行操作。

这种现象又称为多态性。

而实现多态性的手段又叫称动态绑定(dynamic binding)。

简单的说,

建立一个父类对象的引用,

它所指对象可以是这个父类的对象,

也可以是它的子类的对象。

java中当子类拥有和父类同样的函数,
当通过这个父类对象的引用调用这个函数的时候,调用到的是子类中的函数。
最佳答案由网友  jariii  提供
公告: 为响应国家净网行动,部分内容已经删除,感谢网友理解。
6

分享到:

其他回答

暂无其它回答!

    推荐