java中有很多方法是可以通过重载的方式实现的,这是 Java语言的一大特色,但是同时也为开发人员带来了一些麻烦,不知道怎么去调用这些方法,而且还容易出现一种情况就是:明明已经调用过了一个方法,但为什么又要去调用另一个方法?难道这个方法的名字不同吗?那又有什么关系呢?这些都是我们在学习和使用 java语言时要面对的问题。其实这里面最主要的问题还是在于重载的时候,不能保证每个方法都被正确调用。 当我们对同一个对象进行多次调用时,就会出现上面所说的情况。比如我们调用一个方法,当这个方法被调用次数达到一定程度后,这个方法就会被异常抛出了。对于这种情况, java中有一种非常经典的解决方案,那就是将这个方法进行重写。 重写也叫修改、替换或覆盖等。其基本思想是:对同一个对象或方法进行多次重复调用(即多次调用同一个参数)。这样做有两个好处:首先,由于每个重写后的方法都不同,所以不会出现一次重写就能把所有方法都重新做一遍的情况了;其次,由于每个重写后的方法都不同,所以不会出现某个重写后的方法被覆盖或调用时不能正常返回结果等问题。重写后的代码会自动地覆盖掉原来的代码段和变量、常量等。
-
一、方法的重载
在多个方法中实现相同的功能,将其重写为不同的方法,可提高程序的可重用性。这样做,就可以避免一个方法多次被调用时,它的同名方法又要重新做一次。即在一个类中创建多个同名的子类,然后在这些子类中重写相同的方法。从实现上看,如果没有实现重载,那么就会出现同一个方法在不同的类中被重复调用的情况。由于在很多时候,我们所需要使用的方法不可能是只有一种类型的,因此我们可以通过重载来实现相同类型方法之间的互相调用。通过重写方法,就可以实现同类型方法之间的互相调用。 那么重写后的方法有什么不同呢?重写后方法和原类中同类方法所采用的关键字是一样的,在重新编译时被当作一个新类来对待。即同一个方法,在不同的类中被分别调用两次(如果是多个不同类中被重复调用)。因此我们可以说重写后的方法与原类是一样的。 具体实现如下: 上面这段代码中就实现了两个类之间同类型方法之间的重载,即: 以上代码中使用了“null”关键字来返回一个类型为 null、但其值为 false的异常状态代码段。由于这个异常状态是一个在程序运行过程中所不会出现和处理过的异常状态,因此我们在重新编译时会忽略掉这个异常状态代码段。但是在程序运行结束后,就会发现这个异常状态是一个真实存在、并且能处理掉这种异常状态代码段。 以上两个例子是典型的多个方法重写后实现相同功能、不同类之间被重写为相同类型、但其同名方法不同且其值也不同、但其名相同且其值不同这四种情况。对于这些情况,我们在实际编程时应该根据具体情况来确定哪个是第一种情况,哪个是第二种情况,然后再结合重载来选择相应代码段。
-
二、多个方法同时调用
当我们需要调用多个方法时, Java语言给了我们一种解决方法,那就是把每个方法的名称都加一个数字。如果这个数字和某个参数的值一样,那么这个方法就可以被调用两次。这里为什么要多一个数字呢?其实也是为了在多个方法之间进行区分。 所以我们在调用一个方法时,就要先检查一下是否有异常情况,如果没有异常情况,那就可以继续调用了。 当我们使用多个方法来调用时,其实还有另外一种方式可以解决这个问题。当我们对某一个参数进行多次修改时,如果还想再对其进行调用的话,那么只需要修改参数的值就可以了。比如: 当我们想对两个参数进行修改时,只需要将参数的值进行修改即可。其实这里的修改过程与上面所说的一样,只是这里修改后的结果是从两个参数变成了一个参数。 另外,当我们想要对多个方法进行调用时,还可以用到重载的方式。在这个例子中: 此时我们并没有使用重写的方式来实现以上两种情况,而是将一个方法进行了重写。所以在调用这个方法时就可以正常地返回结果了。而对于我们上面所说的两种情况:
-
三、代码优化
1.多个方法共用同一个参数。对于多个方法共用同一个参数时,我们可以通过将方法名称进行合并来减少重复调用的次数,从而提高代码的可读性。对于常用的多个方法,可以直接在方法名上加上参数即可,如: 2.减少循环。在使用循环语句时,我们可以将循环语句进行拆分,比如上面的例子中,我们将两个循环语句进行合并,并且通过判断这两个循环语句是否包含在一个大的循环里来减少循环次数。当然在使用这个方法时,一定要注意是在同一类型的变量中使用。 3.将常量名改为方法名。如果我们要调用一个方法来进行数据操作,那么这个方法的常量名就不能再使用了,这时我们可以将这个常量名改为方法名来代替。 4.使用局部变量。当我们调用一个方法时,由于这个方法是对该对象进行操作的,所以我们可以将这个局部变量放在这个对象内部。这样就避免了整个代码都重新写一遍的问题了。 5.使用 public static final修饰符。对于一些需要 final修饰的语句,我们可以将其放在变量声明之后再调用该变量。 6.使用 final关键字修饰参数。如果参数是一个常量时,我们可以直接使用 final关键字进行修饰;如果参数是一个变量时,我们可以使用 final关键字进行修饰;如果参数是一个类或者对象时,我们可以使用 final关键字进行修饰。 7.不要使用 mutation ()。mutation ()是一个非常典型的 Object类的方法调用函数,在该函数中不能对任何非 Object类对象进行调用。所以当我们在使用 mutation ()时,一定要先确定我们是否需要调用这个方法来对对象进行操作,如果需要的话,再来选择是否调用该方法。 8.不要让一个类被多个方法访问。Java的虚拟机管理工具(虚拟机管理器)会记录一个对象在不同类中被访问的次数。如果我们让多个对象同时访问同一个资源时,那么虚拟机将会把这些对象分别放在不同的文件夹中来进行管理。这样就会出现一个问题:如果一个对象被多个方法访问的话,那么当这个对象被调用时,其他的方法就会在一个文件夹中找到该对象并对其进行调用了。
-
四、总结
通过上面的分析,我们已经知道了 java中方法重载的一些基本思想,以及它对我们开发人员带来的好处,那么我们应该如何正确使用这些方法呢?下面就简单谈一下我个人的理解和看法。 首先,对于一个 Java类而言,它必须要有一个或多个方法来实现它的功能。那么问题来了,一个 Java类到底应该有多少个方法呢?对于这个问题, Java语言的设计者是这样规定的:如果没有定义一个方法名为 static的类,那么 Java类应该有8个以上方法(或者方法名中至少包含4个数字);如果没有定义一个方法名为 static的类,那么 Java类应该有20个以上方法(或者方法名中至少包含5个数字)。 其次,对于一个需要多个线程来运行的代码而言,应该给每个线程都分配一个名字为 static的函数来实现它的功能。如果没有给每个线程分配这个函数,那么这些线程都会对同一个 static函数进行调用,那么将会出现问题:当多个线程对同一个 static函数进行调用时,程序就会崩溃。 最后,对于一个需要用到多个文件夹来存储数据的代码而言。
Java方法的重载指的是在同一个类中,方法名相同但参数列表不同的多个方法。以下是一个简单的例子:
```
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
```
在上面的例子中,`Calculator`类中定义了三个名为`add`的方法,它们的参数列表分别为`(int, int)`、`(double, double)`和`(int, int, int)`。这三个方法都是重载方法。
当我们调用`add`方法时,Java会根据传入的参数类型和数量来自动匹配对应的方法。例如:
```
Calculator calculator = new Calculator();
int result1 = calculator.add(1, 2); // 调用第一个add方法,返回3
double result2 = calculator.add(1.5, 2.5); // 调用第二个add方法,返回4.0
int result3 = calculator.add(1, 2, 3); // 调用第三个add方法,返回6
```
注意,方法的返回类型不是方法重载的条件,只有方法名和参数列表才是。
以下是几个常用的Java方法的重载代码:
1. 计算两个整数的和
```
public static int add(int a, int b) {
return a + b;
}
public static double add(double a, double b) {
return a + b;
}
```
2. 判断一个字符串是否包含另一个字符串
```
public static boolean contains(String str, String subStr) {
return str.contains(subStr);
}
public static boolean containsIgnoreCase(String str, String subStr) {
return str.toLowerCase().contains(subStr.toLowerCase());
}
```
3. 获取数组中的最大值和最小值
```
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
public static double getMax(double[] arr) {
double max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
public static int getMin(int[] arr) {
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
public static double getMin(double[] arr) {
double min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
```