Mun*_*lam 36 java oop overloading function
我在我的重载方法书中找到了两个例子,但它没有清楚地解释为什么它有用:
package keepo;
public class Main{
public static void main(String [] args)
{
int newScore = calculateScore("Tim", 500);
System.out.println("New Score is" + newScore);
calculateScore(75);
}
public static int calculateScore(String playerName, int score){
System.out.println("Player" + playerName +"Has score" + score);
return score * 1000;
}
public static int calculateScore(int score){
System.out.println("Unnamed player scored" + score + "points");
return score * 1000;
}
}
Run Code Online (Sandbox Code Playgroud)
这非常简单,但老实说,这里的方法重载似乎没用,而且它似乎只是为了做到这一点.
本书中的下一个示例实现了方法重载,这似乎更有用,因为该程序计算英尺到厘米,有一种方法可以放入英尺和英寸,还有一种方法可以放英寸.但是,为此制作两个单独的方法似乎同样容易.
话虽如此,这样做有什么好处吗?(我读过这篇文章,但我并不满意.制作新方法似乎同样容易.)
Ram*_*asi 63
我想如果你谈论功能/方法重载的真正好处,没有它你就无法解决问题,那么正如你在问题中指出的那样,你将找不到任何东西.
但它有什么用呢?让我们考虑这个例子.
假设我正在创建一个通过他的名字找到一个人的应用程序,并声明并定义一个方法
public Person[] findPerson(String name)
Run Code Online (Sandbox Code Playgroud)
现在我们得到一个要求,我们要按照他的出生日期找到一个人,所以介绍一种新的方法
public Person[] findPerson_byDOB(Date date)
Run Code Online (Sandbox Code Playgroud)
让我们假设这种情况继续下去,我的应用程序中有很多方法.
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)
Run Code Online (Sandbox Code Playgroud)
这只是一部分; 当我们被要求引入多个参数时,这可以继续进行
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)
Run Code Online (Sandbox Code Playgroud)
还有更多......
虽然这看起来有点夸张,但相信我,在制作实际的行业级应用程序时,我们可能会遇到这样的情况,当我们得到数百个这样的方法时,最终我们需要一个包含所有这些方法的目录.他们实际上做了什么.
当我们必须使用它时,我们必须找到所有这些方法的名称,这实际上是一场噩梦.
但是,当所有参数都不同时,我们可以给函数赋予相同的名称,它实际上变得非常容易记住.
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)
Run Code Online (Sandbox Code Playgroud)
正如大卫在他的回答中指出的那样,我们都知道如何获得String整数的价值; 可能我们已经在某处读过了.
static String.valueOf(new Integer(1));
Run Code Online (Sandbox Code Playgroud)
但是你知道还有多少方法被重载同名吗?
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)
Run Code Online (Sandbox Code Playgroud)
好处是你不必记住它们.你甚至不必猜测,因为它一直都是同一个名字.
按照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)
Run Code Online (Sandbox Code Playgroud)
如果我们不得不写,请考虑可读性:
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)
Run Code Online (Sandbox Code Playgroud)
das*_*ght 22
当您使用不同类型的值创建相同的方法时,重载非常有用.
Mathclass提供了一个完美的例子 - 它有按类型重载的函数组 - 四abs,四min,四max等:
int max(int a, int b) {...}
float max(float a, float b) {...}
long max(long a, long b) {...}
double max(double a, double b) {...}
Run Code Online (Sandbox Code Playgroud)
没有重载的替代方法会强制您将类型"编码"到方法的名称中,例如Math.intMax(a, b),这会对用户代码的可读性产生不利影响.