目录
====================================================
方法
1.从语义定义的角度来看必须定义在类中,类.方法||实例.方法
2.方法到底属于累还是属于对象:
若有static修饰的方法,属于类本身,而不是属于实例(可以用类调用也可以用实例调用);
若无static修饰的方法,属于实例(仅可以用实例调用)
3.调用方法时,必须要有主调对象(主语,也就是调用者,比如孙悟空.飞 —— 孙悟空就是主调对象,调用飞这个方法)
Java方法的参数传输机制:只有一种 ———— 值传递(副本传递)
/*********************************************************************************************
//示例1:
//派了a,b两个分身过去,但是main函数中的本身a,b的值不变
//因此传参时是一种副本传参,无论副本如何变化,本身的值不会发生变化。应是两个ab的地址不同
public class PrimitiveTransferTest {
public static void swap(int a,int b) {
int temp=a;
a=b;
b=temp;
System.out.println("swap方法里,a是"+a+",b是"+b);
}
public static void main(String[] args) {
int a=6;
int b=9;
swap(a,b);
System.out.println("swap方法使用后,a是"+a+",b是"+b);
}
}
************************************************************************************/
/*********************************************************************************************
//示例2:
//这里【不是】传入swap方法的时ds实例本身而非替代品
//这里同样是两个堆栈,一个是main(),另一个是swap(),也与上一个类类似,传递的值是ds的副本
//但是这里的ds指的是变量(类似指针),也就是两个变量指向堆内存里的同一个对象,而不是复制了一个对象
//故swap的操作是针对堆内存中ds对象操作的,因此有该现象
class DataSwap{
int a;
int b;
}
public class ReferenceTransferTest {
public static void swap(DataSwap ds) {
int temp=ds.a;
ds.a=ds.b;
ds.b=temp;
System.out.println("swap方法里,a是"+ds.a+",b是"+ds.b);
}
public static void main(String[] args) {
DataSwap ds=new DataSwap();
ds.a=6;
ds.b=9;
swap(ds);
System.out.println("使用swap方法后,a是"+ds.a+",b是"+ds.b);
}
}
************************************************************************************/
形参个数可变的方法:定义形参时,用法 type... 形参名(int... num)
注意点:
A. 每个方法最多【只能有一个】形参个数可变的参数
B. 形参个数的参数必须【位于最后】
===================================================
递归方法
递归在里面包含一个隐式循环,递归就是在方法中再次调用自己。
递归,一定要保证:在合适的时候结束调用自身 ———— 即设置递归边界
且,递归边界一定要向“结束”的那一端递归,否则就是一个死循环或死递归,不会产生结果
/*********************************************************************************************
//示例3:
//输出fn(10)递归:递归边界、递归函数、返回值
public class Recursive {
public static int fn1(int n) {
if(n==1) return 4;
if(n==0) return 1;
return fn1(n-1)*2+fn1(n-2);
}
public static int fn2(int n) {
if(n==20) return 1;
if(n==21) return 4;
return fn2(n+2)-2*fn2(n+1);
}
public static void main(String[] args) {
System.out.println(fn1(10));
System.out.println(fn2(10));
}
}
************************************************************************************/
===================================================
方法重载
归纳:二同一不同
所谓二同就是:同一个类、方法名相同
一不同就是:形参列表不同
注意点:A 方法重载与【返回值类型】无关
B 方法重载与【是否有static修饰】无关
怎么才能唯一确定所调用的方法?
A 主调者。 //谁调用了这个方法
B 方法的名字 //调用了哪个方法
C 匹配实参所对应的类型 //怎样调用这个方法
/*********************************************************************************************
//示例4:
//一个类、一个名,唯一不同就是形参类型和个数,如下是String和String[]
public class OverloadVarargs {
public void test(String str) {
System.out.println("一个字符串");
}
public void test(String... str) {
System.out.println("一串字符串");
}
public static void main(String[] args) {
OverloadVarargs overload=new OverloadVarargs();
overload.test("ehdrjkew");
overload.test("wjhgdj","eshfk");
}
}
************************************************************************************/