重写
-
发生在父子类中,方法名相同,参数列表相同
-
重写方法被调用时,看对象的类型
lass 餐馆{
void 做餐(){ 做中餐 }
}
//1)我还是想做中餐--------------不需要重写
class Aoo extends 餐馆{
}
//2)我想改做西餐----------------需要重写
class Aoo extends 餐馆{
void 做餐(){ 做西餐 }
}
//3)我想在中餐基础之上加入西餐----需要重写(先super中餐,再加入西餐)
classs Aoo extends 餐馆{
void 做餐(){
super.做餐();
做西餐
}
}
重写需遵循"两同两小一大"原则:----一般都是一模一样的
两同:
-
方法名相同
-
参数列表相同
两小:
-
派生类方法的返回值类型小于或等于超类方法的
-
void和基本类型时,必须相等
-
引用类型时,小于或等于
-
派生类方法抛出的异常小于或等于超类方法的
-
//超类大,派生类小
class Coo{
void show(){}
double test(){ return 0.0; }
Student say(){ return null; }
Person sayHi(){ return null; }
}
class Doo extends Coo{
//int show(){ return 1; } //编译错误,void时必须相等
//int test(){ return 0; } //编译错误,基本类型时必须相等
//Person say(){ return null; } //编译错误,引用类型时必须小于或等于
Student sayHi(){ return null; } //正确
}
一大:
-
派生类方法的访问权限大于或等于超类方法的
重载
-
发生在同一类中,方法名相同,参数列表不同
-
编译器在编译时会根据方法的签名自动绑定调用
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(long x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(float x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(double x) {
synchronized (this) {
print(x);
newLine();
}
}
重写与重载的区别?
-
重写(override):发生在父子类中,方法名相同,参数列表相同
-
重载(overload):发生在同一类中,方法名相同,参数列表不同