方法
1.何谓方法
例如前面用到的System.out.println()
println()是一个方法
System是系统类
out是标准输出对象
调用系统类System中的标准输出对象out中的方法println()
在java里,方法不能独立存在,必须属于类或对象
2.方法定义
修饰符:
告诉编译器如何调用该方法,定义了访问类型
返回值类型(returnValueType):
方法返回值的数据类型,有些方法没有返回值,returnValueType是关键字void
方法名:
实际方法名称
参数类型:
参数像是一个占位符,方法被调用时,传递值给参数,这个值为实参。方法可以不包含任何参数
- 形参:调用时用于接收外界输入数据
- 实参:调用时实际传给方法的数据
3.方法调用
当方法返回一个值的时候,方法调用通常被当作一个值,例如:
int larger = max(3,4);
当方法返回值是void,方法调用一定是一条语句。例如上面提到的方法println()返回void,调用的话:
System.out.println(“Hello,World”);
4.方法的参数传递机制
如果声明方法时包含了形参,则调用时必须为形参传入实参。
Java里参数传递方式只有一种:值传递–即将实参的副本(复制品)传入方法内,参数本身不受影响
-
基本数据类型参数传递:
package com.method; public class Demo { 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 = 3; int b = 4; swap(3,4); System.out.println("交换结束后a的值是:"+a+",b的值是:"+b); } }
输出:
swap该方法里a的值是:4,b的值是:3
交换结束后a的值是:3,b的值是:4当程序执行swap方法时,将main方法中的实参传入swap方法,此时传入的只是a,b的副本,不是a,b本身,当swap栈区对a,b进行交换后,main栈区的a与b本身未发生改变,这就是值传递的本质
-
引用数据类型参数传递
package com.method; public class Demo1 { public static void swap(DateWrap dateWrap){ int temp = dateWrap.a; dateWrap.a = dateWrap.b; dateWrap.b = temp; System.out.println("swap方法里a成员变量的值是:"+dateWrap.a+"b的值是:"+dateWrap.b); } public static void main(String[] args) { DateWrap dateWrap = new DateWrap(); dateWrap.a = 6; dateWrap.b = 9; swap(dateWrap); System.out.println("main();方法里a成员变量的值是:"+dateWrap.a+"b的值是:"+dateWrap.b); } }
输出:
swap方法里a成员变量的值是:9b的值是:6
main();方法里a成员变量的值是:9b的值是:6此时形参受影响的原因是值传递过程中传递的是变量的引用,而改变的确实对象中成员变量本身,因此交换后main方法中实参依旧指向对象本身,只是对象本身被改变了
5.方法重载
package com.liu.method;
public class OverLoad {
public void test(){
System.out.println("无参数");
}
public void test(String msg){
System.out.println("重载的test方法"+msg);
}
public static void main(String[] args) {
OverLoad ol = new OverLoad();
//调用test()时没传入参数,因此系统调用无参方法
ol.test();
ol.test("hello");
}
}
一个类中两个方法有同样的名字,但有不同的参数列表(个数,类型,参数排列顺序),称作方法重载
6.可变参数
在方法声明中,在指定参数类型后加一个省略号(…)。
一个方法只能指定一个可变参数,它必须是方法的最后一个参数。
package com.method;
public class Varargs {
//定义了形参个数可变的方法
public static void test(int a,String...books){
//public static void test(int a,String[] books)两者效果完全一样
//books被当作数组处理
for (String book : books) {
System.out.println(book);
}
System.out.println(a);
}
public static void main(String[] args) {
test(5,"百年孤独","白鹿原");
//test(5,new String[]{"百年孤独","白鹿原"});使用后者传参调用时必须传入数组
}
}
7.递归
递归就是:A方法调用A方法,因此在设计递归时,一定要指明什么时候自己不用调用自己,否则即为死循环!
递归结构包括两个部分:
- 递归头:什么时候不用调用自身方法,如果没用头,将陷入死循环
- 递归体:什么时候需要调用自身方法
【演示:5的阶乘】
package com.liu.method;
public class Recursive {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int fn(int n){
if(n==1)
return 1;
else
return n*f(n-1);
}
}
能不递归就不递归,递归都可以用迭代来代替