提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、什么是重载?
- 重载的全称
- 重载的定义
- 重载的代码演示
- 二、什么是重写?
- 重写的全称
- 重写的定义
- 重写的代码演示
- 三、两者的差别汇总
- 关于代码中两者辨析的技巧
前言
重写和重载是java多态的重要组成部分,两者的区别也是java学习者和使用者必须掌握的要点。
一、什么是重载?
重载的全称
方法重载 overload
重载的定义
指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
其中 方法的方法名+参数列表,合起来也称为“签名”。
所以重载也可以阐述为,一个类中定义的多个同名但不同签名的方法。
这里的不同可以是,参数类型、参数数量、参数顺序的任一不同。
需要注意,在使用时,基本类型为参数的情况下,如果没有完全对应的类型,会结合自动转换去匹配类型。
ps:重载对访问范围修饰词(public、protect、default、private)不做限定
对返回值同样不做限定。可以理解为,重载的方法间,其实只有方法名相同,匹配上不同参数列表之后就是在调用不同的方法。
重载的代码演示
//声明一个测试类,用于声明重载的方法
public class OverloadTest {
//声明一个say方法,参数为String类型
public static void say(String text){
System.out.println("重载1:我输入的是String类型的"+text);
}
//再声明一个say方法的重载,参数为int类型
public static void say(int text){
System.out.println("重载2:我输入的是int类型的"+text);
}
//再声明一个say方法的重载,参数为double类型
public static void say(double text){
System.out.println("重载3:我输入的是double类型的"+text);
}
//再声明一个say方法的重载,参数为int类型、String类型
public static void say(int text,String str){
System.out.println("重载4:我输入的是int类型的"+text+"和String类型"+str);
}
//再声明一个say方法的重载,参数为String类型、int类型
public static void say(String str,int text){
System.out.println("重载5:我输入的是和String类型"+str+"int类型的"+text);
}
public static void main(String[] args) {
say("(。・∀・)ノ゙嗨");//重载1:我输入的是String类型的(。・∀・)ノ゙嗨
say(9527);//重载2:我输入的是int类型的9527
say(3.5);//重载3:我输入的是double类型的3.5
say(3.2f);//重载3:我输入的是double类型的3.200000047683716;发生了自动类型转换的匹配
byte a = 2;
say(a);//重载2:我输入的是int类型的2;发生了自动类型转换的匹配
say(9527,"你好");//重载4:我输入的是int类型的9527和String类型你好
say("再见",173);//重载5:我输入的是和String类型再见int类型的173
}
}
二、什么是重写?
重写的全称
方法重写 Override
重写的定义
指父子类中,子类对父类的方法进行的覆盖操作。用于 子类希望修改 从父类继承来的方法 的情况。
重写的代码演示
1.关于重写的作用的演示
首先,即使子类中没有eat方法,也会继承父类的eat方法,所以father和son都可以eat,且效果一致。
但如果儿子想要不一样,就可以像对say方法一样,在自己的类中以相同的方法名和参数列表去重写say方法的方法体,让son的say和father的say产生不同的效果。
public class OverrideTest {
public static void main(String[] args) {
Father father = new Father();
Son son = new Son();
father.eat();//老子要吃饭
son.eat();//老子要吃饭
father.say();//拉老子的意大利炮来
son.say();//拉儿子的歼星炮来
}
}
class Father{
public void eat(){
System.out.println("老子要吃饭");
}
public void say(){
System.out.println("拉老子的意大利炮来");
}
}
class Son extends Father{
public void say(){
System.out.println("拉儿子的歼星炮来");
}
}
2.关于重写的限制
必须明确:重写的 方法名和参数列表 必须和父类同名方法完全一致
然后在访问范围上:子类重写的方法,访问权限必须大于或者等于父类方法的权限
在返回值类型上:子类的返回值类型,基本类型则需相同,引用类型则需相同或子类(也可以理解为更小,狗类继承于动物类,狗类是动物类的子类,也可以形象地认为狗类小于动物类)。
class Father{
protected double test1(){ return 1.1; }
protected double test2(){ return 1.1; }
protected double test3(){ return 1.1; }
protected Father test4(){ return new Father(); }
protected Son test5(){ return new Son(); }
}
class Son extends Father{
//扩大访问范围没事
public double test1(){ return 1.1; }//编译正常
//缩小访问范围就会报错
private double test2(){ return 1.1; }//编译报错
//对于返回值为基本类型时,返回值类型必须相同
public int test3(){ return 1; }//编译报错
//对于返回值为引用类型时,返回值类型是 父类方法的返回值类型 的子类,是可以的
protected Son test4(){ return new Son(); }//编译正常
//对于返回值为引用类型时,返回值类型是 父类方法的返回值类型 的父类,不可以
protected Father test5(){ return new Father();}//编译报错
}
三、两者的差别汇总
口诀:
重写:父子类同名同参,访问更高返回小。
重载:同类同名不同参,访问返回都不限。
关于代码中两者辨析的技巧
其实重写和重载常常同时发生,在方法名一致的前提下,
①一般先通过对比父子类中参数列表确定到底是重写还是重载,如果参数列表不一致,那么就是重载,对访问权限、返回值就都没什么限制。
②如果子类和父类中同名方法的参数列表一致,那么就要根据重写的限制要求去判断访问权限和返回值是否符合规范。