方法的重写和重载都是实现多态的方式,重载实现的是编译时多态,重写实现的是运行时多态。
1.方法重载(overload):在同一个类中,方法名相同,参数列表(类型不同,顺序不同,个数不同)不同,跟返回值类型无关,就构成方法重载
方法重载的规则: 方法名一致,参数列表(类型不同,顺序不同,个数不同)不同。重载跟返回值类型无关可以抛出不同的异常,有不同的修饰符。2.方法重写(override :也叫方法覆盖,在子类和父类两个类中,方法名相同,参数列表相同,返回值类型相同,就构成方法重写 。
方法名相同,参数列表相同返回值类型相同不能比父类抛出的更多的异常。例如:父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。访问权限不能比父类更严格。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。构造方法不能重写,声明为final和static的方法都不能被重写,但声明为static的方法可以被再次声明。2、为什么函数不能根据返回值类型来区分重载?
因为在调用方法时,不能指定返回值类型,编译器不知道你要调用哪个函数。
例:
public int max(int a,int b) { return a; } public float max(int a,int b) { return a; }
当调用max(1,2)时,无法确定调用的是哪一个。
方法的返回值类型只是作为函数运行后的一个“状态”,他是保持方法调用者通信和被通信的关键,并不能作为某个方法的“标识”。