关于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类里面的重载方法,再总结一遍,必须满足所有的条件
- 方法名一致
- 参数列表不一致,返回值不一致
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;
}
⚠️以下是错误的例子
重写的例子
我们现在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重写了父类的
- 无参doSomething方法
- selfEvaluation方法
那么,聪明的你,有没有发现什么呢?(重写的原则:两同两小一大)
- Son类重写的两个方法,方法名和参数列表均是一致的
- Son类的返回值是自己,而Son继承自Father,自然符合返回值要小于等于父类,同理,抛出的异常也是
- 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();
总结
重载和重写可以说是很很很基础的东西,可以说是随处可见啊,例如Arrays.sort方法就有这么多种重载形式了,而子类重写父类的方法也是很常见的,所以这个知识点一定要掌握