更新时间:2023-03-23 来源:黑马程序员 浏览量:
在面向对象编程中,"Overload"和"Override"是两个重要的概念,用于描述不同类型的函数重写。
Overload是指在同一类中定义了多个同名的方法,但每个方法具有不同的参数列表。Java会根据传递的参数类型和数量来确定哪个方法应该被调用。
例如,在下面的示例中,有两个具有相同名称的方法 "print", 但是它们接收的参数类型不同:
public class MyClass { public void print(int x) { System.out.println("The integer value is " + x); } public void print(String x) { System.out.println("The string value is " + x); } }
在这个示例中,如果你调用print(10),它会调用第一个方法,如果你调用print("Hello"),它会调用第二个方法。
Override是指在子类中重新定义了父类中已经定义的方法。这个方法必须有相同的名称、参数列表和返回类型。在这种情况下,当你在子类中调用该方法时,将调用子类中的版本而不是父类中的版本。
例如,在下面的示例中,有一个父类 "Animal",其中有一个名为 "makeSound()" 的方法。然后有一个子类 "Dog",该子类重新定义了 "makeSound()" 方法:
class Animal { public void makeSound() { System.out.println("Animal is making a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Woof"); } }
在这个示例中,如果你创建了一个"Dog"对象,并调用makeSound()方法,它将打印出"Woof",而不是 "Animal is making a sound"。
下面是完整的示例代码,展示了 Overload 和 Override 的区别:
public class MyClass { public static void main(String[] args) { // Overload 示例 MyClass myClass = new MyClass(); myClass.print(10); myClass.print("Hello"); // Override 示例 Animal animal = new Animal(); animal.makeSound(); Dog dog = new Dog(); dog.makeSound(); } // Overload 示例 public void print(int x) { System.out.println("The integer value is " + x); } public void print(String x) { System.out.println("The string value is " + x); } } class Animal { public void makeSound() { System.out.println("Animal is making a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Woof"); } }
运行代码,将输出以下内容:
The integer value is 10 The string value is Hello Animal is making a sound Woof
这证明了 Overload 和 Override 的区别。在 Overload 示例中,不同参数类型的方法可以共享相同的名称。而在 Override 示例中,子类重写了父类的方法,并且在调用该方法时将调用子类中的版本。
需要注意的是,Override只能在子类中重新定义方法。如果你尝试在同一个类中重新定义方法,编译器会报错。另外,在Override中,子类方法必须具有与父类方法相同的返回类型。如果返回类型不同,编译器将报错。
但是,Overriding方法的返回类型必须与父类方法的返回类型相同或是其子类型。这是因为在运行时,Java虚拟机会根据方法的返回类型来确定需要分配多少内存来存储返回值,如果返回类型不同,可能会导致类型转换错误或其他运行时异常。
在Java中,Overloaded的方法可以改变返回值的类型,只要方法的签名不同。方法的签名是由方法名称和参数列表组成的,如果两个方法的名称和参数列表不同,那么它们的返回值可以不同。
例如,假设有两个方法:
public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; }
这两个方法都叫做sum,但是它们的参数类型不同,一个是int类型,一个是double类型。由于它们的签名不同,因此可以返回不同的类型。
当调用这些方法时,编译器会根据参数的类型来选择正确的方法。例如,如果调用sum(2, 3),则会调用第一个方法,返回int类型的结果5。如果调用sum(2.5, 3.5),则会调用第二个方法,返回double类型的结果6.0。
需要注意的是,如果两个方法的签名相同,但是返回值类型不同,那么编译器将无法确定调用哪个方法,会导致编译错误。因此,Overloaded的方法必须具有不同的签名。