当前位置: 移动技术网 > IT编程>开发语言>Java > 方法重载(overload)与方法重写(override)

方法重载(overload)与方法重写(override)

2019年10月04日  | 移动技术网IT编程  | 我要评论
一、方法重载: 在同一个类中,允许存在一个及以上的同名方法,只要他们的参数列表不同(参数的个数或者参数的类型不同)即可。注意方法重载与返回值类型、访问权限修饰符、和抛出的异常无关。重载是在本类中,与继承关系无关。 (1)为什么要进行方法重载? 刚刚接触java的同学,可能会对方法重载的用处有点疑惑。 ...

一、方法重载:

  在同一个类中,允许存在一个及以上的同名方法,只要他们的参数列表不同(参数的个数或者参数的类型不同)即可。注意方法重载与返回值类型、访问权限修饰符、和抛出的异常无关。重载是在本类中,与继承关系无关。

(1)为什么要进行方法重载?

  刚刚接触java的同学,可能会对方法重载的用处有点疑惑。方法重载最经典的就是构造器了,我们知道构造器是和类名一致的,但我们要用不同的方式来实例化对象时,单一的构造器已经不能满足我们的要求,所以这时就用到了方法重载,方法重载起源于构造器。

  当然除了构造器之外我们也可以在其他方法中用到方法重载,例如一个程序完成两个数相加,如果不用方法重载时,我就需要写n个方法,给n个方法起n个方法名,在调用时我不知道该调用哪一个,然后翻来翻去才找到,这很不利于别人来使用这些方法。原本这些方法完成的功能都是一致的,为了统一管理和调用方便,所以引入方法重载这一概念。

public class test {
	
	//方法1
	public static int add(int a, int b) {
		return a + b;
	}
	
	//方法2
	public static double add(int a, double b) {
		return a + b;
	}
	
	//方法3
	public static double add(double a, int b) {
		return a + b;
	}
	
	//方法4
	public static int add(int a, int b, int c) {
		return a + b + c;
	}
	
	//方法5
	public static int add(int... a) {
		int temp = 0;
		for(int i = 0; i < a.length; i++) {
			temp += a[i];
		}
		return temp;
	}
	
	public static void main(string[] args) {
		
	}

}

   如上面的代码,有因为不同数据类型的重载、有参数位置不同的重载、有参数个数不同的重载。由此看来重载还是很强大的。

(2)重载方法的调用

  有了方法,我们就要想该怎样使用这些方法,当我们传实参时,编译器会调用哪个方法呢?这其中就有一个匹配度的问题,编译器会自动调用高匹配度的那个方法,例如:当我add(1,1);时会调用方法1,因为他的匹配度为100(安全匹配)。当然编译器找不到那个完全匹配的方法,会调用实参类型能够自动转化成形参类型的那个方法(兼容性匹配)。但这也就引发了问题,当我把方法1去掉,再调用add(1,1);这时会调用哪个方法?答案是编译器会报错。因为方法2与方法3的匹配度是相同的,引起了冲突。

  最后方法重载支持可变参数重载,可变参数本身就相当于一个数组,在匹配中他的匹配度是最低的,当其他方法不满足时,才会调用可变参数方法。

二、方法重写:

  方法的重写与方法的重载没有一点关系,硬要说有关系,那就是它们很容易被弄混。

class person{
    public  void say() {
        system.out.println("人说话");
    }
}

public class student extends person{
    @override
    public void say() {
        system.out.println("学生说话");
    }

}

 

(1)为什么要进行方法重写:

  方法的重写发生在继承关系中,在继承中子类可以继承父类中的除了构造器、静态属性、静态方法、内部类、代码块外的所有东西。方法也不例外,但是如果父类的方法并不能满足我的需求,这时候子类就需要对父类的方法进行改造扩充,这就是方法的重写。

(2)方法重写遵循的规则:(下面的大于和小于是一种描述习惯)

  1.重写的方法与被重写的方法的方法签名要一致

  2.子类重写方法的访问权限必须大于等于父类方法的访问权限,例如父类方法用public修饰,那么子类方法也必须用public修饰。

  3.重写与被重写的方法不能被static与final修饰

  4.子类抛出的受检异常不能大于父类的受检异常(注意只针对受检异常,非受检异常没有此限制)

  5.子类的方法的返回值类型可以小于等于父类的返回值类型

  6.子类不能重写父类的private方法,添加@override注解会报错,因为这个方法是父类私有的子类不能访问,虽然子类继承了这个方法,但是子类只有拥有权没有使用权。如果去掉@override注解就不会再报错,所以说进行方法重写时要记得添加@override注解,让编译器帮助你做检查。

 

  当以个方法被子类重写了,调用这个方法时,调用的时重写后的方法,但如果你就是想调用原来的方法,可以通过super关键字来实现。super关键字是一个标识,代表父类内存空间的标识。super可以用于访问父类中定义的属性,可以用于调用父类中定义的成员方法(例如tostring中可以调用父类的tostring然后再拼接上子类的特有的东西)、可以在子类中调用父类的构造器(后面详细说明)。

 

 

文章中有不对的地方,请批评指正!

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网