1.方法的重载(overload)
(1).概念 : 在同一个类中,允许存在一个以上的同名方法,只要他们的参数列表不同即可.
(2).重载的特点 : 与修饰符,返回值类型无关,只看参数列表,且参数列表必须不同(可以是参数个数不同或参数类型不同).调用时,根据方法参数列表不同来区别.
(3).重载方法调用 : JVM通过方法的参数列表,调用匹配的方法.
- 先找个数,类型最匹配的.
- 再找个数和类型可以兼容的,如果多个方法同时兼容将
public class Text01 { public static void main(String[] args) { OverLoad p1 = new OverLoad(); int a1 = p1.m0L(3); System.out.println("方法1的结果是" + a1); int a2 = p1.m0L(2, 4); System.out.println("方法2的结果是" + a2); p1.m0L("输出方法三"); } } class OverLoad { public int m0L(int a) { return a * a; } //该处编译错报错,方法名相同,参数列表相同,由于与返回值类型无关,不是重载 //public void m0L(int a) { //; //} public int m0L(int a, int b) { return a * b; } public void m0L(String a) { System.out.println(a); } }
2.可变个数形参的方法
(1)使用场景 : 在调用方法时,可能会出现方法形参的类型是确定的,但参数的个数不确定.此时我们可以使用可变个数形参的方法.
(2)格式 : (参数类型 ...参数名)
(3)说明注释 :
- 可变个数形参的方法在调用时,传进去的实参个数可以是0个,1个或多个.
- 可变个数形参的方法与在同一个类中,同名的方法构成重载.
- 特例 : 可变个数形参的方法在同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载.(int... a被当做int[] a处理,遍历时可以使用a.length属性)
- 形参列表最后可变个数的形参必须声明在形参列表最后.
- 可变个数的形参最多在一个方法的形参列表中出现一次.
public class Text03 { public static void main(String[] args) { TexT p1 = new TexT(); //可变参数的方法,括号内可以为0个 // p1.text(); // p1.text(1, 2); p1.text(1, 2, 3, 4, 6); } } class TexT { public void text(int... a) { System.out.println("111"); //对传入的实参进行遍历 for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } //参数列表不同,可以构成重载 public void text(double b) { System.out.println("222"); } //编译器报错,不能构成重载 // public void text(int[] a) { // System.out.println("333"); // } //该是允许的,可变个数形参在后 // public void text(int i, int... a) { // System.out.println("444"); // } //编译器报错 // public void text(int...a, int i) { // System.out.println("444"); // } //编译器报错 // public void text(int... a, double... b) { // System.out.println("555"); // } } 111 1 2 3 4 6
3.方法的值传递机制
(1).形参和实参
- 形参 : 在定义方法时,方法名括号内声明的变量称为形式参数,简称形参.
- 实参 : 在调用方法时,方法名括号中使用的值/变量/表达式称为实际参数,简称实参.
(2).参数传递机制 : 值传递
- java里参数的传递方式只有一种:值传递.则将实际参数的副本传入方法内,而参数本身不受影响.
- 形参如果是基本数据类型,将实参基本数据类型变量的"数据值"传递给形参.
- 形参如果是引用数据类型,将实参基本数据类型变量的"地址值"传递给形参.
(3).举例 该处swap方法是个交换方法
- int a =10,int b =10,swap(x,y),实现:x=a,y =b,当调用swap时产生一个栈桢,存储的是数据10(x)和数据10(y).
- 该处Employee是一个员工类,Employee a,Employee b,swap(x,y).实现Employee x =a,Employee b =y.由于是值传递,(否定了引用传递).x其实是a的一个副本,y是b的一个副本,调用swap时产生一个栈桢,存储的是指向a,b对象的地址值.调用方法后,二者引用并没有发生改变.最终导致x指向了对象b,y指向了对象a.