1、什么是方法?
(1)、什么是方法?
答:方法是程序中最小的执行单元。
(2)、实际开发中,什么时候用到方法?
答:重复的代码、具有独立功能的代码可以抽取到方法中,用的时候直接调用该方法。
(3)、实际开发中,方法有什么好处?
可以提高代码的复用性;可以提高代码的可维护性。
2、方法的定义和调用格式
1、补充内容:
把一些代码打包在一起,用到的时候就调用。
(1)、方法的定义是指:
把一些代码打包在一起,该过程称为方法定义。
(2)、方法调用是指:
方法定义之后并不是直接运行的,需要手动调用之后才能执行,该过程称为方法调用。
(3)、方法需要先定义后调用,否则系统会报错。
(4)、方法的定义要写在main方法的外面,类的里面。
2、最简单的方法定义和调用
定义格式如下:
public static void 方法名(){
方法体(就是打包起来的代码);
}
定义范例如下:
public static void playGame(){
七个打印语句;
}
调用格式如下:
方法名();
调用范例如下:
playGame();
实战:利用方法最简单的格式打印
package sss;
public class test{
public static void main(String[] arg){
("a" + " ");
//调用方法
printGRInfo();
("b" + " ");
}
//定义方法
public static void printGRInfo(){
("c" + " ");
//调用方法
ggg();
("d" + " ");
}
//定义方法
public static void ggg(){
int num1 = 10;
int num2 = 20;
int sum = num1 + num2;
(sum + " ");
}
}
输出结果为:a c 30 d b
3、带参数的方法定义和调用
方法的定义格式如下:
public static void 方法名(参数){
打包的代码
}
public static void 方法名(参数1,参数2,...){
打包的代码
}
范例如下:
public static void method(int number){
打包的代码
}
public static void getSum(int number1,int number2){
打包的代码
}
方法的调用格式如下:
1、单个参数时
方法名(参数);
范例1:method(10);
范例2:method(变量);
2、多个参数
方法名(参数1,参数2,...);
范例1:getSum(10,20);
范例2:getSum(变量1,变量2);
注意事项:
方法调用时,形参和实参必须一一对应,否则程序将报错。
补充:
形参:全称形式参数,是指方法定义中的参数。
实参:全称实际参数,方法调用中的参数。
实战:求圆的面积
package lishuqiang;
import ;
public class sss {
public static void main(String[] arg){
Scanner sc = new Scanner();
int a =(); //键盘录入圆的半径
printGRInfo(a); //方法的调用
printGRInfo(2); //方法的调用
}
//定义方法
public static void printGRInfo(double r){
double area = 3.14*r*r;
("面积为:" + area);
}
}
4、带返回值方法的定义与调用
方法的返回值其实就是方法运行的最终结果。
方法的定义格式如下:
public static 返回值类型 方法名(参数1,参数2,...){
方法体;
return 返回值;
}
范例如下:
public static int getSum(int a,int b){
int c = a + b;
return c;
}
方法的调用如下:
1、直接调用:
方法名(实参);
例如:getSum(1,2);
说明:适合返回值类型是void类型的,方法最终没有产出内容,只是想在方法内打印某些内容。但是返回值不是void的也可以用,只是表示某些内容的执行。
2、赋值调用:
数据类型 变量名 = 方法名(实参);
例如:int sum = getSum(1,2);
说明:返回值为void类型的不能用,因为void类型的没有返回值,不能赋值。适用于返回值类型不是void类型的,作用是可以使用该方法产出的结果。
3、输出调用:
(方法名(实参));
例如:(getSum(1,2));
说明:返回值为void类型的不能用,因为void类型的没有返回值。适用于返回值类型不是void类型的,作用只是表示某些结果的打印。
实战:定义方法,比较两个长方形的面积。
package lishuqiang;
import ;
public class sss {
public static void main(String[] arg){
//键盘录入长方形的长和宽的值
Scanner sc = new Scanner();
("请输入四个数据,分别代表两个长方形的长和宽");
double L1 =();
double w1 =();
double L2 =();
double w2 =();
//调用计算面积的方法
double area1 = printGRInfo(L1,w1);
double area2 = printGRInfo(L2,w2);
if(area1 > area2){
("第一个长方形的面积大");
} else if(area1 < area2){
("第二个长方形的面积大");
} else{
("两个长方形的面积一样大");
}
}
//定义方法
public static double printGRInfo(double len,double width){
double area = len*width;
return area;
}
}
5、方法的注意事项
1、方法不调用就不执行。
2、方法和方法之间是平级关系,不能互相嵌套定义,但是可以嵌套调用。
3、方法的编写顺序和执行顺序无关。
4、方法的返回值类型为void,表示该方法没有返回值,
没有返回值的方法可以省略return语句不写。
如果要编写return,后面不能跟具体的数据。
5、return语句下面,不能编写代码,因为永远执行不到,属于无效的代码。
6、return关键字:
方法没有返回值:可以省略不写。如果写,表示结束方法。
方法有返回值:必须要写。表示结束方法和返回结果。如果方法的返回值类型不为void,则一定要写return语句。
3、方法的重载
1、有一些功能逻辑相同的代码,如果定义不同的方法名,就导致记忆量非常大,不好用,为了简化这个过程,将相同的或者相似功能逻辑的代码,都使用同一个方法名。(例如加法运算,参数不同的情况下就利用重载)
2、在同一个类中,定义了多个同名的方法(方法名前的返回值变量可以不同),这些同名的方法具有同种的功能。每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系。
3、简单记忆就是:同一个类中,方法名相同(方法名前的返回值变量可以不同),参数不同的方法构成了重载关系,与返回值无关。(参数不同指个数不同、类型不同、顺序不同。)
4、Java虚拟机会通过参数的不同来区分同名的方法。
实战如下:
需求:使用方法重载的思想,设计比较两个整数是否相同的方法。
要求:兼容全整数类型(byte、short、int、long)
package lishuqiang;
public class sss {
public static void main(String[] arg){
compare(10,20);
("------------");
byte m = 11;
byte n = 15;
compare(m,n);
}
//用方法的重载定义方法
public static void compare(byte a1,byte a2){
("byte");
(a1 == a2);
}
public static void compare(short b1,short b2){
("short");
(b1 == b2);
}
public static void compare(int c1,int c2){
("int");
(c1 == c2);
}
public static void compare(long d1,long d2){
("long");
(d1 == d2);
}
}
4、方法的三个练习
1、数组遍历。需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上。
例如:[11, 22, 33, 44, 55]
package lishuqiang;
public class sss {
public static void main(String[] arg){
int[] arr = {11,22,33,44,55};
printfArr(arr);
}
//定义方法
public static void printfArr(int[] arr){
("[");
for (int i = 0; i < ; i++) {
if(i == -1){
(arr[i]+"]");
} else{
(arr[i]+", ");
}
}
}
}
补充内容:
("abc"); //先打印abc,再进行换行
("abc"); //只打印abc,不换行
(); //不打印任何数据,只做换行处理
2、数组最大值。
需求:设计一个方法求数组的最大值,并将最大值返回。
package lishuqiang;
public class sss {
public static void main(String[] arg){
int[] arr = {11,22,33,44,16};
int Max = arrMax(arr);
("最大值为" + Max);
}
//定义方法
public static int arrMax(int[] arr){
int max = arr[0];
for (int i = 1; i < ; i++) {
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
}
3、判断是否存在。
需求:定义一个方法,判断数组中的某一个数是否存在,将结果返回给调用处。
package lishuqiang;
import ;
public class sss {
public static void main(String[] arg){
int[] arr = {11,22,33,44,16};
Scanner sc = new Scanner();
int num = ();
boolean relout = arrMax(arr,num);
(relout);
}
//定义方法
public static boolean arrMax(int[] arr,int number){
for (int i = 0; i < ; i++) {
if(arr[i] == number){
return true;
}
}
return false;
}
}
补充内容:
return和break关键字的区别:
return:其实跟循环没什么关系,跟方法有关系,表示 方法结束 或者 返回结果
如果执行到了return,那么整个方法全部结束,里面的循环也会随之结束。
break关键字:跟方法没什么关系,结束循环或者switch的。
4、复制数组。
需求:定义一个方法copyOfRange(int[] arr,int from,int to)
功能:将数组arr中从索引from(包含from)开始。到索引to结束(不包含to)的元素复制到新的数组中,将新的数组返回。
package Test03;
import ;
public class test05 {
public static void main(String[] arg){
int[] arr = {1,2,3,4,5,6,7,8,9};
int[] newArr = copyOfRange(arr,3,7); //调用方法
for (int i = 0; i < ; i++) { //打印新获得的数组
(newArr[i]+" ");
}
}
//定义方法,其中因为返回值为整数型数组,所以返回值类型处写int[]
public static int[] copyOfRange(int[] arr,int from,int to){
int[] arr2 = new int[to-from];
int j = 0;
for(int i = from;i < to;i++){
arr2[j] = arr[i];
j++;
}
return arr2; //返回值类型为数组时,只写数组名
}
}
/*算法分析:
假如数组为 1,2,3,4,5,6,7,8,9
则对应下标为 0,1,2,3,4,5,6,7,8。
若复制4,5,6,7,则四个数对应的数组元素下表分别为 3,4,5,6
又因为复制时含from对应的元素,不含to对应的元素,所以复制时对应的from值(元素下标)为3,to值(元素下标)为7
*/
5、方法的基本内存原理
P78 方法-9-方法的基本内存原理
P79 方法-10-什么是基本数据类型和引用数据类型
P80 方法-11-方法的值传递