重载(两同一不同)
两同:发生在同一个类中,方法名相同
一不同:形参列表不同
方法返回值类型、访问修饰符,与重载无关
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();}}
程序运行结果:
