Java中的重载和重写

关于Java中的重载与重写,每一个java人肯定都学习过,这里就再梳理一遍,加深一下印象,忘记的时候拿出来看一看就好了
重载与重写的区别
重载发生在同一个类里面,同一个方法,拥有不同的参数列表,不同的返回值类型;可以有不同的访问权限
重写发生在子类上,也是针对同一个方法,只不过参数列表和顺序必须与父类完全一致,返回值类型小于等于父类,抛出的异常也要小于父类,访问修饰符要大于等于父类
方法的重写要遵循两同两小一大,解释一下
  • 两同,代表方法名和参数列表相同
  • 两小,代表返回值类型、抛异常的范围要小于或者等于父类
  • 一大,代表重写方法的访问权限要大于或者等于父类
    • 既然讲到了访问权限,那么久索性列出来对比一下吧,一下是访问权限由大到小
      • public > protected > 默认 > private
重载的例子
创建一个Father类,权当就是卖瓜的
public class Father { /** * 卖瓜的人是谁 */ private String name; /** * 状态 */ private Integer status; /** * 成本 */ private Double cost; public Father() { }public Father(Integer status, Double cost) { this.status = status; this.cost = cost; } }

以下是Father类里面的重载方法,再总结一遍,必须满足所有的条件
  1. 方法名一致
  2. 参数列表不一致,返回值不一致
public void doSomething() { System.out.println("大家好,我是卖瓜的"); }public void doSomething(String name) { System.out.println("大家好,我是卖瓜的,我的名字叫:" + name); }public double doSomething(double money) { System.out.println("卖瓜营业额:" + money); final double profit = money - this.cost; System.out.println("除去成本,还剩:" + money); return profit; }

??以下是错误的例子
  1. 虽然返回值不一致,但是参数列表却是一样的,达咩
    Java中的重载和重写
    文章图片

  2. 返回值不一致,参数列表也不同,但是方法名却不一致,这不是重载,而是另外一个方法了,也不行
    Java中的重载和重写
    文章图片

重写的例子
我们现在Father类添加上一个方法
/** * 来自父亲的感慨 * @return * @throws Exception */ protected Father selfEvaluation() throws Exception { System.out.println("父亲正在感慨中...."); throw new Exception("在感慨的时间里,被偷了两个瓜"); }

new一个Son类,继承Father,Son不想卖瓜,想自己捣鼓点什么干
public class Son extends Father {@Override public void doSomething() { System.out.println("我父亲是卖瓜的,但我不想卖瓜,我想干点其他的"); }@Override public Son selfEvaluation() throws IllegalAccessException { System.out.println("儿子正在感慨中...."); throw new IllegalAccessException("在感概的时间里,被老板抓住了,扣了20块钱工资"); } }

我们注意到,Son重写了父类的
  1. 无参doSomething方法
  2. selfEvaluation方法
那么,聪明的你,有没有发现什么呢?(重写的原则:两同两小一大)
  1. Son类重写的两个方法,方法名和参数列表均是一致的
  2. Son类的返回值是自己,而Son继承自Father,自然符合返回值要小于等于父类,同理,抛出的异常也是
  3. Son类的访问修饰符是public,访问权限是最大的,而父类的访问修饰符是protected,所以也满足重写方法的访问权限要大于或者等于父类
结果
Father father = new Father(1,10D); father.doSomething(); father.doSomething("码农Amg"); father.doSomething(30D); father.selfEvaluation(); System.out.println("----------------------------------"); Father son = new Son(); son.doSomething(); son.selfEvaluation();

Java中的重载和重写
文章图片

Java中的重载和重写
文章图片

总结
重载和重写可以说是很很很基础的东西,可以说是随处可见啊,例如Arrays.sort方法就有这么多种重载形式了,而子类重写父类的方法也是很常见的,所以这个知识点一定要掌握
【Java中的重载和重写】Java中的重载和重写
文章图片

    推荐阅读