1、方法覆盖
方法覆盖就是子类定义一个和父类同名的方法来覆盖父类的方法。当父类方法在某些子类中被覆盖后,通常是子类调用父类,并做一些额外的其它工作。
使用方法覆盖应注意下面一些事项:
不使用super而希望引用父类方法会导致无限的递归,因为子类方法实际上是在调用它自己。
当通过父类引用调用一个方法时,Java会正确地选择与那个对象对应的类的覆盖方法。对于父类提供的方法,子类可以覆盖它,但这不是必须的,即子类也可以使用一个方法的父类版本。
方法覆盖中,子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即与父类完全相同的方法名、返回l类型和参数列表。
子类可以添加字段,也可以添加方法或者覆盖父类中的方法。但继承不能去除父类中的任何字段和方法。
2、方法重载
方法重载是在自己的类内定义几个方法名相同但参数列表不同的过程。与上面讲的方法覆盖不同,方法覆盖是子类覆盖父类的方法,而方法重载是在自身一个类内进行定义的方法,只是定义的这些方法名相同但参数列表不同。
既然在一个类中出现了相同的方法名,或许就有人问了,那程序在调用这些方法时是怎样进行的。其实,当程序在调用这些方法时,编译器是通过区分它们的参数列表来进行区分的。例如,现在有两个重载的方法,有的方法参数列表有一个参数,而另外一个有两个参数,当程序调用这个方法时,编译器会通过查找你要调用的方法里面的参数个数来确定你要调用哪个方法。所以,如果在重载过程中发现有两个或两个以上方法的参数列表一致,编译器则会报错,因为它不能区分你到底要哪个方法。
Java中允许对任何方法重载。同时要注意,如果重载的两个方法中两个方法的名字和参数列表一致,但方法返回类型不一样,这种情况也会编译出错,因为这是不能区分重载方法的。
3、多态分为两种:
多态分为编译时的多态和运行时的多态。
编译时的多态是通过函数重载或运算符的重载来实现的。而运行时的多态是通过继承和虚函数来实现的,之所以称为运行时的多态是因为在程序执行之前,根据函数和参数还无法确定应该调用哪一个函数,而必须在程序的执行过程中,根据具体的执行情况才能动态地确定。
调用一个对象方法的机制:
编译器检查对象的声明类型和方法名。
编译器接着检查方法调用中的参数类型。如果编译器不能找到任何同参数类型匹配的方法,或者有多个方法都匹配转化后的参数类型,那么编译器会报告一条错误。现在编译器知道了需要调用的方法的名字和参数类型。
如果方法类型为private、static、final或者是一个构造器,那么编译器也会准确地知道应该调用哪个方法,这称作静态绑定。与此相反,靠隐式参数的实际类型来决定调用哪个方法叫做动态绑定,这必须发生在运行时。