Java的重载(Overload)与重写(Override)

重载与重写之间的差别

区别点

重载方法

重写方法

参数列表

必须修改

一定不能修改

返回类型

可以修改

一定不能修改

异常

可以修改

可以减少或删除,一定不能抛出新的或者更广的异常

访问

可以修改

一定不能做更严格的限制(可以降低限制)

重载(Overload)

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只能重载构造函数
规则

  • 被重载的方法必须改变参数列表;
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.fatkun;
 
/**
 * Overloading(重载,过载)
 * 方法名相同,参数类型不同或者参数类型顺序不同
 * 返回值,访问修饰符,异常可以不一样
 * @author fatkun
 *
 */
public class Overloading {
 
	public int test(){
		System.out.println("test1");
		return 1;
	}
 
	public void test(int a){
		System.out.println("test2");
	}	
 
	//以下两个参数类型顺序不同
	public String test(int a,String s){
		System.out.println("test3");
		return "returntest3";
	}	
 
	public String test(String s,int a){
		System.out.println("test4");
		return "returntest4";
	}	
 
	public static void main(String[] args){
		Overloading o = new Overloading();
		System.out.println(o.test());
		o.test(1);
		System.out.println(o.test(1,"test3"));
		System.out.println(o.test("test4",1));
	}

重写(Override)

能够在需要新的子类特有行为时重新在子类中定义方法。
规则

  • 参数列表必须完全与被重写方法的相同;
  • 返回类型必须完全与被重写方法的返回类型相同;
  • 访问级别的限制性一定不能比被重写方法的强;
  • 访问级别的限制性可以比被重写方法的弱;
  • 重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常
  • 重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)
  • 不能重写被标示为final的方法
  • 如果不能继承一个方法,则不能重写这个方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.fatkun;
 
/**
 * Overriding(重写,覆盖)
 * 重写是子类继承父类对父类的方法进行修改。方法名,参数,返回值必须一样。
 * 访问级别的限制性和异常不能比被重写的方法强
 * @author fatkun
 *
 */
class TestClass {
	public void test(){
		System.out.println("这是TestClass的test方法");
	}
}
 
public class Overriding extends TestClass {
 
	public static void main(String[] args) {
		new Overriding().test();
	}
 
	@Override
	public void test() {
		System.out.println("这是Overriding的test方法,重写了TestClass中的方法");
	}
}

调用

重载方法:
参数类型决定选择哪个重载版本(根据声明的参数类型),这发生在编译时。被调用的实际方法仍是发生在运行时期的虚拟方法调用。但是编译器已经知道所调用的方法的签名。因此,在运行时期,参数匹配已经明确,只是还不知道该方法所在的实际类。
重写方法:
对象类型(即:堆上实际实例的类型决定调用选择哪个方法,这发生在运行时期)

文章来源:http://chen1984.javaeye.com/blog/353342 代码来源:fatkun




fatkun

3条评论

发表评论

电子邮件地址不会被公开。