一、方法的重载
- 定义:在同一个类中,允许存在一个或以上的同名方法,只要它们的参数个数或者参数类型不同即可.
"两同一不同" : 同一个类、相同方法名
参数列表不同,参数个数不同,参数类型不同
- 举例:
Arrays类中重载的sort() / binarySearch()
- 判断是否是重载:
跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!
- 在通过对象调用方法时,如何确定某一个指定的方法:
方法名-------->参数列表
package day06;
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.getSum(1, 2);
}
//如下的4个方法构成了重载
public void getSum(int i, int j) {
System.out.println("方法一");
}
public void getSum(double d1, double d2) {
System.out.println("方法二");
}
public void getSum(String s, int i) {
System.out.println("方法三");
}
public void getSum(int i, String s) {
System.out.println("方法四");
}
}
二、可变形参的方法
- 可变个数形参的格式: 数据类型 ... 变量名
- 当调用可变个数形参的方法时,传入的参数个数可以是"0个,1个,2个,....
- 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
- 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载-----二者之间不能共存
- 可变个数形参在方法的形参中,必须声明在末尾
package day06;
/*可变个数形参的方法
*
* 1.JDK 5.0新增的内容
* 2.具体使用:
* 2.1 可变个数形参的格式: 数据类型 ... 变量名
* 2.2 当调用可变个数形参的方法时,传入的参数个数可以是"0个,1个,2个,....
* 2.3 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
* 2.4 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载-----二者之间不能共存
* 2.5 可变个数形参在方法的形参中,必须声明在末尾
*
* */
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.show(12);
demo.show("hello");
demo.show("hello","hello1","hello2");
demo.show();
}
public void show(int i) {
System.out.println(i);
}
public void show(String s) {
System.out.println(s);
}
public void show(String ... str) {
System.out.println("可变个数形参");
}
// public void show(String[] str) {
// System.out.println("可变个数形参");
// }
}
二、变量的值传递机制
- 如果变量是基本数据类型,此时赋值的是变量所保存是数据值
- 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值
package day06;
/*
* 关于变量的赋值:
*
* 如果变量是基本数据类型,此时赋值的是变量所保存是数据值
* 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值
*
* */
public class Demo {
public static void main(String[] args) {
System.out.println("*********************基本数据类型*********************");
int m = 10;
int n = m;
System.out.println("m =" + m + ",n=" + n);
n = 20;
System.out.println("m =" + m + ",n=" + n);
System.out.println("*********************引用数据类型*********************");
Order o1 = new Order();
o1.orderId = 1001;
Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向了堆空间中同一个对象实体
System.out.println("o1.orderId =" + o1.orderId + ",o2.orderId =" + o2.orderId);
o2.orderId = 1002;
System.out.println("o1.orderId =" + o1.orderId + ",o2.orderId =" + o2.orderId);
}
}
class Order {
int orderId;
}
三、方法的形参的传递机制:基本数据类型
- 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值(不是地址值)
package day06;
/*
* 方法的形参的传递机制:基本数据类型
*
* 1.形参: 方法定义时,声明的小括号内的参数
* 实参: 方法调用时,实际传递给形参的数据
*
* 2.值传递机制:
* 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值(不是地址值)
* */
public class Demo {
public static void main(String[] args) {
// 交换两个变量的值的操作
int m = 10;
int n = 20;
System.out.println("m=" + m + ",n=" + n);
//交换
//int temp = m;
//m = n;
//n= temp;
Demo demo = new Demo();
demo.swap(m, n);
//并没有交换成功
System.out.println("m=" + m + ",n=" + n);
}
//错误方法
public void swap(int m,int n) {
int temp = m;
m = n;
n= temp;
}
}
四、方法的形参的传递机制:引用数据类型
- 如果参数是引用数据类型,此时实参赋给形参的是是地址值
package day06;
public class Demo {
public static void main(String[] args) {
Data data = new Data();
data.m = 10;
data.n = 20;
System.out.println("m=" + data.m + ",n=" + data.n);
// 交换m和n的值
// int temp = data.m;
// data.m = data.n;
// data.n= temp;
Demo demo = new Demo();
demo.swap(data);
System.out.println("m=" + data.m + ",n=" + data.n);
}
//成功
public void swap(Data data) {
int temp = data.m;
data.m = data.n;
data.n = temp;
}
}
class Data {
int m;
int n;
}
五、递归方法
- 递归方法:一个方法体内调用它自身。
- 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
- 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
package day06;
/*
* 递归方法的使用(了解)
* 1.递归方法:一个方法体内调用它自身
* 2.方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无需循环控制.
* 递归一定要向己方向递归,否则这种递归就变成了无穷递归,类似于死循环.
*
*
* */
public class Demo {
public static void main(String[] args) {
// 例1:计算1-100之间所有自然数的和
// 方式一:
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
// 方法二:
Demo demo = new Demo();
int sum2 = demo.getSum(100);
System.out.println(sum);
System.out.println(sum2);
}
// 例2:计算1-100之间所有自然数的乘积
public int getSum(int n) {
if (n == 1) {
return 1;
} else {
return n * getSum(n - 1);
}
}
}