当父类和子类存在相同名字的method的时候,发生覆盖(Override)。
而向上造型(Upcasting),即父类引用子类对象。换句话说,因为子类继承了父类的全部可见信息,我们完全可以把子类对象改造为一个父类对象。
也可以说是将一个子类的对象赋给父类的对象变量(管理者),这是可行的,反过来则会发生编译错误。
当父类指向子类的时候,同名方法默认优先调用子类的方法而非父亲类的方法,即子类的方法覆盖父类的方法。
父类有而子类没有的方法,则继承从而使用父类的定义。(依然相当于调用子类的方法)
因为管理者是父类,所以这个对象相当于是父类的对象,所以它失去了子类独有的(父类没有的)方法,调用会报错。
另外,特别的,当方法为static的时候,只根据对象声明的类型进行调用选择,不会默认进行动态绑定,父子关系不影响选择。
这被称作动态绑定,动态绑定,即Dynamic method dispatch。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.