我认为,如果你谈论函数/方法重载的真正好处,这是你无法避免的,那么就像你在问题中指出的那样,你将找不到任何好处。
但它有什么用呢?我们来考虑这个例子。
假设我正在制作一个应用程序,通过姓名查找一个人,我声明并定义了一个方法。
public Person[] findPerson(String name)
现在我们有一个需求,需要通过一个人的出生日期来查找他,因此需要引入一个新的方法。
public Person[] findPerson_byDOB(Date date)
假设这种情况持续下去,我的应用程序会有这么多方法。
public Person[] findPerson(String name)
public Person[] findPerson_byDOB(Date date)
public Person[] findPerson_byAddress(Address address)
public Person[] findPerson_bySSN(SSN ssn)
public Person[] findPerson_byDepartment(Department department)
public Person[] findPerson_byMobile(Mobile mobile)
这只是其中的一部分;当我们被要求介绍多个参数时,它可以继续。
public Person[] findPerson_byMobileAndAddress(Mobile mobile, Address address)
public Person[] findPerson_byAddressAndDepartment(Address address, Department department)
public Person[] findPerson_byDOBAndDepartment(DOB dob, Department, department)
public Person[] findPerson_byAddressAndDOB(Address address, DOB dob)
还有许多许多...
虽然这可能有些夸张,但相信我,在制作实际的行业级应用程序时,我们可能会遇到像这样数百个方法的情况,最终我们将需要一个这些方法的目录,以了解它们的实际用途。
当我们不得不使用所有这些方法的名称时,实际上是一场噩梦。
然而,当所有参数都不同时,我们可以给函数相同的名称,这样真的很容易记住。
public Person[] findPerson(String name)
public Person[] findPerson(Date date)
public Person[] findPerson(Address address)
public Person[] findPerson(SSN ssn)
public Person[] findPerson(Department department)
public Person[] findPerson(Mobile mobile)
public Person[] findPerson(Mobile mobile, Address address)
public Person[] findPerson(Address address, Department department)
public Person[] findPerson(DOB dob, Department, department)
public Person[] findPerson(Address address, DOB dob)
正如David在他的回答中所指出的,我们都知道如何获得整数的String
值;可能我们在某个地方读到过这个方法。
static String.valueOf(new Integer(1));
但是你知道还有多少其他方法使用相同的名称进行了重载吗?
static String.valueOf(boolean b)
static String.valueOf(char c)
static String.valueOf(char[] data)
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)
好处是你不必记住它们所有。你甚至不需要猜测,因为它一直是相同的名称。
编辑 按照Namnodorel的建议进行
考虑一下PrintStream
类的这个重载方法。
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)
如果我们不得不写出以下这种阅读难度较高的句子,试想一下它将会是怎样的:
Just think about the readability if we had to write:
void println_emptyLine()
void println_boolean(boolean x)
void println_character(char x)
void println_characterArray(char[] x)
void println_double(double x)
void println_float(float x)
void println_integer(int x)
void println_long(long x)
void println_object(Object x)
void println_string(String x)
InputStream.read
获取一些示例......或者是PrintWriter.println
。 - Jon Skeetlist.add(e)
,它本质上等同于list.add(list.size(), e)
。大多数情况下我们使用前者,但有时我们需要指定索引。 - Radiodef