重载和重写的区别
(一):方法重载:
只要其中的参数类型、参数个数、参数顺序不用我们就可以认为是参数列表不同。
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;
}
}
注意事项:
1. 重载和方法的返回值无关
我们之所以强调参数列表不一样是为了能让JVM通过参数列表的不同识别出这是哪个方法,但是如果是方法名相同,参数列表相同,仅仅返回值不同,这是无法识别出两个方法的,所以说重载和方法的返回值无关
2. 重载和方法的参数名无关
参数不同指的是参数的类型,参数的个数,参数的顺序三者不同,并没有提到参数的名称,虽然他们的参数名称不一样,但他们只表示的意义是一样的,所以JVM还是依旧识别他们的,总结就是:重载和方法的参数名无关
3. 构造方法是重载思想的体现
我们在平时写的get,set方法就是重载思想的体现,因为他符合重载的条件,1.在一个类中 2.方法名相同 3.参数列表不同,所以说,构造方法是重载思想的体现
4. final和static修饰的方法仍然可以重载
重载的三定义并没有要求方法是非final和非静态的,通过实践可以发现final和static修饰的方法仍然可以重载
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) {}
}
(二):方法重写
当子类继承父类后,会获的我们父类中的成员属性和成员方法,当我们在应用的时候,我们会发现当前父类的方法并不适合我们,所以我们要对他进行重写,我们在不改变方法名和参数列表时我们可以对父类的方法里的内容进行重写书写,这就是方法重写
public class Demo1 {
int a;
public void test(){
System.out.println("我是Demo1");
}
}
class Demo2 extends Demo1 {
@Override
public void test(){
System.out.println("我是Demo2");
}
}
当我们在子类重写方法时,在头上加一个@Override发现没有报错,就说明你的重写是正确的。@Override是一个我们判断是否方法重写是否成功且是否合理的注解,当不正确时它会报错。
口诀:
两同一不同两小一大
-
两同
- 方法名相同
- 参数相同(参数个数、参数顺序、参数类型)
-
一不同
- 同一继承链上不同的超类,派生类之间
-
两个东西可以变小
- 返回类型可以不一致,返回类型可以变小(引用类型可以返回父类返回类型的派生类)
- throws的异常,重写时可以变化为throws子异常
-
一大
- 权限修饰符
注意事项:
-
private修饰的方法不可被重写
子类无法继承父类private权限的方法,更不能说是重写了,在java 中,所有的private方法的都是默认为final的,包括final方法就是不能被重写的,所以结合起来,子类不一定能重写父类的所有方法,private 方法方法是不可被重写
-
static修饰的方法不可被重写
方法重写是基于运行时态绑定,但静态资源在编译时就已经静态绑定了,所以我们无法重写,静态方法无法被重写(覆盖)。这也能证明子类并不能继承父类所有的方法这句话。
-
如何区分重载和重写?
重载和重写都体现除了Java语言中的多态性质。重载是对一个类中的多个同名方法进行判断,而重写时基于父类和子类的同名方法来判断 。一个是在一个类中,一个是在两个类中。
今天的分享就到这儿,大家有疑问可以私信我哦,我在这儿等着大家
今天是持续写作的第 5 / 200 天。可以点赞、评论、收藏啦。