方法
方法简介
- 方法是为了解决有序步骤的问题的
- 方法包含在累和对象中
- 方法在程序中创建 在其他地方被调用
方法最好只完成一个功能 便于后来扩展
值传递和引用传递的区别
1.值传递
package arrayDemo;
public class Demo1 {
public static void main(String[] args) {
int b =20;
change(b);// 实参 实际上的参数
System.out.println(b);
}
public static void change(int a){//形参 形式上的参数
a=100;
}
}
结果:20
通俗的讲法就是:形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变;
再通俗的讲法就是:
小明去餐厅吃饭,看见别人点的红烧肉挺好吃,就把服务员叫过来,说我要一份红烧肉,服务员从后厨拿来一份红烧肉,小明吃完了,但是他吃的红烧肉跟旁边那个人吃的是一份吗?当然不是。
再来解释引用传递
2.引用传递
实参传递给形参的是参数对于 堆内存上的引用地址 实参和 形参在内存上指向 了同一块区域 对形参的修改会影响实参
[](javascript:void(0)😉
package arrayDemo;
public class Demo1 {
public static void main(String[] args) {
int [] a={1,2,3};
System.out.println(a[0]);
change(a);
System.out.println(a[0]);
}
public static void change(int[] a ){
a[0]=100;
}
}
[](javascript:void(0)😉
结果:1 100
为什么?
由于引用传递,传递的是地址,方法改变的都是同一个地址中的值,
原来a[0]指向0x13地址,值是1,
后来在a[0] 指向的也是0x13地址,将值变成了100
所以,再查询a[0]的值的时候,值自然变成了100
通俗点的讲法就是:
小明回到家,他妻子说:冰箱二层有一只鸡,你去做了;
小明做好了,叫妻子过来吃饭。
这个时候,他妻子现在看见的鸡和她买回来的一样吗?
当然不一样,都做熟了;
什么意思呢?
鸡就是数据
冰箱二层就是存储数据的地址
把鸡做熟了就是相当于把值改变了
地方还是那个地方,就是鸡变了。
方法的重载
重载就是在一个类中 有相同的函数名称 但是形参不同
- 方法名称必须相同
- 参数列表必须不同(个数不同 类型不同 参数排列不同)
实现理论:方法名称相同的时候 编译器会根据调用的方法的参数个数 类型去逐个匹配 以旋转对应的方法 如果匹配失败 则编译器就会报错
package JAVA.method;
public class Demo2 {
public static void main(String[] args) {
double larger1=max(10.0,20.0);
int larger2=max(10,20);
System.out.println(larger1);
System.out.println(larger2);
}
//比大小
public static int max(int numb1,int numb2){
int result;
if(numb1==numb2){
System.out.println("numb1和numb2相等");
return 0;//终止方法
}
if(numb1>numb2){
result = numb1;
}
else {
result = numb2;
}
return result;
}
//重载
public static double max(double numb1,double numb2){
double result=0;
if(numb1==numb2){
System.out.println("numb1和numb2相等");
return 0;//终止方法
}
if(numb1>numb2){
result = numb1;
}
else {
result = numb2;
}
return result;
}
}
命令行传递参数
因为此处有package 所以打开路径必须在JAVA之上也就是src中
但是更改路径之后还是没能运行 错误未知
package JAVA.method;
public class Demo3 {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args[+"+i+"]:"+args[i]);
}
}
}
可变参数(不定项参数)
- 在指定参数后加一个省略号
- 一个方法中只能指定一个可变参数 而且他必须是方法的最后一个参数 其他参数必须在这之前
- 而且必须是一种类型
- 他们传递的值 本质就是数组
package JAVA.method;
public class Demo4 {
public static void main(String[] args) {
printMax(16,58,69,77,84,98);
printMax(new double[]{15,58,79});
}
public static void printMax(double...numbers){
if(numbers.length==0){
System.out.println("没有传入值");
return;
}
double result =numbers[0];//第一个值放到数组第0位
//排序
for (int i = 1; i < numbers.length; i++) {
if(numbers[i]>result){
result=numbers[i];
}
}
System.out.println("最大的值是:"+result);
}
}
递归
递归就是自己调用自己
- 递归头:什么时候不调用自身 出口
- 递归体:什么时候需要调用自己 过程
边界条件 边界
前阶段
返回阶段
package JAVA.method;
public class Demo6 {
/*
阶乘
2! 2*1
3! 3*2*1
4! 4*3*2*1
*/
//递归思想
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n){
if(n==1){
return 1;
}
else {
return n*f(n-1);
}
}
}