定义方法前思考的问题:
- 我要干什么?
- 干这件事情需要什么才能完成?
方法
方法(method)是程序中最小执行单元
重复的代码,具有独立功能的代码可以抽取到方法中
方法的好处:
- 提高代码的复用性
- 提高代码的可维护性
注意:
-
方法必须先创建才可以使用,该过程成为方法定义
-
方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用
方法的定义
定义格式:
public static void 方法名 ( ) {
// 方法体;
}
调用格式:
方法名();
注: 方法必须先定义再调用,否则程序报错
无参:
public class Test3 {
public static void main(String[] args) {
System.out.println("Hello World");
method();
System.out.print("Java ");
}
private static void method() {
System.out.print("Hello ");
}
}
有参:
参数:由数据类型和变量名组成 - 数据类型 变量名 例如:int a
定义:
public static void 方法名 (参数1) {
方法体;
}public static void 方法名 (参数1, 参数2, 参数3...) {
方法体;
}
注:法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错。方法定义时,多个参数之间使用逗号( ,)分隔
调用:
方法名(参数);
方法名(参数1,参数2);
public class Test5 {
public static void main(String[] args) {
getSum(6,7);//6,7为实参
}
public static void getSum(int a, int b) {//a,b为形参
int sum = a + b;
System.out.println(sum);
}
}
形参和实参:
形参:方法定义中的参数
实参:方法调用中的参数
方法调用过程中形参和实参必须一 一对应!
exercise:
求圆面积方法
package day7;
public class Test7 {
public static void main(String[] args) {
Area(9);
}
public static void Area(int r){
double res = 3.14*r*r;
System.out.println(res);
}
}
带返回值有参:
方法的返回值就是程序运行的结果
格式:
public static 数据类型 方法名 ( 参数 ) {
return 数据 ;
}
注:方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
调用格式:
直接调用:方法名 ( 实参 ) ;
赋值调用:数据类型 变量名 = 方法名 (实参 ) ;输出调用:System.out.ptintln(方法名(实参))
注:方法的返回值通常会使用变量接收,否则该返回值将无意义
方法注意点
- 方法不调用就不执行
- 方法之间是平级关系,不能互相嵌套定义
- 方法的编写顺序和执行顺序无关
- 返回值类型为void表示该方法没有返回值,没有返回值的方法可以省略return语句不写。
- return下面不能编写代码,因为永远执行不到,属于无效代码
Return关键字
方法无返回值:可以省略不写。
方法有返回值:必须要写。表示方法返回值和返回结果
方法的重载
方法的名称相同,但方法的参数不同(个数,类型,顺序)
例如:
add(int a,int b);
add(int a,int b,int c);
public class Test10 {
public static void main(String[] args) {
compare((byte)1, (byte)2);
}
public static void compare(byte b1, byte b2) {
System.out.println(b1 == b2);
}
public static void compare(int b1, int b2) {
System.out.println(b1 == b2);
}
}
方法与内存
方法调用基本原理:
众所周知,方法在执行过程中是存储在栈内存中的,栈的特性是先进后出,后进先出。如下图所示:在程序执行过程中,方法1先进入栈内存,方法2次之,最后是方法3。方法执行完毕后方法按照后进先出的顺序出栈。
基本数据类型和引用数据类型:
基本数据类型:整数、浮点数、布尔、字符
引用数据类型:除了基本数据类型都是
基本数据类型:
基本数据类型变量中存储的是真实的数据
引用数据类型:
当一个变量中存储的不是真实的数据而是其他空间的地址值的时候,这个变量就是引用数据类型(只要是new出来的就是引用数据类型)
基本数据类型:其数据值是存储在自己的空间中的
引用数据类型:数据值存储在其他空间之中的,自己空间中存储的是地址值
方法的值传递:
1.基本数据类型:
number在程序执行完成后,其值仍然是100;因为程序在执行到change()方法时候,200是赋值给的change中的number,为局部变量。传递基本数据类型时,传递的是真实的数据,形参改变不影响实际参数的值
public class Test1 {
public static void main(String[] args) {
int number = 100;
System.out.println(number);
change(number);
System.out.println("后:"+number);
}
private static void change(int number) {
number = 200;
}
}
2.引用数据类型
将改为引用数据类型后,执行后arr[1]的值变为2000。因为change方法中的number[] 数组和arr[]数组都是指向的同一处堆内存地址空间。number数组修改的值是直接修改指向的堆内存地址所对应的值。传递引用数据类型时候,传递到是地址值,形参的改变,影响实际参数的值。
public class Test3 {
public static void main(String[] args) {
int[] arr = {1,2,3,8};
System.out.println(arr[1]);
change(arr);
System.out.println("后:"+arr[1]);
}
private static void change(int[] number) {
number[1] =1000;
}
}
方法细节
方法中return和break的区别:
return:和循环无关,表示方法结束和返回的结果
break:和方法无关,表示结束循环和switch
public static boolean Containsx(int key,int[] arr){
for (int i = 0;i<arr.length;i++){
if (arr[i] == key){
return true;
}
}
return false;
}