重载(两同一不同)

两同:发生在同一个类中,方法名相同
一不同:形参列表不同
方法返回值类型、访问修饰符,与重载无关
重载与重写的区别 - 图1

  1. public class Overload {
  2. public void test(){
  3. System.out.println("无参数");
  4. }
  5. public void test(String str){
  6. System.out.println("重载test方法,有参数:"+str);
  7. }
  8. public static void main(String argu[]){
  9. Overload ol = new Overload();
  10. ol.test();
  11. ol.test("hello");
  12. }
  13. }

程序运行结果:
image.png
方法返回值类型与重载无关的原因是:
对于int test()和void test()两个方法,如果调用int result = test(),系统可以识别是调用返回值类型为int的方法,但java调用方法可以忽略方法的返回值,如果直接调用test(),系统无法判断是调用哪个方法。

重写(两同两小一大)

发生在父子类中,两同两小一大
两同:方法名相同,形参列表相同;
两小:子类的**返回值类型要比父类的返回值类型要小或相等,子类方法声明抛出的异常类要比父类声明抛出的异常类**更小或相等;
一大:子类的方法的**访问权限应比父类的方法的访问权限更大或相等(当父类具有private访问权限时,子类无法访问父类方法);
1.public:任何类都可以访问
2.protected:在同一个包中的所有类可以访问,以及该类的子类(不同包)
3.default:同一个包中的所有类
4.private:只能在本类中访问
重载与重写的区别 - 图3
image.gif

  1. public class Bird {
  2. public void fly(){
  3. System.out.println("我能飞...");
  4. }
  5. }
  1. public class Ostrich extends Bird{
  2. public void fly(){
  3. System.out.println("我能跑...");
  4. }
  5. public static void main(String argu[]){
  6. Ostrich os = new Ostrich();
  7. os.fly();
  8. }
  9. }

程序运行结果:
image.png

当子类重写父类的方法后,**子类的对象将无法访问父类被重写的方法,但可以在子类的方法中使用super(实例方法)或者父类的类名作为调用者来调用父类中被重写的方法**。

  1. public class Ostrich extends Bird{
  2. public void fly(){
  3. super.fly();
  4. System.out.println("我能跑...");
  5. }
  6. public static void main(String argu[]){
  7. Ostrich os = new Ostrich();
  8. os.fly();
  9. Bird b = new Bird();
  10. b.fly();
  11. }
  12. }

程序运行结果:
image.png