重载
在同一个类中,如果同名的方法,具有不同的参数类型、或者参数数量、或者参数顺序、或者返回值类型,都会被视为重载。返回值类型可以相同也可以不相同,但是参数列表一定要有所不同。
重写
在子类或者接口中,与父类同名的方法具有与父类相同的参数列表、返回值类型,视为方法的重写,且不能比父类方法的作用域更小。(父类声明protect,那么子类重写必须声明protect或者public)
对比
对比 | 重载 | 重写 |
---|---|---|
方法名 | 一定相同 | 一定相同 |
参数列表 | 一定有所差异 | 一定相同 |
返回值类型 | 可以不相同 | 一定相同/兼容 |
多态的实现 | 编译期 | 运行期 |
发生 | 同一类之内 | 父子类、接口与实现类 |
异常 | 可以修改 | 不能抛出更广或新的异常 |
作用域 | 可以修改 | 不能比原方法作用域小 |
使用 | 根据传入参数类型使用 | 根据对象使用 new什么就用什么 |
示例
public class father {
public void pub_test(){System.out.println("father public test");}
}
public class son{
public void pub_test(){System.out.println("son普通方法");}
}
public static void main(String[] args) {
father f=new son();
f.pub_test();
father fa=new father();
fa.pub_test();
son s=new son();
s.pub_test();
}
输出:
son普通方法
father public test
son普通方法
注意事项
- static方法不能重写(或者说不叫做重写)
- private修饰的方法不能被重写(或者说不叫做重写)
private方法只能是在该类内部使用,如果是子类在父类里面进行继承,并且在父类中开启主线程的情况下,是可以进行访问的,但是此时左父右子,private方法是视为各自私有的,不会被重写,也不会被有限调用
public class outer {
private void pri_test(){System.out.println("outer pri test");}
public static void test(){ System.out.println("outer static method"); }
static class inner extends outer {
private void pri_test(){System.out.println("inner pri test");}
public static void test(){ System.out.println("inner static method"); }
}
public static void main(String[] args) {
outer o=new inner();
o.pri_test();
o.test();
inner in=new inner();
in.pri_test();
in.test();
}
}
输出:
outer pri test
outer static method
inner pri test
inner static method