重载与重写的区别

110 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

方法的重载和重写是Java多态的不同表现,重载是一个类中多态性的一种表现,重写是父类与子类之间多态性的一种表现。重载和重写都是针对方法的。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。
重载
重载是一个类中多态性的一种表现,方法重载是让类以统一的方式处理不同类型数据的一种手段,可以在调用时根据传来的参数(参数个数,参数类型,参数顺序)不同来选择不同的方法,这就是多态的表现。
重写
重写是子类中对父类中某个方法重新定义,并且该方法与父类中的方法有相同的参数列表,返回值类型需要小于父类返回值类型(返回值的派生类),当然也可以相同。

重载规则
1.重载建立在继承基础之上(子父类)
2.只跟重载方法的参数有关系(参数个数,参数类型,参数顺序)
3.子类可以对从父类继承过来的方法进行重载
4.可以有不同的访问修饰符,返回类型
5.可以抛出不同的异常
6.父类中private修饰的方法不能进行重载
...
重写规则
1.重写建立在继承基础之上
2.参数列表必须和被重写方法的参数列表完全相同
3.返回值类型必须小于或相同与被重写方法返回值
4.子类的权限不能小于父类的权限
5.不能重写被表示为final的方法
6.重写方法不能抛出新异常或者比被重写方法声明的检查异常更宽泛的检查异常

package com.aimuti.practice;

public class OverLoadTest {
	public void test(int x,double y) {
		System.out.println("父类SuperClass");
	}
//	内部类
	class SubClass extends OverLoadTest{
		@Override
		public void test(int x, double y) {
//			重写父类的test方法
			System.out.println("重写了父类SuperClass test方法");
		}
	}
	class SubClass2 extends OverLoadTest{
		public void test(int x) {
//			完成对父类方法的重载
			System.out.println("重载了父类SuperClass test方法");
		}
	}
	public static void main(String[] args) {
//		内部类实例化
		OverLoadTest overLoadTest = new OverLoadTest();
		OverLoadTest.SubClass subClass = overLoadTest.new SubClass();
//		向上造型
		overLoadTest = subClass;
//		父类的声明引用指向子类的对象(调用的方法必须是父类中拥有的方法
//		子类完成重写时,则调用该方法是实际运行的是子类重写的方法;如果
//		子类中没有完成重写,则向上造型后调用的还是父类中的方法)
		overLoadTest.test(1, 2);
		OverLoadTest.SubClass2 subClass2 = overLoadTest.new SubClass2();
		overLoadTest = subClass2;
//		SubClass2对父类test方法进行了重载,没有重写test方法,
//		所以调用的是父类中的方法,而且只能调用这个test方法.因为父类中
//		没有test(int x)方法,只有test(int x,double y)方法
		overLoadTest.test(1, 2);
//		子类重载的方法
		subClass2.test(1);
//		子类继承父类的方法
		subClass2.test(1, 2);
	}
}