方法的重载:在一个类中的两个或两个以上的方法,他们方法名相同但是参数列表不同,这种方式称为方法的重载,方法的重载是实现多态性的方式之一。
参数列表不同指的是参数的个数不同或相同的个数但顺序不同或者类型不同,方法重载时返回值类型可以不同,但是仅仅是返回值类型不同的话不可以。
java在调用方法的时候,如果精确匹配没有对应的方法,会自动转换匹配相应的方法,例如,如果没有int类型的参数,但是有一个double类型的参数的同名方法,在调用该方法时如果传入int类型的参数,则不会报错,而是把int自动转换成double类型匹配double类型参数的方法。但是,这种情况也只是在精确匹配无法匹配的情况下才会发生,如果存在int类型参数的此方法,传int类型参数时则不会调用double类型的。
重载的价值在于它允许相关的方法用同一个名字来访问,没有什么规定要求重载的方法之间必须有关系,但是实际上如果真的是没有任何关系的方法就不应该用重载实现,而是应该用新的方法,否则的话就违背了重载的初衷。
普通方法可以重载,构造方法也一样可以重载。不管是普通方法还是构造方法,里边传递的参数都是既可以是简单类型也可以是对象。简单类型直接传值,而对象传递的则是引用。
重载遵循“编译期绑定”,即在编译时根据参数确定调用哪一个方法。
方法的重写:在子类继承父类的时候,子类中与父类方法名和参数列表完全一样,但是其他地方有不同,这种方式叫做重写。重写只发生在继承的时候,如果一个类不能被继承,则也不能被重写。方法的重写也称为方法的覆盖。
重写遵循两同两小一大的原则,即:方法名相同,参数列表相同;子类抛出的异常要小于或等于父类抛出的异常,并且不能抛出父类没有的异常,子类的返回值类型要小于或等于父类的返回值类型;子类的访问权限要大于或等于父类的访问权限。
除开上述原则之外,还要知道的是被标识为final的方法不能被重写,不能被继承的方法不能被重写,例如private修饰的方法。
被子类对象重写过的方法,在程序运行时,根据对象的类型不同(而不是引用类型的不同)来决定调用哪个版本的方法,等号之前的是引用类型,new之后的是对象类型。
重写遵循“运行时绑定”,即在运行的时候根据引用指向的实际对象类型来决定调用的方法版本。