Java重写和重载差异


一、重写Override

  • 重写是子类对父类的允许访问方法的实现过程进行重新编写,返回值和形参不变。外壳不变,核心重写!
  • 重写好吃在于子类可以根据需要,定义特定于自己的行为,也就是说子类根据需要实现父类的方法。
  • 重写方法不可以抛出新一场或者比被重写方法更加宽泛的异常Exception;例如父类方法申明了一个检查异常IOexception,但是重写这个该方法不可以给出exception异常,这是因为exception是IOexception的父类!
class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}
 
class Dog extends Animal{
   public void move(){
      System.out.println("狗可以跑和走");
   }
}
 
public class TestDog{
   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象
 
      a.move();// 执行 Animal 类的方法
 
      b.move();//执行 Dog 类的方法
   }
}

在上述例子中,b属于animal类型,运动的是Dog的move方法,由于在编译阶段,只是检查参数的引用类型,
不过在运行时,Java虚拟机JVM指定对象的类型并且运行该对象的特定方法。
给出如下例子:

class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}
 
class Dog extends Animal{
   public void move(){
      System.out.println("狗可以跑和走");
   }
   public void bark(){
      System.out.println("狗可以吠叫");
   }
}
 
public class TestDog{
   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象
 
      a.move();// 执行 Animal 类的方法
      b.move();//执行 Dog 类的方法
      b.bark();
   }
}

该程序将给出异常,b的引用类型animal没有bark方法。


二、方法的重写规则

  • 参数列表和被重写的方法参数列表必须完全相同。
  • 返回类型和被重写方法的返回类型可以不一样,但是必须是父类返回值的派生类。
  • 访问权限不能低于父类重写方法,若一个父类方法是public,则子类重写该方法不能声明为protected!
  • 父类成员方法仅可以被其子类重写。
  • 声明为final的方法不能被重写。
  • 声明为static的方法不可以被重写,但是能够被再次声明。
  • 子类和父类同一个包中,那么子类可以重写父类所有方法,除了private和final的方法。
  • 子类和父类不是同一个包中,那么子类只能重写父类声明为public和protected的非final方法。
  • 重写方法能够给出任何非强制异常,无论被重写的方法是否给出异常,但是,重写方法不能给出新的强制性异常,或者比被重写一场更广泛的异常,反之则可以。
  • 构造方法不能被重写。
  • 若不能够extends一个类,则不能重写该类方法!

三、Super的关键字使用

若需要子类调用父类重写方法时,需要加super关键字。

class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}
 
class Dog extends Animal{
   public void move(){
      super.move(); // 应用super类的方法
      System.out.println("狗可以跑和走");
   }
}
 
public class TestDog{
   public static void main(String args[]){
 
      Animal b = new Dog(); // Dog 对象
      b.move(); //执行 Dog类的方法
 
   }
}

四、重载Overload

重载是在一个class中,方法名字相同,参数不同、返回类型可以相同也可以不同
每一个重载的方法,或者构造函数都必须有一个独一无二的参数类型列表。
重载规则:

  1. 被重载的方法必须改变参数列表,参数个数或者类型不一样。
  2. 被重载方法可以改变返回类型。
  3. 被重载方法可以改变访问修饰符。
  4. 被重载方法可以声明为新的或者更为广泛的异常审查。
  5. 方法可以在同一个class中或者同一个子类中被重载。
  6. 无法以返回值类型作为重载函数的区分标准。
public class Overloading {
    public int test(){
        System.out.println("test1");
        return 1;
    }
 
    public void test(int a){
        System.out.println("test2");
    }   
 
    //以下两个参数类型顺序不同
    public String test(int a,String s){
        System.out.println("test3");
        return "returntest3";
    }   
 
    public String test(String s,int a){
        System.out.println("test4");
        return "returntest4";
    }   
 
    public static void main(String[] args){
        Overloading o = new Overloading();
        System.out.println(o.test());
        o.test(1);
        System.out.println(o.test(1,"test3"));
        System.out.println(o.test("test4",1));
    }
}

总结

方法重写和重载是Java多态性的不同表现;重写是父类和子类之间多态性的一种表现,重载可以看作是多态的具体表现形式。

  • (1) 方法重载是一个类中定义了多个方法名相同,但是参数不同或者类型不同或者次序不同,称之为重载
  • (2) 方法重写则是在子类存在方法和父类方法名相同,而且参数个数和类型一样,返回值一样的方法,称之为重写
  • (3) 方法重载是一个类的多态性表现,重写则是父类和子类的多态性表现。
    重写和重载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值