Java方法是语句的集合,它们在一起执行一个功能。
可以把经常会用到的一个功能的代码写到成一个方法,每当需要使用这个代码时,只需要调用这个方法即可,可以提高代码的重用性,让代码程序更简洁,后期也更加容易维护。
1、方法的定义
修饰符 返回值类型 方法名(形参1,形参2){
方法体;
return 返回值;
}
根据方法的放回值确定方法的返回值类型,如果方法没有返回值,那就在返回值使用关键字void, 括号里面的形参可以有多个,也可以没有,如果有需要使用形参,需要在在形参中先定义形参的类型
例1:定义一个比较两个整型变量的大小的方法
public static int getMax(int a,int b){// 有返回值
int c = a>b?a:b;
return c;
}
public static void sout(){// 无返回值
System.out.println();
}
当定义好了这个方法之后如果需要比较两个整型变量的大小,则可以直接调用这个方法;
2、方法的调用
若调用无返回值的方法,只需要使用‘方法名(参数)’即可使用
对有返回值的方法需要先定义好与方法返回值类型相同的变量或常量用来接收方法的返回值
例2:调用例1中的方法
public static void main(String[] args) {
int max = getMax(8,6);// 调用有返回值的方法
sout();// 调用无返回值的方法
}
3、形参和实参
在创建方法时括号里面定义的值是形参,形参只可以在方法体中使用;
在调用方法时传递给方法的参数是实参,当实参是基本数据类型时,传递的是具体的值,不会因为形参的改变而改变,当实参是引用数据类型时,传递的是实参的地址,会因为形参的改变而改变。
例3:在方法体内改变了a和b的值,但是在方法体外a和b的值并没有改变
public static void Test1(int a,int b){
a = 5;
b = 10;
System.out.println("方法体内:a="+a+"\tb="+b);
}
public static void main(String[] args) {
int a = 0,b = 0;
Test1(a,b);
System.out.println("方法体外:a="+a+"\tb="+b);
}
输出结果:
方法体内:a=5 b=10
方法体外:a=0 b=0
4、方法的重载
一个类的两个方法拥有相同的名字,但是有不同的参数列表,方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。
在例1中定义的方法getMax只能用于两个int类型的值进行比较,如果是两个double类型的变量,或者是三个int类型的变量需要进行找出最大值,这个时候我们就可以使用方法的重载。
例3:使用相同的方法名称getMax,但通过不同的参数,实现不同的功能
public static int getMax(int a,int b){// 两个int类型
int c = a>b?a:b;
return c;
}
public static double getMax(double a,double b){// 两个double类型
double c = a>b?a:b;
return c;
}
public static int getMax(int a,int b,int c) {// 三个int类型
int d = a > b ? a : b;
d = d > c ? d : c;
return d;
}
注意:重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。
5、方法的参数传递
Java中只有值传递,没有引用传递!!!
5.1 基本数据类型的传递
对于基本数据类型的参数,形式参数的改变,不影响实际参数的值
例:
public static void Test2(int num){
num = 256;
System.out.println("方法体内:num="+num);
}
public static void main(String[] args) {
int num = 128;
Test2(num);
System.out.println("方法体外:num="+num);
}
输出结果:
方法体内:num=256
方法体外:num=128
5.2 引用数据类型的传递
例:
public class Test01 {
public static void main(String[] args){
People p1 = new People(100);
People p2 = new People(200);
System.out.println(p1.ID+","+p2.ID); // 输出为100,200
change(p1,p2);
System.out.println(p1.ID+","+p2.ID); // 输出为110,210
}
public static void change(People p1,People p2){
p1.ID += 10;
p2.ID += 10;
System.out.println(p1.ID+","+p2.ID); // 输出为110,210
}
}
// 定义一个People类
class People{
public int ID;
public People(int ID) {
this.ID = ID;
}
public People(){
}
}
传递引用数据类型People的属性ID在方法体中发生了改变,方法调用完之后依旧生效。
但是如果更改了方法的话,就会发现形参改变,实参并不会发生改变
例:
public static void main(String[] args){
People p1 = new People(100);
People p2 = new People(200);
System.out.println(p1.ID+","+p2.ID); // 输出为100,200
change(p1,p2);
System.out.println(p1.ID+","+p2.ID); // 输出为100,200
}
public static void change(People p1,People p2){// 交换p1和p2
People temp ;
temp = p1;
p1 = p2;
p2 = temp;
System.out.println(p1.ID+","+p2.ID); // 输出为200,100
}
// 定义一个People类
class People{
public int ID;
public People(int ID) {
this.ID = ID;
}
public People(){
}
}
通过上述两个例子的区别,我们不难发现,当方法的参数是引用数据类型时,也是值传递,但是由于传递的值和实参指向的是同一个对象,所以修改方法中对象的属性,也会修改方法外对象的属性。