重写Override
重写指的是在子类中定义的某方法的名称、参数列表、返回值与其父类完全相同,我们说该方法被重写 (Override)。
例如:
class Device
{
int serialnr;
public
final
void help() {….}
不可以被重写
public void setSerialNr(int n) {
serialnr = n;
}
}
class Valve extends Device
{
Position s;
public void setSerialNr(int n) {
...
}
}
这里Valve类继承了Device类,子类中的方法setSerialNr就是对父类中方法setSerialNr的重写。
再举一个例子:
class A
{
int a;
void m1(){….}
}
}
class B extends A
{
int b;
void m2(){….}
void m1(){….}
重写
}
}
有方法调用如下:
A x = new A();
x.m1();
或
A x = new B();
x.m1();
要注意,到底是调用父类还是子类的方法是
在运行时根据
new后面的类决定的。
父类型中被重写的函数体不为空:意味着对其大多数子类型来说,该方法是可以被直接复用的。
如果父类型中的某个函数实现体为空,意味着其所有子类型都需要这个功能,但各有差异,没有共性,在每个子类中均需要重写。
重写之后,可以利用super()复用父类型中函数的功能,并对其进行扩展。
重载Overload
重载:多个方法具有同样的名字,但有不同的参数列表,返回值类型也可能不同。方便client调用,用不同的参数列表,调用同样的函数。
重载
MUST
要有不同的参数列表!!!
CAN
有相同/不同的返回值类型
CAN
相同/不同的public/private/protected
CAN
处理异常不同
例如已有方法:
public void changeSize(int size,
String name, float pattern) { }
下列哪些是对方法的重载?
–
public void changeSize(int size, String name) { }√
–
public int changeSize(int size, float pattern) { }√
–
public void changeSize(float pattern, String name){ }√
–
public void changeSize(int length, String pattern, float
size){ }×
虽然参数命名不同,但参数类型和数目完全相同,即参数列表相同!
–
public boolean changeSize(int size, String name, float
pattern) { }×
虽然返回值类型不同,但是没满足充要条件,参数列表相同了!