重载:
要求:两同一不同
两同:发生在同一个类中,方法名相同;
一不同:形参列表不同;
方法返回值类型、访问修饰符,与重载无关;
例如:
public class Overload {
public void test(){
System.out.println("无参数");
}
public void test(String str){
System.out.println("重载test方法,有参数:" + str);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Overload ol = new Overload();
ol.test();
ol.test("hello");
}
}
编译运行上面代码,运行结果为:
方法返回值类型与重载无关的原因是:
对于int test()与void test() 两个方法,如果调用int result = test();,系统可以识别是调用返回值类型为int的方法,但java调用方法时可以忽略方法的返回值,如果直接调用test();,系统无法判断是调用哪个方法。
重写:
要求:发生在父子类中,两同两小一大
两同:方法名相同,形参列表相同;
两小:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
一大:子类的方法的访问权限应比父类的方法的访问权限更大或相等(当父类方法具有private访问权限时,子类无法访问父类方法);
例如:
public class Bird {
public void fly(){
System.out.println("我能飞...");
}
}
public class Ostrich extends Bird{
public void fly(){
System.out.println("我能跑...");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Ostrich os = new Ostrich();
os.fly();
}
}
编译运行上面代码,运行结果为:
当子类重写父类的方法后,子类的对象将无法访问父类被重写的方法,但可以在子类方法中使用super(实例方法)或者父类的类名作为调用者来调用父类中被重写的方法。
public class Ostrich extends Bird{
public void fly(){
super.fly();
System.out.println("我能跑...");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird b = new Bird();
b.fly();
Ostrich os = new Ostrich();
os.fly();
}
}
编译运行上面代码,运行结果为: