方法
方法的声明和定义
DEF
方法是一种语法结构,它可以把一段代码封装成一个功能,以方便重复调用
-
提高了代码的复用性
-
让程序的逻辑更清晰
// 例如:要计算两个数相加,计算两次 // 会发现代码重复的有很多,所以可以使用方法 int a = 10; int b = 20; int c = a+b; System.out.println(c); int a1 = 10; int b1 = 20; int c1 = a1 + b1; System.out.println(c1);
可以发现使用方法可以减少很多代码冗余
public class Main { public static void main(String[] args) { int c2 = sum(10,20); // 直接调方法将值赋值给c2 System.out.println(c2); int c3 = sum(20,20); System.out.println(c3); } public static int sum(int a , int b){ int c = a+b; return c; } }
方法的声明
方法分为方法头和方法体,一般情况每一个方法秉持只做一件事的原则
修饰符 返回值类型 方法名(形参列表){ 方法体代码(需要执行的功能代码); return 返回值; }
修饰符
-
public
表示该方法是公共方法,可以被其他类访问 -
static
表示该方法是静态方法,可以直接通过类名调用 -
void
表示该方法没有返回值 -
main
是方法名,是单个Java类型程序的入口方法,程序从这里开始执行 -
String[] args
是参数列表,是命令行参数的字符串数组,可以用来向程序传递参数
注意:
-
如果方法不需要返回结果,返回值类型必须申明成
void (无返回值)
, 此时方法内部不可以使用return
返回数据 -
返回如果没有参数,或者返回值类型申明为void 可以称为无参数,无返回值的方法
定义方法时候有以下几个注意点:
-
方法名称: 自己取名 , 有意义,英文小写,驼峰模式(有意义的名字)
-
方法体代码: 完成自己需要写的功能代码即可
-
真正需要关注的点:
-
分析方法是否需要申明返回值类型,
-
分析方法是否需要接收参数
方法的调用和参数:
调用方法,即执行该方法。发出调用的方法称为主调方法,被调用的方法称为被调用方法
int larger = max(30,40);
-
在main方法区调用方法,被调用的方法需要使用
static
修饰(静态) -
static
方法调用使用同一个类中的方法,可以直接用方法名()
调用 -
static
方法只能直接调用static
方法 -
一个方法可以被多次调用
-
跨类调用
static
方法需要用类名.方法
注意,当:
-
被调用方法所在的类如果和调用方法的类在同一个包下,不需要导包
-
java.lang
包下的类都不需要导包
其他情况需要导包
调用
(可以理解为)调用方法的前提条件。
方法参数可以有多个参数,每个参数都需要声明类型
声明的参数是形参(形式参数)
public static int Text(int num1, int num2, int num3){ num1++; ++num2; num3--; return num1+num2+num3; }
调用方法时,必须按照参数列表的类型,顺序依次传入参数才可以调用。
传入的参数是实参(实际参数)
public static void main(String[] args){ int num1 = 0; int num2 = 0; int num3 = 0; int sum =Text(num1,num2,num3); System.out.println(sum); }
参数的传递
-
JDK1.5开始,Java支持传递同类型的可变参数给一个方法。
-
在方法声明中,在指定参数类型后加一个省略号(…)。
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数都必须在它之前声明。
public class Demo04 { public static void main(String[] args) { //调用可变参数的方法 printMax(12,213,421,512.4); printMax(new double[]{1,2,3}); }
public static void printMax(double... numbers){ if (numbers.length==0){//判断传递参数的长度 System.out.println("No argument passed"); return; } double result = numbers[0];//定义返回值为一个数组 //排序 for (int i = 1; i < numbers.length; i++) {//此处会比较numbers遍历的时候谁最大,会一直把最大的值赋值给result if (numbers[i]>result){ result = numbers[i]; } } System.out.println("The max value is"+result); } }
方法的重载
方法的重载 重载就是在一个类中,有相同的函数名称,但形参不同的函数。
方法的重载规则:
-
方法名称必须相同。
-
参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
-
方法的返回类型可以相同也可以不相同。
-
仅仅返回类型不同不足以称为方法的重载。
重载中还需注意:
可变长参数和数组的区别:
-
数组作为参数必须要传值,可变长参数则不一定
-
可变长参数只能用于参数列表的最后一个(并且长参数优先度低于其他类型);数组则不一定
-
可变长参数只能在参数列表出现,数组可以定义局部变量
注:两者可以同时在同一个方法的参数列表中出现。但时参数列表只有数组和可变长度参数不同时不是重载方法(不能同时出现)
-
值传递中的内存原理
基本类型的值传递当不调用方法时,或者没有接收值的时候,无法传递
例如
public static void main(String[] args) { int b =10; test(b); System.out.println(b); 此时输出依然是10 } public static void test(int b){ b=30; }
当有接收值的时候:此时会将两个局部变量将值传递
public static void main(String[] args) { int b =10; b=test(b); System.out.println(b); } public static void test(int b){ b=30; } 此时输出是30
但是当传递类型为引用类型的时候:方法指定的是堆中的同一个地址值,因此会改变数组中的大小(与基本类型的区别
,基本类型传递的是真实的值)
因此形参的改变会影响实际输出的值
所以此时的输出值为10和6;
是因为引用类型的值传递,传递的是物理地址,
public static void main(String[] args) { int []a ={10}; System.out.println(a[0]); int []arr = new int[]{b}; test(a); System.out.println(a[0]); } public static void test(int a[]){ a[0] = 6; a = new int[]{4}; }