方法
方法
1 方法的创建与调用

方法的组成:
- 访问修饰符:修饰符是可选的,用来指明谁能调用,上例中的public表示公开的,谁都能调用此方法
- 返回值类型:方法可以返回一个值。如上面方法中的int约定里返回值必须是整数;在定义方法时如果不需要返回值可以使用关键字void。
- 方法名:就是方法(功能块)的名字。方法名和参数列表一起构成了方法签名(方法签名是一个功能块的唯一标识)。
- 参数列表:小括号里面代表参数,参数像一个占位符,第3行代码中的5传递给了第7行的a,在第7行到第9行之间,a的值就是5;参数列表是可选的,可以没有也可以有多个,多个的话中间用“,”隔开,没有可以不写
- 方法体:大括号里面就是方法体,就是我们要实现某个功能的代码。
- static:表示静态。
1.1 无参方法的定义与使用
😀输入一个年份和月份,输出该月份的天数。
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份");
int year = scanner.nextInt();
System.out.println("请输入月份");
int month = scanner.nextInt();
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println("31天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("30天");
break;
case 2:
if (year%4==0&&year%100!=0||year%400==0){
System.out.println("29天2");
}else {
System.out.println("28天");
}
break;
default:
System.out.println("错误的月份");
break;
}
}
}

😀定义一个方法,要求输入一个月份和月份,得到一个天数,此天数数据可以带回到main方法中
import java.util.Scanner;
public class Demo04 {
public static void main(String[] args) {
int f = getDay();
System.out.println(f);
}
public static int getDay(){
int fate=0;//定义天数变量
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份");
int year = scanner.nextInt();
System.out.println("请输入月份");
int month = scanner.nextInt();
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
fate=31;
break;
case 4:
case 6:
case 9:
case 11:
fate=30;
break;
case 2:
if (year%4==0&&year%100!=0||year%400==0){
fate=29;
}else {
fate=28;
}
break;
default:
System.out.println("错误的月份");
}
return fate;
}
}

👫从上面可以看到void换成了int,而且定义了一个int类型的变量来接收天数最后多了一句return大代码,这里需要强调一下,如果方法有返回值,那么方法的最后必须要有return语句,且return返回的数据类型和方法的返回类型必须保持一致
👫而对于有参返回值无参数的方法调用,只需在main方法中定义一个返回值类型一致的变量来接收即可
1.2 有参方法的定义与使用
😀要求输入三组这样的年份和月份,并计算它们所对应的天数
import java.util.Scanner;
public class Demo05 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份");
int year = scanner.nextInt();
System.out.println("请输入月份");
int month = scanner.nextInt();
int fate = getDay(year,month);
System.out.println("天数为:"+fate);
System.out.println("请输入年份");
year = scanner.nextInt();
System.out.println("请输入月份");
month = scanner.nextInt();
fate = getDay(year,month);
System.out.println("天数为:"+fate);
System.out.println("请输入年份");
year = scanner.nextInt();
System.out.println("请输入月份");
month = scanner.nextInt();
fate = getDay(year,month);
System.out.println("天数为:"+fate);
}
public static int getDay(int year,int month){
int fate=0;
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
fate=31;
break;
case 4:
case 6:
case 9:
case 11:
fate=30;
break;
case 2:
if (year%4==0&&year%100!=0||year%400==0){
fate=29;
}else {
fate=28;
}
break;
default:
System.out.println("错误的月份");
break;
}
return fate;
}
}

😀产生随机数
public static void main(String[] args) {
System.out.println(getRand(5,12));
}
public static int getRand(int min,int max){
double d = Math.random();
int x = (int)(d*100);
x=x%(max-min+1)+min;
return x;
}

👫上边方法调用中getRand(5,12)中,5和12都是实际参数(简称实参),而方法定义中的min和max被称为形式参数(简称形参),此时实参5传递给min,12传递给max
2 变量作用域
😀变量是有作用范围(Scope)的,也即作用域。一旦超出变量的作用域,就无法再使用这个变量。在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区便是这个变量的作用域。
2.1 成员变量
😀在类体内定义的变量称为成员变量,它的作用域是整个类,也就是说在这个类中都可以访问到定义的这个成员变量。
public class Demo07 {
static int i = 47; // 定义一个成员变量,作用域是整个类 Demo
public static void main(String[] args) {
System.out.println(i);
}
}
2.2 局部变量
在一个方法或方法内代码块中定义的变量称为局部变量,局部变量在方法或代码块被执行时创建,在方法或代码块结束时被销毁。局部变量在进行取值前必须被初始化,否则会编译错误。Java 存在块级作用域,在程序中任意大括号包装的代码中定义的变量,它的生命仅仅存在于程序运行
该代码块时。
public class Demo08 {
public static void main(String[] args) { // main 方法参数列表定义的局部变量 args
int sum = 0; // main 方法体内定义的局部变量 sum
for(int i = 1; i < 5; i++){ // for 循环体内定义的局部变量 i
sum += i;
}
System.out.println(sum);
}
}
分析:
- 在上面案例中,就有 3 种定义局部变量的方式。在第 2 行,在静态方法 main 参数列表中定义的局部变量 args,它的作用范围就是整个 main 方法体:以第 2 行的左花括号“{”开始,以第 8 行的“} ”结束。
- 在第 3 行,在 main 方法体内,定义了局部变量 sum。它的作用范围从当前行(第 3 行)到以第 8
- 行的“}”为止。
- 在第 4 行,把局部变量 i 声明在 for 循环里,它的有效范围仅在 for 循环内(4~6 行),只要一离开这个循环,变量 i 便无法使用。
- 相对而言,变量 sum 的有效作用范围从第 3 行开始,到第 8 行结束,for 循环也属于变量 sum 的有效范围,因此 sum 在 for 循环内也是可用的。
2.3 局部变量在块作用域的应用
public class Demo09 {
static int x = 10;
public static void main(String[] args) {
int outer = 1;
{ // 直接用{}来定义块
int inner = 2;
System.out.println("inner = " + inner);
System.out.println("outer = " + outer);
}
int inner = 3;
System.out.println("inner = " + inner);
System.out.println("outer = " + outer);
System.out.println("In class lecer, x = " + x);
}
}

👫块作用域除了用 for 等循环或方法体的左右大括号来界定外,还可以直接用大括号{}来定义“块”。
2.3变量块作用域嵌套
- 在 Java 中,在方法内定义的变量,其作用范围(包括方法的参数)是从它定义的地方开始,到它所作用范围终结的位置处结束。
- 如在方法的开始处定义了一个变量 i,那么直到该方法结束处,都不能再定义另一个同名变量 i。再如,如果在一个 for 循环体中定义了变量 i,那么在这个 for 循环内不能再有同名变量,但出了 for循环之后,是可以再次定义的。这就是作用域不能嵌套的意思。
- 在 Java 中,类与方法之间作用域是可以嵌套的,可以把整个类看做一个大的作用域,它定义的字段(或称数据成员)可被方法中的同名字段所覆盖。
public class Demo10 {
static int x = 10;
public static void main(String[] args) {
int x = 20;
System.out.println(x); // 局部变量覆盖成员变量
}
}


浙公网安备 33010602011771号