前言:
比较基础的概念,只是做一道题突然对这一块的知识记得不是很牢固,一起复习一下。
Overriding:重写,覆盖(覆盖父类的方法)
Overloading:重载,以类以统一的方式去处理不同类型数据的一种手段,是多态的一种表现。
来看一题:选哪个不会出错? 会做的话就直接跳过这一篇吧(题源:牛客网)
class A{
public A foo(){
return this;
}
}
class B extends A{
public A foo(){
return this;
}
}
class C extends B{
____
}
A.public void foo(){}
B.public int foo(){return 1;}
C.public A foo(B b){return b;}
D.public A foo(){return A;}
1.重写:
- 发生在父类与子类中(继承类中)。
- 子类中方法与父类方法具有相同方法名,形参类型,顺序和个数,返回值类型(子类型)。
- 新方法将原有方法覆盖后,若需要调用父类中原有的方法,可使用super关键字。
- 重写方法的访问权限不能少于父类的被重写方法的访问权限。
- 重写方法的返回值类型应该比父类被重写方法返回值类型相同或者是它的子类型
- 构造方法不能被重写(构造方法必须和类名相同)
- private、static、final修饰的方法不能被重写
2.重载:
同名不同参,与返回值类型无关,与访问权限修饰符也无关。
- 发生在一个类中。
- 类中创建多个方法,具有相同的名字,但可以具有不同的参数个数,类型,顺序。
- 重载方法名要一样,参数类型和个数是不一样的,返回值类型也可以不同,不能以返回值类型作为重载区分标准。
- 构造方法也可以重载(多个构造方法)
3.总结:
重写 “两同两小一大”
- 方法名,形参列表相同。
- 返回类型,抛出异常应比父类方法小或相等。
- 子类方法访问权限应该比父类更大或相等。
重载
- 参数类型,个数,顺序至少有一个不一样
- 不能重载只有返回值不同的方法名(不能以返回值类型作为判断标准)
解答:
A 返回值与父类不一致,那么就不是重写,而方法名相同,只能是重载,但是重载的参数类型,个数,顺序必须有一个不同
B 和A一样
C 返回值类型和父类一样,由于参数不一样,则是重载。重载需要参数列表不同
D 返回的是啥玩意?
为什么这里会有对父类的方法重载?
因为重载是在一个类里的,但是由于继承的关系,
子类是继承了父类的方法的,而此时又对继承过来的方法进行重载。只不过是没有显示出来。
public class Test{
public static void main(String[]args){
B b = new B();
C c = new C();
b.foo();
c.foo(b);
c.foo();
}
}
class A{
public A11 foo(){
System.out.println("A类的foo方法");
return this;
}
}
class B11 extends A{
@Override
public A foo(){
System.out.println("B类的foo方法");
return this;
}
}
class C extends B{
public A foo(B b){
System.out.println("C类重载foo方法");
return b;
}
}
结论: 并没有重写foo方法,只不过是C类里与父类同名的foo方法。