访谈者问我方法重载是什么,我给出了答案说,方法重载在同一个类中,其中两个或多个方法具有相同的名称但签名不同,以下示例 -
//method with two parameters
public int add(int a, int b){
return a + b;
}
//method with three parameters
public int add(int a, int b, int c){
return a + b + c;
}
在这个例子中,他说为什么我们需要两个同名的方法,即add
。相反,我们可以有两个不同名称的方法,即addTwoNumbers
和addThreeNumbers
,表示方法名称更详细,如果我们遵循这种方法,我们不需要方法重载。 (对于使用方法重载的其他Java apis也是如此。)
考虑到他的上述想法,他问为什么OOPS原则仍然存在方法重载以及为什么如此密集地使用?发明者有什么意图引入方法重载的概念?
答案 0 :(得分:0)
在我看来,它是为了避免任何混淆而引入的。由于这两种方法都执行相同的操作,因此程序员可能很容易搜索执行相同功能的相同方法名称,而不是查找具有不同名称执行相同功能的方法。
答案 1 :(得分:0)
这背后的主要原因是代码的清洁度。 例如,让我们在java中使用 print 方法。它是一个重载函数,因为它可以有不同的争论但具有相同的名称。
System.out.print(Boolean b),System.out.print(Integer b),System.out.print(String b),System.out.print(Float b)
等等。但我们所知道的是有一种印刷方法,我们必须通过我们需要打印的任何东西。如果没有重载,那么函数的名称将看起来像
System.out.printBoolean(Boolean b),System.out.printInteger(Integer b),System.out.printString(String b),System.out.printFloat(Float b)
这不仅使代码复杂,而且难以记住何时调用哪个函数。当最终目标相同但使用的路径或对象可能不同时,使用重载。在这种情况下,我们的最终目标是打印它是整数还是字符串等。
答案 2 :(得分:0)
考虑到他的上述想法,他问为什么OOPS原则仍然存在方法重载以及为什么如此密集地使用?发明者有什么意图引入方法重载的概念?
首先,重载与OOP无关。来自Programming -- Principles and Practice Using C++的Bjarne Stroustrup:
继承,运行时多态和封装的使用是面向对象编程的最常见定义。
请注意,重载不是OOP的关键原则之一。
现在,如果我们来过载,那么支持它的逻辑就是使代码可读(虽然它可以被认为是基于意见的)。例如,C具有以下功能:
int abs(int j);
long int labs(long int j);
double fabs(double x);
float fabsf(float x);
但是C ++重载了abs
版本的不同类型(C ++仍然支持C函数以实现向后兼容)。如果编译器本身可以区分具有相同名称但不同类型的函数(即重载函数),则不是为不同类型的相同功能发明新名称,而是更容易且更易读。这也称为静态多态,如@Basilevs指出的评论。
我们可以从他的书The Design and Evolution of C++中得到C ++创建者Bjarne Stroustrup的意图。据他说,有几个人希望操作员超载,但他最初不愿意:
然而,如果这些问题可以解决,那么它可以解决一些真正的问题,很多人都希望得到这种支持。他最终克服了这些问题,并且重载成为了C ++的一部分。从书中可以看出:
但是,如果所有这些猜想都是错误的,那么重载将解决C ++用户的一些实际问题。有些人希望在C ++中拥有复杂的数字,矩阵和类似APL的向量。有些人想要范围检查数组,多维数组和字符串。至少有两个单独的应用程序,人们想要重载逻辑运算符,如I(或),& (和)和A(独家或)。我看到它的方式,列表很长,并且随着c ++用户群的大小和多样性而增长。我对[4],#34;重载的回答使代码模糊不清,"是我的几个朋友,我认为他们的价值观和数十年来的经验,他们声称,如果他们的代码超载,他们的代码就会变得更加清晰。那么如果可以用重载编写模糊的代码呢?可以用任何语言编写模糊的代码。重要的是如何更好地使用某个功能,而不是如何滥用它。
相关部分(第78页)在Google Books中可用于免费预览。请仔细阅读以获得更详细的讨论。
虽然这是C ++发明者做出的设计决定,但我认为类似的理性也适用于其他语言。
答案 3 :(得分:0)
为什么功能超载呢? 当行动几乎相同时,只是输入的集合是不同的。
在Java中,使用函数重载,我们可以支持可选参数的概念(因为在Java中没有直接支持它)
String formatStr(String str){ //if you don't care about having a different choice than default
String defaultPrefix = "__";
return formatStr(str, defaultPrefix);
}
String formatStr(String str, String prefix){ //You are free to choose whatever prefix you want.
return prefix + str;
}