??引言??
? ? ? ? ? ? ? ? 大家好,我是执梗,我致力于写从Java基础开始向JavaEE进阶的Java知识,也会涉及到一些算法知识,有兴趣的伙伴可以一起关注交流,欢迎阅读我的JavaSE基础系列。今天为了大家讲解Java基础中比较重要的知识点——重载和重写。至于为什么要把它们两个放一起呢,因为很多人刚学总是傻傻分不清哈哈哈,其实它们的本质没多大关系。
📒博客首页:执梗的博客
🎉欢迎关注🔎点赞👍收藏??留言📝
?? :热爱Java学习,期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!? ??
??小剧场??
下列关于重载和重写的说法,错误的是?(多选)
? ? ? ? ? ? ?A.重载就是一个类中,有多个方法名相同、但参数列表和返回值不同的方法。
? ? ? ? ? ? ?B.?子类重写父类的方法时,方法权限必须保证和父类相同?
? ? ? ? ? ? ?C.不同的构造方法体现的正是重载的思想
? ? ? ? ? ? ?D.当子类继承父类后,只有静态方法是不可以重写的
??知识导航??
??、引言??
??小剧场??
??1.什么是方法重载?
??2.重载的注意事项?
????????🌿1.重载和方法的返回值无关
????????🌿2.重载和方法的参数名无关
????????🌿3.构造方法是重载思想的体现
????????🌿4.final和static修饰的方法仍然可以重载
??3.什么是方法重写?
??4.方法重写(覆盖)的记忆口诀:两同两小一大
?????????🌰1.什么是两同?
?????????🌰2.什么是两小?
?????????🌰3.什么是一大?
??5.方法重写(覆盖)的注意事项
?????????🌕1.private修饰的方法不可被重写
?????????🌕1.static修饰的方法不可被重写????
??6.如何区分重载和重写?
???????小剧场解答???
??1.什么是方法重载?
? ? ? ? ?在Java语言中,在同一个类中,存在多个方法名相同,但是具有不同的参数列表,这就称之为方法重载(method overloading)。这里的参数列表,指的就是方法的参数,只要其中的参数类型、参数个数、参数顺序不用我们就可以认为是参数列表不同。? ? ? ??
举一个Demo类栗子
public class Demo {
//一个不带参数没有返回值的test方法
public void test(){
}
//一个不带返回值,参数为int类型的test方法
public void test(int a){
System.out.println(a);
}
//一个返回值为int,参数为int、String的test方法
public int test(int a,String b){
System.out.println(a+b);
return a;
}
}
?????????🔑 :通过上面的栗子我们很清楚,更印证了我们只要方法名相同,参数列表不同即是方法重载。但是为什么是这样呢?很多人只是生硬的记忆,却没有思考过这个问题,很多文章也没有说明。其实我们的代码写好以后,它是交给我们的JVM去编译的,当你在一个地方调用了一个重载方法时,它当然一开始并不知道你的这个方法是哪一个,但是通过你的参数列表的不同它就可以找到你想调用的方法。
??2.重载的注意事项?
????????🌿1.重载和方法的返回值无关
? ? ? ? 之所以多次强调这一点,是因为这是方法重载最容易掉坑犯错的地方。其实我们认真想一下就能记住。我们要方法参数列表不一致,是为了能让JVM区分我们使用的是哪个方法。那如果我写了两个参数列表一样的同名方法,但返回值不同。JVM能识别吗?当然不能,因为我们调用方法时只需要写方法名和参数列表,并没有写返回值,JVM当然不能识别你是哪个方法。所以千万记住重载和方法的返回值无关
????????🌿2.重载和方法的参数名无关
? ? ??????再次强调一遍,参数直接不同指的是参数类型,参数个数、参数顺序三者有一个不同即可。和参数的名称毫无关系,比如你写了两个方法test(int a)和test(int b)。请问我们在传参数时要考虑参数名吗?当然不考虑,我们考虑的是参数类型,我传个int a,b,c,d,e,f,g都是符合两个方法的。这时你JVM根本分不出我要用的是哪个方法。所以别人问你的时候一定要听清,做题也要细心点,重载和方法的参数名是无关的
????????🌿3.构造方法是重载思想的体现
? ? ? ? ?有些初学者,在对重载理解不透彻时,总在想构造方法是不是重载方法。这个问题当然是肯定的。首先明确重载的定义就清楚了,1、在一个类中2、方法名相同3、参数列表不同。构造方法是条条都符合,我们经常说什么无参构造一参构造等等,正是体现地参数列表不同。所以记住,构造方法正是我们重载思想最重要的体现
????????🌿4.final和static修饰的方法仍然可以重载
? ? ? ? 我发现很多的文章都说被final和static修饰的方法是不可被重载的。这其实是误人子弟,大家手动尝试一下就知道,可以发现编译器并没有报错。但其实认真想想,重载的三定义并没有要求方法是非final和非静态的,所以在学习的过程还是要手动自己去实践。永远根据重载的定义去判断,就不会错。
public abstract class Demo {
//静态方法可以重载,未报错
public static void testA(){}
public void testA(int a){}
//final方法也可以重载,未报错
public final void testB(){}
public void testB(int b){}
//抽象方法仍然可以重载
public abstract void testC();
public void testC(int C) {}
}
??3.什么是方法重写?
? ? ? ? 在面向对象的继承中,我们都知道,当子类继承父类后,会获得我们父类中的成员属性和成员方法。但当我们在应用时,发现父类的方法并不适合用我们的子类,在我们不改变方法名和参数列表时我们可以对父类的方法里的内容进行重写书写,这就是方法重写。
举一个重写的例子
public class Demo1 {
int a;
public void test(){
System.out.println("我是Demo1");
}
}
class Demo2 extends Demo1 {
@Override
public void test(){
System.out.println("我是Demo2");
}
}
? ? ? ??🔑:里面就是一个父类Demo1和子类Demo2,我们发现子类的test方法和父类test方法除了方法体内几乎是一模一样的。但我们只需要先暂时记住保证方法名和参数列表一致(悄悄和重载对比一下)。在方法体内他们是不同的,这就是一个方法重写,子类Demo2继承了父类的test()方法,但是重新书写了其中的内容。我们发现子类的test方法头上有一个@Override。这其实是一个注解(可能还没学习,但是不影响使用),当我们在子类重写方法时,在头上加一个@Override发现没有报错,就说明你的重写是正确的。@Override是一个我们判断是否方法重写是否成功且是否合理的注解,当不正确时它会报错。
??4.方法重写(覆盖)的记忆口诀:两同两小一大
?????????🌰1.什么是两同?
? ? ? ? ?两同指的是在方法重写中,子类的方法和父类的方法的方法名和参数列表(参数个数、参数顺序、参数类型)必须相同? ? ? ? ??
?????????🌰2.什么是两小?
? ? ? ? 我们在两同判断的基础上,还需要判断两小。第一个小是返回值类型,子类重写方法的返回值类型必须小于等于父类方法的返回值类型。什么意思呢?就是你子类的返回值类型得是我父类返回类型的子类,最多也只能和我相等。比如我父类返回值类型是上文中的Demo1,那你子类返回值类型得是我Demo1的子类,当然和父类引用同样是Demo1也可以。另一小指的是,如果方法中有异常抛出,子类抛出的异常也得小于或等于父类抛出的异常。其实这个意思和上面相同,在Java中异常也是对象,用类来表示且有着继承的关系,也就是你子类抛出的异常必须小于等于父类抛出的异常。也就是子类抛出异常同样得是父类抛出异常的子类,也可以一致。
?????????🌰3.什么是一大?
? ? ? ? 既然是方法,那肯定有访问权限,我们规定:子类的重写方法权限必须大于或等于父类的访问权限。按照pubic>protected>default(默认)>protect这个进行排序进行选择。比如父类为public时,子类不能为protected或default,只能也为public。如果父类为protected,那子类必须为public或protectde
??5.方法重写(覆盖)的注意事项
?????????🌕1.private修饰的方法不可被重写
? ? ? ? 其实这个很容易解释,private是私有的属性,其他类是不可访问。子类从父类是无法继承到private权限的方法的,更别提重写了。而且,在Java中,所有的privat方法都是默认为final的,这点很少有人知道。final方法是无法被重写的,结合起来,所以大家一定要记住,子类并不一定能重写父类所有的方法,private的方法是不可被重写的。? ? ? ??
?????????🌕1.static修饰的方法不可被重写????
? ? ? ? 其实就是静态方法是不可被重写的。这个是固有的要求,如果真要说原因,就涉及到静态的概念了。我们的方法重写是基于运行时态绑定,但静态资源在编译时就已经静态绑定了,所以我们无法重写,不理解也没关系能记住就好。静态方法无法被重写(覆盖)。这也能证明子类并不能继承父类所有的方法这句话。??
?@Override报错了说明不符合要求
??6.如何区分重载和重写?
? ? ? ? ?其实如果能阅读玩我这篇文章,就能真正感受到,其实区别还是很大的,但是重载和重写都体现除了Java语言中的多态性质。重载是对一个类中的多个同名方法进行判断,而重写时基于父类和子类的同名方法来判断?。一个是在一个类中,一个是在两个类中。如果有人说自己无法区分重载和重写,那就是他对这两者的本质没有真正的了解,或者说他根本就没有去了解。Java基础性的知识一定要自己去尝试去思考去理解,这样才利于后续阶段的学习? ? ?
???????小剧场解答???
? ? ? ? 答案:ABD? ? ? ??
????????A. 重载与返回值无关
? ? ? ? B.不一定要相同,子类权限大于父类也行
? ? ? ? C.正确
? ? ? ? D.static方法和private都不可以被重写??
? ? ? ? ?我是执梗,如果文章有错误请及时指教,有问题也可以讨论。觉得有用的话麻烦三连,多谢!
|