方法
方法的声明:
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
return关键字
1.使用范围:使用在方法体中
2.作用:
- 结束方法
- 针对于返回值类型的方法,使用"return 数据"方法返回所要的数据。
3.注意点:return关键字后面不可以声明执行语句。
方法的重载
定义: 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
总结:“两同一不同”:同一个类、相同方法名
参数列表不同:参数个数不同,参数类型不同
例子:
package object_oriented;
import java.util.Scanner;
/*
* 2.编写程序,定义三个重载方法并调用。方法名为mOL。
三个方法分别接收一个int参数、两个int参数、一个字符串参数。分别
执行平方运算并输出结果,相乘并输出结果,输出字符串信息。
在主类的 main () 方法中分别用参数区别调用三个方法。
*/
public class Reload {
int m;
int n;
String c;
public static void main(String args[]) {
java.util.Scanner scan = new java.util.Scanner(System.in);
//创建对象
Reload ob = new Reload();
//实参赋值
System.out.println("请输入m的值:");
ob.m = scan.nextInt();
System.out.println("请输入n的值:");
ob.n = scan.nextInt();
ob.c = "shenyinhong";
//调用重载方法
ob.moL(ob.m);
ob.moL(ob.m,ob.n);
ob.moL(ob.c);
}
//以下几个方法变量名和类都相同,但是参数个数不同,参数类型不同,构成方法重载
public void moL(int m) {
System.out.println("m平方为:"+ m*m);
}
public void moL(int m,int n) {
System.out.println("m和n乘积为:"+ m*n);
}
public void moL(String m) {
System.out.println("字符串为:"+m);
}
}
不构成重载举例:
如下的3个方法不能构成重载
// public int getSum(int i,int j){
// return 0;
// }
// public void getSum(int m,int n){
//
// }
// private void getSum(int i,int j){
//
// }
可变形参
//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量 public static void test(int a
,String[] books); //JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量 public static void
test(int a ,String…books);
- 可变形参的格式:数据类型…变量名
- 与本类中方法名相同,形参不同的方法之间构成方法重载
- 与方法名相同,形参类型也相同的数组之间不构成重载
- 可变个数形参在方法的形参中,必须声明在末尾
例子:
package object_oriented;
public class Varparameter {
public static void main(String args[]) {
Varparameter test = new Varparameter();
test.show("hello");
test.show("hello","world");
test.show();
test.show(new String[]{"AA","BB","CC"});
}
public void show(int i){
}
public void show(String s){
System.out.println("show(String)"+s);
}
public void show(String ... strs){
System.out.println("show(String ... strs)");
for(int i = 0;i < strs.length;i++){
System.out.println(strs[i]);
}
}
}
值传递机制
基本数据类型:传递的是变量值
引用数据类型:传递的是变量所保存的地址值
例子:
package object_oriented1;
public class Valuepass {
public static void main(String args[]) {
//基本数据类型值传递
Valuepass ob = new Valuepass();
int m = 10;
int n = 20;
ob.swap(m, n);
System.out.println(m+","+n);//结果未进行交换,局部变量在方法结束后自动销毁
//引用数据类型值传递
Data data = new Data();
data.m=10;
data.n = 20;
ob.swap(data);
System.out.println(data.m+","+data.n);
//结果进行了交换,传递的参数是引用数据类型,交换的是地址
}
public void swap(int a,int b) {
int temp = b;
b = a;
a = temp;
}
public void swap(Data data) {
int temp = data.m;
data.m = data.n;
data.n = temp;
}
}
class Data{
int m;int n;
}
递归方法
定义:一个方法体内调用它自身。
直接上例子吧
package object_oriented1;
/*
* 递归调用
*/
public class Recursion {
public static void main(String[] args) {
Recursion getsum = new Recursion();
int sum = getsum.sum(100);
System.out.println("1-100的和:"+sum);
System.out.println("f(10)的值为:"+getsum.shulie1(10));
System.out.println("10!的值为:"+getsum.jiecheng(10));
}
/*计算1-100之间所有自然数的和
*
*/
public int sum(int m) {
if(m == 1){
return 1;
}else{
return m + sum(m - 1);
}
}
/*
* 已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0
的整数,求f(10)的值。
*/
public int shulie1(int m) {
if(m == 0) {
return 1;
}else if(m == 1) {
return 4;
}else {
return 2*shulie1(m-1)+shulie1(m-2);
}
}
/*
* :请用Java写出递归求阶乘(n!)的算法
*/
public int jiecheng(int n) {
if(n == 1) {
return 1;
}else {
return jiecheng(n-1)*n;
}
}
}