重载(Overload)是编译时的多态,因为根据调用传参的类型、数量便可决定调用的是哪个重载方法,因此并不需要推迟到运行时去决定调用哪个方法,所以它是编译期就能决定的。
重写(Override,又称覆盖)是运行时的多态,我们都知道重写的前提是类继承,重写的方法的名称、参数必须跟被重写的方法一致(异常列表、返回结果及访问修饰符等限制这里不赘述),因此无法通过方法参数决定调用的是哪个子类或是父类的方法。只能在运行时通过传入的对象来动态决定。
总结:不管是重载(Overload)还是重写(Override),都是实现Java动态机制的一种手段。
借用下面一个兄弟的看法,思路很清晰!!!
多态分为 编译时多态 和 运行时多态 。其中 编辑时多态是静态的 , 主要是指方法的重载 ,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而 运行时多态是动态的 ,它是 通过动态绑定来实现的 ,也就是我们所说的多态性。
方法重写一般在继承中,子类重写父类的方法,既然是重写一遍,那么方法名和参数部分一定是相同的。只是实现的功能不同。
访问修饰符范围要大于等于父类,因为子类重写父类方法是为了扩展父类的功能
返回值类型如果是基本数据类型和void类型,则必须相同。引用数据类型的话范围要小于等于父类
方法重载一般体现为构造器的有参无参,主要体现在方法参数的类型和数量不同,方法名相同,与访问修饰符和返回值类型都是无关的,