方法签名
方法签名=方法名+参数列表
一个类中不允许出现两个方法签名完全相同的方法
重载overload
发生在同一类中,方法名相同,参数列表不同,称为方法的重载
依据参数类型来绑定对应的重载方法
protected void delete(int x,int y) {}
protected void delete(int a,int b) {} //编译错误,参数列表的参数类型相同
protected void delete(int x) {} //编译通过,参数列表不同
protected void delete(int x,String s) {} //编译通过,参数列表类型不同
protected void delete(String s,int x) {} //编译通过,参数列表类型不同,虽然与上一条参数类型相同但顺序不同
protected int delete(int x,int y) {return 1;} //编译错误,参数列表的参数类型相同,方法签名未涉及到返回值类型
public String delete(int x,String y) {return y;}//编译通过,证明与返回类型无关
void delete(int x,String s) //编译通过
public void delete(int x,String s){} //编译通过,结合上一条证明与修饰词无关
方法重写overwrite
方法的覆盖----子类重写父类方法
-
发生在父子类中,方法签名相同(方法名相同,参数列表也相同),方法体不同
-
重写的方法被调用时,看new出来的对象是谁(new谁就调用谁的)
-
重写需遵循"两同两小一大"原则
3.1)方法名相同+参数列表相同
3.2)子类方法的返回值类型要小于或等于父类方法的返回值类型
注:若父类方法是void,则子类重写方法必须也是void 若父类方法是基本类型,则子类重写方法返回值必须相同 若父类方法是引用类型,则子类重写方法返回值小于或等于父类 子类方法所抛出的异常类型要小于或等于父类方法抛出的异常
3.3)子类方法的访问权限要大于或等于父类方法的访问权限
★注意:静态方法不存在重写与应用类型无关;
//父类
public class A {
protected void name(String name) {
System.out.println("父类");
}
}
//子类
public class B extends A{
@Override
protected void name(String name) {
}
//名字相同,参数列表不同
@Override
protected void name() {
}
//参数列表相同,名字不同
@Override
protected void name1(String name) {
}
//父类方法中返回值为void,所以重写方法也一定是void
@Override
protected int name(String name) {
return 1;
}
//父类的访问权限为protected,子类的访问权限要大于父类,即public,此处为默认
//public>protected>默认>private
//所以private也不对只有public正确
@Override
void name(String name) {
}
}
重载和重写的区别
重载 | 重写 |
---|---|
发生在同一个类中 | 发生在父子类中(继承关系) |
方法名相同,参数列表不同,方法体不同 | 方法名相同,参数列表相同,方法体不同 |
与返回类型无关 | 与返回类型有关 |
遵循的是"编译期绑定",依据参数来绑定方法 | 遵循的是"运行期绑定",依据对象类型来调用方法 |