Java中方法重载和方法重写的区别详解以及举例

方法重载:是指在同一个类中,方法名相同参数列表不同(参数个数不同,参数类型不同,参数顺序不同),这个时候多个方法之间就形成了方法重载。
例如如下代码就是方法重载的不同情况:

//通过方法定义小狗的行为
	public void eat(){ 
		System.out.println("小狗再吃");
	}
	//方法重载
	public void eat(String food) throws Exception{
		System.out.println("小狗在吃:" + food);
	} 
	//个数不同
	void eat(String food,String space){
		System.out.println("小狗在"+space+",地方 吃"+ food);
	}
	//参数的类型不同
	public int eat(int num ,String food){
		System.out.println("小狗吃了 :"+ num +"份 "+ food);
		return 20;
	}
	//参数的顺序不同也是方法重载
	public void eat(String food,int num){
		System.out.println("小狗吃了 :"+ num +"份 "+ food);
	}

由上面的代码示例我们不难看出:

  • 方法重载跟方法返回值没有关系
  • 方法重载跟方法的修饰符也没有关系
  • 方法重载和方法是否异常也没有关系
  • 方法重载和方法参数名称也没有关系

比如,如下代码会报错:

	//方法重载
	public void eat(String food) throws Exception{
		System.out.println("小狗在吃:" + food);
	}
     /*方法重载和方法的参数名称没有关系,编译器认为这两个方法是同一个
	public void eat(String chide){
	}*/

原因就是因为方法重载和方法的参数名称没有关系,编译器会认为这两个方法是同一个,所以会报错!
那么,方法重载有什么好处呢?

  • 开发人员可以减少方法名称的定义,调用人员可以减少方法名称的记忆
  • 方法重载可以带来一定的多态效果(调用同样的方法会产生不同的结果)

那么,方法重写又是什么呢?
方法重写:方法重写是指在继承关系中,父类的方法名和子父类的方法名一致,或者子类的方法修饰符大于父类的修饰符的时候,子类的方法就重写了父类的方法。
方法重写时,子类的返回值类型与父类的返回值类型一致,或者子类的返回值类型是父类返回值类型的子类,这样也是方法重写。
例如如下代码:
首先,定义一个动物类为父类,代码如下:

public void eat(){
		System.out.println("动物都会吃");
	}
	protected  void run(){ 
	}
	private void jump(){	
	}
	public Animal getObj(){
		return null;
	}

然后,定义一个子类狗类,继承于上面的动物类,代码如下:

//子类重写父类的方法
	@Override
	public void eat(){
		System.out.println("sss");  //属于方法重写,可以继承,且方法签名和父类一致
	}
	@Override
	protected void run(){  //属于重写,可以继承,且方法签名和父类一致
	}
	@Override
	public void run(){  //属于重写,可以继承,子类的访问修饰符大于父类访问修饰符
	}
	@Override
	public Dog getObj(){ //属于重写,可以继承,子类方法的返回值类型是父类方法返回值类型的子类
		return null;
	} 
	public void jump(){ 	 //不属于重写,服了的私有属性和方法不能被继承,因此不能重写。
	}

由上面代码,我们不难看出:

  • 父类中的私有方法是不能重写的,因为父类的私有属性和方法不能被继承,因此就不能被重写
  • 在重写方法时,访问权限不能更低
  • 如果父类方法使用静态方法,子类也必须使用静态方法

那么,方法重写有什么特点呢?

  • 如果子类中和父类中方法名不同,那么就分别掉各自对应的方法
  • 如果方法重写后,方法名相同,就使用子类的。

方法重写的应用:当子类需要父类的功能,而功能体主体有自己特有的功能时,可以重写父类中的方法,这样,既可以沿袭父类的功能,又定义了子类中特有的方法。


综上,我们不难得出方法重载和方法重写的区别:

  • 方法重写必须在继承关系中,子类的方法签名和父类的一致(访问修饰符大于等于父类访问修饰符,返回值类型 和父类一样或是父类返回值类型的子类,方法名称一致,参数列表一致) 和参数的名称没有关系,只和类型有关系
  • 方法重载必须在一个类中,方法名称相同,参数列表不同,和返回值无关,和访问修饰符没有关系,和参数的名称没有关系
  • 构造函数不能被继承,构造方法也不能被重写,构造方法可以重载

你可能感兴趣的:(继承)