解释什么是方法重载和覆盖

方法重写和重载是 Java 支持的两种形式的多态。

方法重载

方法重载(也称为静态多态)是一种在单个类中具有相同名称的两个(或多个)方法(函数)的方法。是的,它就这么简单。

public class Shape{
    //It could be a circle or rectangle or square
    private String type;
    
    //To calculate area of rectangle
    public Double area(Long length, Long breadth){
        return (Double) length * breadth;
    }
    
     //To calculate area of a circle
     public Double area(Long radius){
        return (Double) 3.14 * r * r;
    }
}

这样,用户可以根据其具有的形状类型为区域调用相同的方法。

但现在真正的问题是,java 编译器将如何区分执行哪个方法体?

Java 已经清楚地表明,即使方法名称 (在我们的例子中是 area()可以相同,但参数方法正在采用的应该是不同的。

重载方法必须具有不同的参数列表(数量和类型)。

这就是说我们不能添加另一种方法来计算这样的正方形区域:public Double area(Long side) 因为在这种情况下,它会与圆区域方法冲突并且会导致 java 编译器的歧义

感谢上帝,在编写重载方法时会有一些放松

可能有不同的退货类型。

可能有不同的访问修饰符。

可能抛出不同的例外。

为什么这称为静态多态?

那是因为要调用哪些重载方法是在编译时根据参数的实际数量和参数的编译时类型决定的。

使用方法重载的一个常见原因是它提供的代码简单。例如,记得 String.valueOf() 几乎可以采用任何类型的参数吗?在幕后写的内容可能是这样的: -

static String valueOf(boolean b) 
static String valueOf(char c) 
static String valueOf(char[] data) 
static String valueOf(char[] data, int offset, int count) 
static String valueOf(double d) 
static String valueOf(float f) 
static String valueOf(int i) 
static String valueOf(long l) 
static String valueOf(Object obj) 

方法重写

嗯,方法重写(是的,你猜对了,它也被称为动态多态)是一个更有趣和复杂的主题。

在方法重写中,我们覆盖父类提供的方法体。得到它了?没有?我们来看一个例子吧。

public abstract class Shape{
    
    public abstract Double area(){
        return 0.0;
    }
}

所以我们有一个名为 Shape 的类,它有一个叫做 area 的方法,它可能会返回形状的区域。

现在假设我们有两个名为 Circle 和 Rectangle 的类。

public class Circle extends Shape {
    private Double radius = 5.0;

    // See this annotation @Override, it is telling that this method is from parent
    // class Shape and is overridden here
    @Override
    public Double area(){
        return 3.14 * radius * radius;
    }
}

类似矩形类:

 public class Rectangle extends Shape {
    private Double length = 5.0;
    private Double breadth= 10.0;

    // See this annotation @Override, it is telling that this method is from parent
    // class Shape and is overridden here
    @Override
    public Double area(){
        return length * breadth;
    }
}

所以,现在你的两个子类都已经更新了父类(Shape)类提供的方法体。现在问题是如何看到结果?好吧,让我们做旧的 psvm 方式。

public class AreaFinder{
    
    public static void main(String[] args){

        //This will create an object of circle class
        Shape circle = new Circle();
        //This will create an object of Rectangle class
        Shape rectangle = new Rectangle();
        
        // Drumbeats ......
        //This should print 78.5
        System.out.println("Shape of circle : "+circle.area());

        //This should print 50.0
        System.out.println("Shape of rectangle: "+rectangle.area());            
        
    }
}

哇! 不是很棒吗?两个相同类型的对象调用相同的方法并返回不同的值。我的朋友,这是动态多态的力量。

这是一张图表,可以更好地比较这两者之间的差异: -

方法重载 方法重写
方法重载用于增加程序的可读性。 方法重写用于提供其超类已经提供的方法的特定实现。
方法重载在类中执行。 方法重写发生在具有 IS-A(继承)关系的两个类中。
在方法重载的情况下,参数必须不同。 在方法重写的情况下,参数必须相同。
方法重载是编译时多态的一个例子。 方法重写是运行时多态的示例。
在 java 中,只能通过更改方法的返回类型来执行方法重载。返回类型在方法重载方面可以相同或不同。但你必须更改参数。 方法重写中的返回类型必须相同或协变。