重载(两同一不同)
两同:发生在同一个类中,方法名相同
一不同:形参列表不同
方法返回值类型、访问修饰符,与重载无关
public class Overload {
public void test(){
System.out.println("无参数");
}
public void test(String str){
System.out.println("重载test方法,有参数:"+str);
}
public static void main(String argu[]){
Overload ol = new Overload();
ol.test();
ol.test("hello");
}
}
程序运行结果:
方法返回值类型与重载无关的原因是:
对于int test()和void test()两个方法,如果调用int result = test(),系统可以识别是调用返回值类型为int的方法,但java调用方法可以忽略方法的返回值,如果直接调用test(),系统无法判断是调用哪个方法。
重写(两同两小一大)
发生在父子类中,两同两小一大
两同:方法名相同,形参列表相同;
两小:子类的**返回值类型要比父类的返回值类型要小或相等,子类方法声明抛出的异常类要比父类声明抛出的异常类**更小或相等;
一大:子类的方法的**访问权限应比父类的方法的访问权限更大或相等(当父类具有private访问权限时,子类无法访问父类方法);
1.public:任何类都可以访问
2.protected:在同一个包中的所有类可以访问,以及该类的子类(不同包)
3.default:同一个包中的所有类
4.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 argu[]){
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 argu[]){
Ostrich os = new Ostrich();
os.fly();
Bird b = new Bird();
b.fly();
}
}
程序运行结果: