本篇主要介绍Java语言中的面向对象中的成员方法及方法的重载。
13 成员方法
成员方法,即类内部定义的方法,成员方法是类的动态行为。
13.1 方法的签名
一个方法的签名是由方法名和参数列表两部分构成。
13.2 方法重载
方法重载(OverLoad)是指方法名相同(包括大小写),但方法签名不相同的方法。通俗的说,重载就是多个方法的方法名相同,但参数列表不同(比如上一章讲到的构造方法的重载)。
方法重载是类的多态的一种体现,属于编译时的多态。
13.2.1 何为参数列表不同
由于方法定义时的参数列表中的参数,属于形参。因此涉及到参数列表不同,主要是以下几种情况:
1)参数个数不同
func()
func(int a)
func(int a, int b)
上述代码中,定义的三个方法(省略了方法的其他要素)的参数列表各不相同,因为其参数的个数是不同的,因此参数列表肯定不相同。
2)参数个数相同时,至少有一个对应位置的参数类型不同
func(int a,int b)
func(int a,double b)
上述代码中,两个方法的参数列表的参数个数相同,但第二个参数的类型是不同的,因此上述两个方法的参数列表也是不相同的。
注意:仅形参的参数名不同,参数列表是相同的。
func(int a, int b)
func(int num1,int num2)
上述代码中,两个方法的参数列表虽然参数名是不同的,但参数个数和对于位置上的参数类型是相同的,因此上面两个方法的签名是相同的。
13.2.2 方法重载
在同一个类内部,不允许存在相同方法签名的成员方法。
但允许存在成员方法的重载。
public class Demo{
public int add(int num){
return num;
}
public int add(int a, int b){
return a+b;
}
public double add(int a, double b){
return a+b;
}
}
上述代码中的三个成员方法add都属于重载,因为这三个方法的方法名相同,但参数列表是不同的。方法的重载跟方法的返回值类型是否相同没有关系。
13.3 重载方法的调用
重载方法的调用,遵循就近规则:
1、如果调用时传入的实参类型与重载中的某个方法的形参类型完全相同,则调用该方法。
2、如果调用时传入的实参类型与重载的方法都不相同,则进行隐式的类型转换,就近转为哪个方法的参数类型则调用哪个方法。
public class Demo{
public int add(int num){
return num;
}
public int add(int a, int b){
return a+b;
}
public double add(int a, double b){
return a+b;
}
}
public static void main(String[] args) {
Demo demo = new Demo();
int res = demo.add(20);//调用add(int)
double result = demo.add(2,3);//调用add(int,int)
short num1 = 10;
result = demo.add(20,num1);//调用add(int,int)
result = demo.add(10,20L);//调用add(int,double)
result = demo.add(10L,20);//编译出错
}
上述代码中重载方法的调用,add(20)和add(2,3)分别有参数类型完全相同的方法,直接调用对应的方法即可。
add(20,num1)由于num1是short类型,short到int和double类型都是可以自动发生隐式转换,但是,short类型与int类型更近,因此调用的是add(int,int)。
add(10,20L)由于20L是属于long类型,可以隐式的转为double类型,不能自动转为int类型,因此调用的是add(int,double)
add(10L,20)由于10L是long类型,不能隐式转为int类型,因此编译出错。
13.4 方法参数的传递规则
Java中的数据类型大体可以分为两种:基本数据类型和引用类型。
方法调用时,参数的传递,不管是基本数据类型还是引用类型,都是基于值的传递。
public class Swap {
public void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
public void swap(int[] a,int[] b){
int[] tmp = a;
a = b;
b = tmp;
}
}
public static void main(String[] args) {
int a = 10;
int b = 20;
int[] arr1 = {1,2,3};
int[] arr2 = {4,5,6};
Swap s = new Swap();
s.swap(a, b);//输出a=10;b=20
System.out.println("a="+a+";b="+b);
s.swap(arr1, arr2);
System.out.println("arr1="
+Arrays.toString(arr1));//arr1=[1, 2, 3]
System.out.println("arr2="
+Arrays.toString(arr2));//arr2=[4, 5, 6]
}
上述代码Swap类中的swap方法,将传入的两个参数进行了交换,但实际上并没有生效,因为不管是传入的基本数据类型还是引用类型,都是基于值传入的。(引用类型传入的是引用值即地址)
下一篇将介绍Java中的package和import关键字。