浅谈java中的覆盖(也叫重写)与重载

    用我最近在看的一部电视剧《三国机密》来通俗一点的说:
    刘协死后,刘平用皇兄的身份当了皇帝,两人一模一样(参数类型、返回值等),但是刘协心铁,刘平仁慈,他们当皇帝时做的事不同(方法体不同),这就是覆盖(又叫重写),
    秦国的徐福和三国的徐福(徐庶),名字一样(方法名)但是是两个人,长得不一样(参数类型),做事也不同(方法体不同),这就是重载。
例子:
public class TestOverRL {
	public static void main(String args[]) {
		Animal a = new Dog();
		a.run();
		int c = a.run("Cat");
	}
}

class Animal {
	protected void run() {
		System.out.println("Animal is running");
	}
	
	public int run(String s) {
		return 0;
	}
}

class Dog extends Animal {
	public void run() {
		System.out.println("Dog is running");
	}
	
	public int run(String s) {
		System.out.println("Dog is running with " + s);
		return 0;
	}
}

    程序中,Animal类中的无参run方法和Dog中的无参run方法构成覆盖(又叫重写,顾名思义,将同样的方法再写一遍,这个同样就是完全一致,包括名字参数返回值等等),两者长得一模一样,但是方法内部的实现不同,调用时,用新的方法覆盖了旧方法;    

    Dog类中的两个run方法构成重载,方法长得不一样了(参数样式、返回值都不同),调用时要看具体传入的是什么来确定调用的是哪一个方法(他们返回值也不同,用的时候要注意!~当然用错会报错~)。


运行结果:


如结果所示,无参的run,a对象调用时,用重写的方法覆盖了原方法,由此可见重写又叫覆盖的原因。

顺便一提,在用Animal类构建具体Dog对象时,该对象调用的是Dog的方法,这也是java多态的一种体现,若是Dog类中没有重写无参run方法,该对象会调用Animal类中的无参run。我将Dog中无参run注释掉后运行,如下所示:



一些要注意的(参考前人总结):

override(覆盖、重写)
1、覆盖方法前后参数标志需完全相同; 
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
 (长相相同)
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。 

overload(重载)

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序;
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中的访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果
5、重载方法与原方法的返回值可以不同(徐福只是名字相同而已,重载方法也一样只是名字相同)

猜你喜欢

转载自blog.csdn.net/GBA_Eagle/article/details/80808816