方法的重写(Override)

  1. 重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作
  2. 应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法
  3. 重写的规定:
    一般来言,子类中的叫重写的方法,父类中的叫被重写的方法
    ① 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
    ② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
    特殊情况:子类不能重写父类中声明为private权限的方法
    ③ 返回值类型:
    父类被重写的方法返回类型是void,子类中重写的方法返回值类型只能是void
    父类被重写的方法返回类型是A,子类中重写的方法返回值类型可以是A或者A的子类。
    父类被重写的方法返回类型是基本数据类型(如 int),子类中重写的方法返回值类型必须是相同的基本数据类型(int)。
    ④ 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(后面异常处理会讲)。
    ⑤ 子类和父类中的同名同参数的方法要么都声明为非static(考虑重写),要么都声明为static的(不是重写)。

举例

// 定义一个父类,由于此时不确定具体的几何图形,所以findArea()无法给出具体的求面积公式
class geometry{
	public double findArea(){
		return 0.0;
	}
}

// 子类继承geometry,此时子类是一个具体的三角形
//对父类中的findArea()进行重写,就变成了求三角形的面积公式
class triangle extends geometry{
	private double length;
	private double height;
	
	public double findArea(){
		return 0.5 * length * height;
	}
}
// 子类继承geometry,此时子类是一个具体的矩形
//对父类中的findArea()进行重写,就变成了求矩形的面积公式
class square extends geometry{
	private double width;
	private double height;
	
	public double findArea(){
		return width * height;
	}
}

一道面试题:方法重写和重载的区别

结合前面方法的重载,我们可以总结对方法的重写和重载的区别进行一下总结:

  1. 方法重载(overload)是指在一个java类的定义中,可以定义多个同名的方法,只要这些方法的形参列表不同,就可以构成方法的重载。(“两同一不同”)
  2. 方法重写(override)是基于继承性产生的,主要发生在子类和父类之间(不同类之间)
  3. 方法重载可以改变方法的返回值类型,只要形参列表不同即可。
  4. 方法重写,返回值和形参列表都不能改变。即外壳不变,方法体重写!
  5. 方法重载和方法重写都是java多态性(多态性)的一种体现,区别在于方法重载是编译时的多态,而方法重写则是运行时的多态。
    这也解释了为什么方法重载和返回值类型无关,它只能通过参数类型、参数个数来区分。在调用目标方法时,由于无法指定返回值类型信息,编译器无法判断具体调用的是哪个方法,因此重载方法不能根据返回类型进行区分。

举例

class test{
	public int max(int i, int j){
		return i>j?i:j;
	}
	
	public folat max(int i, int j){
		return i>j?i:j;
	}
	
	// 此时编译器无法区分具体调用哪个max()函数,会报错
	public void compare(){
		max(3, 6);
	}
}