重载Override和重写Overload的区别 ——Thinking in Java学习笔记(十)

重写Overload

重写是指在子类中出现了与父类一样的方法,只有方法体不同,其他包括参数类型、个数、返回值都相同。

重写的条件是:

  1. 要有继承
  2. 子类要有和父类一样的方法,参数列表和返回值都要相同
  3. 方法的具体实现要不同,即方法体不同

由于子类会继承父类的所有非私有方法,因为子类其实也是一种父类对象。例如:

//父类的对象指向子类的引用不需要任何转型
Test1 test = new Child();


但这里要注意,如果父类和子类不同包,那么缺省的方法也不能够继承,因为如果不同包,那么缺省其实也就相当于private,也就是私有的。

重载Override

重载是指在同一个类中,含有多个方法名相同,但参数个数或者参数类型不同的方法。

这里需要注意,方法的返回值和参数名不同是不能构成重载的。

参数名在这里就不说了,它并不会对方法本身产生影响。但按说返回值是方法的一个重要属性,为什么不算重载呢?

这里就需要提到方法的调用方式了,需要注意,方法在有的时候是不需要返回值的,例如:

override();

像这样调用方法时,返回值就不那么重要了,因此也就能理解为什么方法的返回值不能作为重载的判断条件了。

我在阅读《Java编程思想》中发现了一个比较有意思的题目:

“创建一个类,它应带有一个被重载了三次的方法。继承产生一个新类,并添加一个该方法的新的重载定义,展示这四个方法在导出类中是可以使用的。”

题目其实不难,是一个非常基础的题目。但有意思在于,它要求在子类中实现父类方法的重载。那么问题来了:重载的定义是:在同一个类中,含有多个方法名相同,但参数个数或者参数类型不同的方法。那子类和父类不是同一个类,这样算重载吗?

其实这个问题也不难,子类会继承父类的所有的非私有方法,也就是说,其实,它重载的不是父类的方法,而是它继承自父类的那个方法,实际上方法是在它当前的类中的。

来一段代码看看:

父类:

public class Test11 {
	
	public void override() {
		System.out.println("原方法");
	}
	
	void override(int i) {
		System.out.println("重载1");
	}
	
	public void override(String s) {
		System.out.println("重载2");
	}
	
	public void override(char ch) {
		System.out.println("重载3");
	}
	
}

子类:

public class Test12 extends Test11{
	
	public void override(boolean bl) {
		System.out.println("重写,还是重载?");
	}
	
	public static void main(String[] args) {
		Test12 test12 = new Test12();
		test12.override();
		test12.override(1);
		test12.override("1");
		test12.override("1");
		test12.override(false);
	}

}

结果:

原方法
重载1
重载2
重载2
重写,还是重载?

可以看到,子类Test12中调用的所有方法都是它自己的,是它从父类中继承过来的。也就是说在Test12中的override方法其实还是重载的一种形式。

猜你喜欢

转载自blog.csdn.net/qq_40509039/article/details/83381839