目录
- 📝 每日一知识点
- 方法重载
- 方法重写
- 📎 参考文章
😀 准备好了吗?让我们一起步入这座Java神奇的城堡,揭开方法重载(Overloading)和方法重写(Overriding)的神秘面纱。
📝 每日一知识点
方法重载
方法重载指的是在同一个类中,可以定义多个方法名相同,但参数不同的方法。这些方法的返回类型可以相同也可以不同,但参数列表必须不同(参数个数不同或参数类型不同)。
特点:
-
方法名相同。
-
参数列表不同(参数个数或参数类型不同)。
-
返回类型可以相同也可以不同。
如果两个方法方法名相同,参数列表和类型也相同,返回类型不同,这同样会报错。(编译器并不知道该调用返回哪一个方法)
方法的返回值只是作为方法运行后的一个状态,它是保持方法的调用者和被调用者进行通信的一个纽带,但并不能作为某个方法的‘标识’
- 可以有不同的访问修饰符。
class MathOperations {// 加法方法,接收两个整数public int add(int a, int b) {return a + b;}// 加法方法,接收三个整数public int add(int a, int b, int c) {return a + b + c;}// 加法方法,接收两个浮点数public double add(double a, double b) {return a + b;}
}public class Main {public static void main(String[] args) {MathOperations math = new MathOperations();// 调用不同的重载方法System.out.println("两个整数相加: " + math.add(2, 3)); // 输出: 两个整数相加: 5System.out.println("三个整数相加: " + math.add(2, 3, 4)); // 输出: 三个整数相加: 9System.out.println("两个浮点数相加: " + math.add(2.5, 3.5)); // 输出: 两个浮点数相加: 6.0}
}
Main方法重载
main
方法也可以重载。只不过,Java 虚拟机在运行的时候只会调用带有 String 数组的那个 main()
方法。
public class OverloadingMain {public static void main(String[] args) {System.out.println("String[] args");}public static void main(String args) {System.out.println("String args");}public static void main() {System.out.println("无参");}
}
参数类型转换
在方法重载中,参数类型转换是指Java会根据传入参数的类型自动选择最合适的方法。如果没有完全匹配的方法,Java编译器会尝试通过自动类型转换来匹配方法。例如,int
可以自动转换为long
,float
可以自动转换为double
。
public class OverloadingTypePromotion {void sum(int a, long b) {System.out.println(a + b);}void sum(int a, int b, int c) {System.out.println(a + b + c);}public static void main(String args[]) {OverloadingTypePromotion obj = new OverloadingTypePromotion();obj.sum(20, 20);obj.sum(20, 20, 20);}
}
//第二个 20 向上转型为 long
方法重写
方法重写指的是子类重新定义父类中已经定义的方法。重写的方法必须与被重写的方法具有相同的方法名、参数列表和返回类型。方法重写用于实现多态性(Polymorphism)。
特点:
-
方法名相同。
-
参数列表相同。
-
返回类型相同。
-
访问修饰符不能比父类方法的访问修饰符更严格。
-
如果被重写的方法是 default,那么重写的方法可以是 default、protected 或者 public。
-
如果被重写的方法是 protected,那么重写的方法只能是 protected 或者 public。
-
如果被重写的方法是 public, 那么重写的方法就只能是 public。
-
-
子类方法不能抛出比父类方法更多的异常。
注意点:
方法重写只能重写从父类继承过来 public、protected 或者 default 修饰的方法。
final、static 的方法不能被重写。(静态方法可用于父类以及子类的所有实例。)
构造方法不能被重写。
如果一个类继承了抽象类,抽象类中的抽象方法必须在子类中被重写。
synchronized 、strictfp 关键字对重写规则没有任何影响。
class Animal {// 父类中的方法public void makeSound() {System.out.println("动物发出声音");}
}class Dog extends Animal {// 重写父类的方法@Overridepublic void makeSound() {System.out.println("狗叫: 汪汪");}
}class Cat extends Animal {// 重写父类的方法@Overridepublic void makeSound() {System.out.println("猫叫: 喵喵");}
}public class Main {public static void main(String[] args) {Animal myDog = new Dog();Animal myCat = new Cat();// 调用重写的方法myDog.makeSound(); // 输出: 狗叫: 汪汪myCat.makeSound(); // 输出: 猫叫: 喵喵}
}
📎 参考文章
-
二哥的进阶之路
-
菜鸟教程