😀 准备好了吗?让我们一起步入这座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)); // 输出: 两个整数相加: 5
System.out.println("三个整数相加: " + math.add(2, 3, 4)); // 输出: 三个整数相加: 9
System.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 {
// 重写父类的方法
@Override
public void makeSound() {
System.out.println("狗叫: 汪汪");
}
}
class Cat extends Animal {
// 重写父类的方法
@Override
public 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(); // 输出: 猫叫: 喵喵
}
}