Java语言程序设计(基础篇) 第六章 方法

时间:2022-12-16 15:48:56

第六章 方法

6.2 定义方法

  1.方法的定义由方法名称、参数、返回值类型以及方法体组成。

  2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter)。参数就像占位符。当调用方法时,就给参数传递一个值,这个值称为实际参数(actual parameter)或实参(argument)。参数列表(parameter list)指明方法中参数的类型、顺序和个数。方法名和参数列表一起构成方法签名(method signature)。参数是可选的,也就是说,方法可以不包含参数。

  3.带返回值的方法称为函数,返回值类型为void的方法称为过程。

6.8 重载方法

  1.重载方法使得你可以使用同样的名字来定义不同方法,只要它们的签名是不同的。

  2.重载方法可以使得程序更加清楚,以及更加具有可读性。执行同样功能但是具有不同参数类型的方法应该使用同样的名字。

  3.被重载的方法必须具有不同的参数列表。不能基于不同修饰符或返回值类型来重载方法。

  4.有时调用一个方法时,会有两个或更多的可能,但是,编译器无法判断哪个是最精确的匹配。这称为歧义调用(ambiguous invocation)。歧义调用会产生一个编译错误。

 package com.chapter6;

 public class TestMethodOverloading {

     /**
* 方法重载:
* 1.第一个方法求最大整数;
* 2.第二个方法求最大双精度数;
* 3.第三个方法求三个双精度数中的最大值。
*/ public static void main(String[] args) { System.out.println("比较3和4:"+max(3,4)); System.out.println("比较3.0和5.4:"+max(3.0,5.4)); System.out.println("比较3.0,5.4,10.14:"+max(3.0,5.4,10.14)); } public static int max(int num1,int num2){
if(num1>num2){
return num1;
}else{
return num2;
}
} public static double max(double num1,double num2){
if(num1>num2){
return num1;
}else{
return num2;
}
} public static double max(double num1,double num2,double num3){
return max(max(num1,num2),num3);
} }
6.9 变量的作用域

  1.变量的作用域(scope of a variable)是指变量可以在程序中引用的范围。

  2.在方法中定义的变量称为局部变量(local variable)。局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明和赋值。

  3.不要在块内声明一个变量然后企图在块外使用它,下面是一个常见错误的例子:

    for(int i=0;i<10;i++){

    }

    System.out.println(i);

6.11方法抽象和逐步求精
 package com.chapter6;

 import java.util.Scanner;

 public class PrintCalendar {

     /**
* 打印日历
*/ public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入一个年份(例如:2016):");
int year = input.nextInt(); System.out.println("请输入一个月份(1-12):");
int month = input.nextInt(); printMonth(year, month); } // 打印日历方法
public static void printMonth(int year, int month) { printMonthTitle(year, month);// 打印日历的标题 printMonthBody(year, month);// 打印日历的主体
} // 打印日历标题的方法:年月,虚线,每周七天的星期名称
public static void printMonthTitle(int year, int month) { System.out.println(" " + getMonthName(month) + " " + year);
System.out.println("-------------------------------------------");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat"); } // 获得每个月的名字
public static String getMonthName(int month) {
String monthName = "";
switch (month) {
case 1:
monthName = "January";
break;// 一月
case 2:
monthName = "February";
break;// 二月
case 3:
monthName = "March";
break;// 三月
case 4:
monthName = "April";
break;// 四月
case 5:
monthName = "May";
break;// 五月
case 6:
monthName = "June";
break;// 六月
case 7:
monthName = "July";
break;// 七月
case 8:
monthName = "August";
break;// 八月
case 9:
monthName = "September";
break;// 九月
case 10:
monthName = "October";
break;// 十月
case 11:
monthName = "November";
break;// 十一月
case 12:
monthName = "December";
break;// 十二月
}
return monthName;
} // 打印日历的主体
public static void printMonthBody(int year, int month) { int startDay = getStartDay(year, month);//getStartDay(year, month)这个月的第一天是星期几 int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);//getNumberOfDaysInMonth(year, month)这个月有多少天 int i = 0;
for (i = 0; i < startDay; i++) {
System.out.print(" ");
}
for (i = 1; i <=numberOfDaysInMonth; i++) {
System.out.printf("%5d", i);
if ((i + startDay) % 7 == 0) {
System.out.println();
}
}
System.out.println();
} // 这个月的第一天是星期几
/*
* 假设知道1800年1月1日是星期三(START_DAY_FOR_JAN_1_1800 = 3),然后然后计算1800年1月1日和日历月份的第一天之间相差的总天数(totalNumberOfDays)。
* 因为每个星期有7天,所以日历月份第一天的星期就是(totalNumberOfDays+START_DAY_FOR_JAN_1_1800)%7。
*/
public static int getStartDay(int year, int month) { final int START_DAY_FOR_JAN_1_1800 = 3; int totalNumberOfDays = getTotalNumberOfDays(year, month); return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;
} //获取1800年1月1日和日历月份的第一天之间相差的总天数
public static int getTotalNumberOfDays(int year, int month) { int total = 0; for (int i = 1800; i < year; i++) {
if (isLeapYear(i)) {
total = total + 366;
} else {
total = total + 365;
}
} for (int i = 1; i < month; i++) {
total = total + getNumberOfDaysInMonth(year, i);
} return total;
} //计算总天数,需要知道该年是否是闰年以及每个月的天数
public static int getNumberOfDaysInMonth(int year, int month) { if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
return 31;
} if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} if (month == 2) {
return isLeapYear(year) ? 29 : 28;//二月通常有28天,但是在闰年有29天
} return 0; } //判断该年是否为闰年
public static boolean isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
} }