回顾一下,我们已经知道了什么面向对象的三大特性, 还有不理解的同学,建议仔细阅读 java基础—封装、继承、多态,跟着里面的案例进行敲,细细揣摩,每遍都会有不同的收货
接下来我们来看两个 重点概念,重写跟重载,也是面试环节的重点讨论对象
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写
也就是说:重写就是子类去重新写父类可以给你访问的方法,你的方法跟父类的方法名字,返回值,参数类型一模一样,外部的基本结构不变,方法里面的核心,逻辑内容自己重新写
比如:
父类 Animal 的方法
class Animal{
public void sleep(){
System.out.println("动物会睡觉");
}
}
子类 猫 Cat
class Cat extends Animal {
public void sleep(){
System.out.println("猫会睡觉");
}
}
这边 Cat 类就重写了父类 Animal 的sleep方法,跟着父类一样,无返回值void, 无参数,核心逻辑重新写
这里我们也可以发现,重写也是多态的实现方式之一
重写也可以称作是方法覆盖,看你怎么好记了。。
总结一下:
重写(方法覆盖)也具有一定的条件,当程序具备这些条件的时候就能构成重写:
不用说, 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;
接着就是我们说的,覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参数列表;
注意事项:
私有的方法不能被继承,所以不能被覆盖;(上一章介绍继承的时候我们也说过了)
构造方法不能被继承,所以也不能被覆盖;
覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高
覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少
方法覆盖只是和方法有关,和属性无关;
静态方法不存在覆盖(不是静态方法不能覆盖,是静态方法覆盖意义不大);
以上注意事项,面试也经常会提问,还需要多下功夫,理解记忆
2. 什么是重载(Overload)?
关于什么是重载?这边我们先不去研究他,先来看一个没有使用重载的代码例子
这边有一个需求: 分别计算 int,double,long 这三种类型的和
我们是这么写的
public static int sumInt(int a , int b){
return a + b;
}
public static long sumLong(long a , long b){
return a + b;
}
public static double sumDouble(double a , double b){
return a + b;
}
public static void main(String[] args) {
int x1 = 5;
int x2 = 10;
int retValue1 = sumInt(x1 , x2);
System.out.println(x1 + "+" + x2 + "=" + retValue1);
long y1 = 5L;
long y2 = 10L;
long retValue2 = sumLong(y1 , y2);
System.out.println(y1 + "+" + y2 + "=" + retValue2);
double z1 = 5.0;
double z2 = 10.0;
double retValue3 = sumDouble(z1, z2);
System.out.println(z1 + "+" + z2 + "=" + retValue3);
}
可以看到写了三个方法,起了三个不用的名字。倘若有10个,20个类的方法呢? 按照这种形式就得取很多名字来记忆,增加了编程压力,代码也不美观
为了解决这种问题,就有了重载的概念,现在我们将上面改造改造
public static int sum(int a , int b){
return a + b;
}
public static long sum(long a , long b){
return a + b;
}
public static double sum(double a , double b){
return a + b;
}
public static void main(String[] args) {
int x1 = 5;
int x2 = 10;
int retValue1 = sum(x1 , x2);
System.out.println(x1 + "+" + x2 + "=" + retValue1);
long y1 = 5L;
long y2 = 10L;
long retValue2 = sum(y1 , y2);
System.out.println(y1 + "+" + y2 + "=" + retValue2);
double z1 = 5.0;
double z2 = 10.0;
double retValue3 = sum(z1, z2);
System.out.println(z1 + "+" + z2 + "=" + retValue3);
}
发现什么不同没,我们可以看到三个方法采用了相同的名字 sum,里面的参数类型不同,这就是重载
总结一下:
重载:在一个类中定义多个同名的方法,但每个方法有不同的参数类型,不同参数个数,参数的顺序不同也是不同
public static void sumInt(long b , int a){
}
public static void sumInt(int a , long b){
}
写在最后:
以上便是java中的重写、重载的内容了
推荐阅读