Java的父子关系之动态绑定

/ 0评 / 0

当父类和子类存在相同名字的method的时候,发生覆盖(Override)。

而向上造型(Upcasting),即父类引用子类对象。换句话说,因为子类继承了父类的全部可见信息,我们完全可以把子类对象改造为一个父类对象。

也可以说是将一个子类的对象赋给父类的对象变量(管理者),这是可行的,反过来则会发生编译错误。

当父类指向子类的时候,同名方法默认优先调用子类的方法而非父亲类的方法,即子类的方法覆盖父类的方法。

父类有而子类没有的方法,则继承从而使用父类的定义。(依然相当于调用子类的方法)

因为管理者是父类,所以这个对象相当于是父类的对象,所以它失去了子类独有的(父类没有的)方法,调用会报错。

另外,特别的,当方法为static的时候,只根据对象声明的类型进行调用选择,不会默认进行动态绑定,父子关系不影响选择。

这被称作动态绑定,动态绑定,即Dynamic method dispatch。Java的编译默认进行动态绑定而非静态绑定。

upcasting in java

Example

class Game
{
 public void type()
 {  System.out.println("Indoor & outdoor"); }
}

Class Cricket extends Game
{
 public void type()
 {  System.out.println("outdoor game"); }

 public static void main(String[] args)
 {
   Game gm = new Game();
   Cricket ck = new Cricket();
   gm.type();
   ck.type();
   gm=ck;      //gm refers to Cricket object
   gm.type();  //calls Cricket's version of type
 }
}

Output :

Indoor & outdoor 
Outdoor game
Outdoor game

Notice the last output. This is because of gm = ck; Now gm.type() will call Cricket version of type method. Because here gm refers to cricket object.

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注