对方法的理解
1.方法是完成特定功能的、相对独立的程序段。
2.方法定义遵循功能单一原则,也就是一个方法只做一件事。
3.方法的特征是()
方法分类
-系统方法
系统方法是jdk中提供好的方法,例如
Arrays.sort();
System.out.println();
-自定义方法
如果系统方法不能满足开发的需要,此时应该由开发人员自己定义方法,完成相应的功能。
方法构成
方法的语法结构
[修饰符] 返回值类型 方法名称([参数表]){
//方法体
}
例如:
public static void sort(){
}
public static void sort(int []arr){
}
public static int sort(double []arr){
return 0;
}
方法定义与调用
案例:
分别输入三个学生的Java成绩,SQL成绩,Oracle成绩,然后分别计算三个同学的平均成绩。
分析:
三个学生应该考虑使用数组,但是鉴于这个案例是引出方法的定义,所以不使用数组,版本一代码如下:
public static void main(String[] args) {
java.util.Scanner input = new java.util.Scanner(System.in);
// 第一个学生的成绩
int java1 = 0;
int sql1 = 0;
int oracle1 = 0;
System.out.println("请输入Java成绩:");
java1 = input.nextInt();
System.out.println("请输入SQL成绩:");
sql1 = input.nextInt();
System.out.println("请输入Oracle成绩:");
oracle1 = input.nextInt();
double result1 = (java1 + sql1 + oracle1) * 1.0 / 3;
System.out.println("第一个新兵的平均成绩是:" + result1);
// 第二个学生的成绩
int java2 = 0;
int sql2 = 0;
int oracle2 = 0;
System.out.println("请输入Java成绩:");
java2 = input.nextInt();
System.out.println("请输入SQL成绩:");
sql2 = input.nextInt();
System.out.println("请输入Oracle成绩:");
oracle2 = input.nextInt();
double result2 = (java2 + sql2 + oracle2) * 1.0 / 3;
System.out.println("第二个新兵的平均成绩是:" + result2);
// 第三个学生的成绩
int java3 = 0;
int sql3 = 0;
int oracle3 = 0;
System.out.println("请输入Java成绩:");
java3 = input.nextInt();
System.out.println("请输入SQL成绩:");
sql3 = input.nextInt();
System.out.println("请输入Oracle成绩:");
oracle3 = input.nextInt();
double result3 = (java3 + sql3 + oracle3) * 1.0 / 3;
System.out.println("第三个新兵的平均成绩是:" + result3);
}
可以发现版本一代码严重冗余,违背方法的减少冗余性的要求。改进如下:
分析代码冗余部分,析出为方法,即将本例中输入学生成绩的功能写在一个方法中,多次调用。
public static void main(String[] args) {
getAvg();//方法的调用
getAvg();//方法的调用
getAvg();//方法的调用
}
//被调方法
public static void getAvg(){
java.util.Scanner input = new java.util.Scanner(System.in);
int java = 0;
int sql = 0;
int oracle = 0;
System.out.println("请输入Java成绩:");
java = input.nextInt();
System.out.println("请输入SQL成绩:");
sql = input.nextInt();
System.out.println("请输入Oracle成绩:");
oracle = input.nextInt();
double result3 = (java + sql + oracle) * 1.0 / 3;
System.out.println("第三个新兵的平均成绩是:" + result3);
}
方法返回值
返回值的设计
- 在方法名前面写返回值的类型
- 在方法体内部使用return语句返回数据
- 主调方法通过赋值语句将方法返回值赋给变量
- 一个方法只能返回一个值
方法常见错误
- 方法返回值定义为viod,有返回值
- 方法返回值定义为double,返回值为其他类型
- 无返回值时,主调方法中接受返回值
- return之后语句不会执行
- 确保没有return语句不会运行的情况出现
方法参数设计
什么样的数据应该设计成方法参数?
在被调函数中每次调用都需要变化的数据,设计成方法参数。例如第几个学生就需要设计成方法参数。
方法参数是主调方法向被调方法传入的数据,方法参数是被调方法执行的前提条件。
形式参数与实际参数
主调方法提供的参数是实际参数
被调方法接收数据的参数是形式参数
主调方法的实参传递给被调方法的形参。按照个数,顺序依次赋值。
变量的作用域和生命周期
代码示例:
//主调方法
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
double d1 = getAvg(i+1);
System.out.println(d1);
}
}
//被调方法
public static double getAvg(int index){
java.util.Scanner input = new java.util.Scanner(System.in);
int java = 0;
int sql = 0;
int oracle = 0;
System.out.println("请输入第"+index+"个学生的Java成绩:");
java = input.nextInt();
System.out.println("请输入第"+index+"个学生的SQL成绩:");
sql = input.nextInt();
System.out.println("请输入第"+index+"个学生的Oracle成绩:");
oracle = input.nextInt();
return (java + sql + oracle) * 1.0 / 3;
}
问题一:
- main()方法中的变量args,i,d1是在什么时候分配的内存?什么时候回收内存?
- getAvg()方法中的形参index,变量java,sql,oracle什么时候分配的内存?什么时候回收内存?
什么是变量生命周期?
答:变量的生命周期是指变量什么时候分配内存,什么时候回收内存。变量从分配内存到回收内存的时间段称为变量的生命周期。
- 方法中的参数的生命周期:从方法调用开始到方法调用结束。
- 方法内部变量的生命周期:当变量所在的代码块被运行时变量生命周期开始,当变量所在的代码块运行结束时,变量生命周期结束。
问题二:
- main()方法中的变量args,i,d1是在哪个代码块中可以被使用?
- getAvg()方法中的形参index,变量java,sql,oracle在哪个代码块中可以被使用?
什么是变量的作用域?
答:变量的作用域是指:变量的使用范围(代码块)
- 变量的作用域是变量所在的包裹变量的,离变量最近的代码块
- 方法形参的作用域是方法体
- for循环的变量的作用域是for的循环体
总结
- 方法定义:是遵循功能单一原则、完成特定功能的、相对独立的程序段。
- 方法分类:系统方法、自定义方法。
- 方法的使用:定义方法(方法命名、参数、返回值)、方法调用。
- 作用域与生命周期
