关于构造器内部的多态方法的行为
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中当子类拥有和父类同样的函数,当通过这个父类对象的引用调用这个函数的时候,调用到的是子类中的函数。
其他回答
暂无其它回答!