Java第二十三篇:详述重载与覆盖的区别(不会或不太理解的的同学看这里)

此刻正在阅读这篇文章的你,肯定是一个爱学习的人儿!

在接触java一段时间,重温重载和覆盖相关知识点。那什么是重载?什么是覆盖?
概念理解:
重载:在类中定义两个或两个以上名称相同的方法,但是方法的参数个数或参数类型不同;
覆盖(也称重写):如果子类中定义的某个方法的特征与父类中某个方法的特征完全一样,说明子类中的方法覆盖了父类中的方法。
什么情况下会用到重载呢?
答:可以用来处理不同类型数据的方法,名称一致,只需更改参数即可, 省掉了很多麻烦。
什么情况下会用到覆盖(重写)呢?
答:子类在继承父类的基础之上添加新的功能,方便灵活,提供了代码的复用性。
这里结合下面的例子深入理解:

1.重载

package study;
/**
 * 
 * @author 重工黑大帅
 * @date 2020.2.3
 * 实现功能:理解重载的概念
 */
public class Study{
	public static void main(String args[]) {
		Study1 study1 =new Study1();
		Study1 study2 =new Study1(3);
		Study1 study3 =new Study1(4,5);
		study2.add(10, 15);
		study1.add(11,22, 33);
		study3.add(11.5, 12.4, 3.5);
		
	}
}
class Study1{
	
	//定义私有变量x和实例变量y
	private int x=0;
	int y=0;
	
	//构造方法:传递参数的话需要写出默认构造方法
	Study1(){
		setX(1);//x=1;
		y=2;
	}
	Study1(int x0){
		setX(x0);
	}
	Study1(int a,int b){
		setX(a+b);
		y=b*a;
	}
	
	//书写setter、getter方法
	public void setX(int x) {
		this.x = x;
	}
	public int getX() {  
		return x;
	}
	
	//定义三个方法,理解重载的概念(本篇博文重点)
	public void add(int a,int b) {
		a=a+b;
		System.out.println("a+b="+(a+b));
	}
	
	public void add(int a,int b,int c) {
		int h=a+b+c;
		System.out.println("h="+h);
	}
	
	public void add(double a,double b,double c) {
		double w=a*b*c;
		System.out.println("w="+w);
	}	
}

结果显示:
在这里插入图片描述
过程分析:上述代码中定义私有变量x和实例变量y,我是直接在创建对象的时候就传参过来,所以要把默认的构造方法写出来,不然会报错;其次定义了三个方法,第一个方法和第二个方法参数个数不同,第二个方法和第三个方法参数类型不同,但方法的名称是相同的,故这里运用了的重载的概念;
重载方法中需注意的是(误区):

1.方法的重载不是根据返回值来进行区分的;
2.当方法中形参类型的区分不是很明显时,应具体到数据类型,比如传递两个形参,一个是int型,一个是long型,那这个时候传递的实参int型传递2long型传递3l。

2.覆盖


package study;
/**
 * 
 * @author 重工黑大帅
 * @date 2020.2.3
 * 实现功能:理解覆盖的概念
 */
public class Study{
	public static void main(String args[]) {
		Study2 study =new Study2();
		study.add(11,2);
		study.add(11,22,33);
		study.calc(10, 20);
	}
}
class Study1{
	public void add(int a,int b) {
		int c=a+b;
		System.out.println("c="+c);
	}
	public void calc(int a,int b) {
		int h = a*b;
		System.out.println("h="+h);
	}
}
class Study2 extends Study1{
	void add(int a,int b,int c) {
		int t=a+b+c;
		System.out.println("t="+t);
		
	}
	public void add(int a,int b) {
		int q=2*a+b;
		System.out.println("q="+q);
	}
	public void calc(int a,int b) {
		int w = a+2*b;
		System.out.println("w="+w);
	}
}

结果显示:
在这里插入图片描述
过程分析:上述代码中类Study2继承了类Study1(包括继承了两个方法),但类Study2中也含有add和calc方法,而在执行过程中,父类Study1中的方法被子类中的方法覆盖(看上述结果截图),这里也就用到了方法覆盖的概念。
覆盖方法中需注意的是(误区):

1.若子类的特征与父类的特征并不完全一样,则说明父类的方法没有被覆盖,如上述代码中,形参类型改为long

总结:

这两种方法都体现了java语言的多态性。
1.重载可以出现在一个类中,也可以出现在继承关系中,子类与父类的特征不一定完全相同;
2.覆盖要求子类与父类的特征完全一致,即子类中这个方法的名字,参数类型,参数个数,返回值类型和父类中的那个方法完全一致。

有疑问欢迎留言!

点个赞,加个关注呗!嘿嘿!

发布了41 篇原创文章 · 获赞 184 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/H_W_1212/article/details/104144015