Java语言程序设计(基础篇) 第六章 方法
第六章 方法
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);
}
}
Java语言程序设计(基础篇) 第六章 方法的更多相关文章
- Java语言程序设计(基础篇) 第七章 一维数组
第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...
- Java语言程序设计(基础篇) 第五章 循环
第五章 循环 5.2 while循环 1.while循环的语法如下: while(循环继续条件){ //循环体 语句(组); } 2.程序:提示用户为两个个位数相加的问题给出答案 package co ...
- Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串
第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service m ...
- Java语言程序设计(基础篇) 第三章 选择
第三章 选择 3.8 计算身体质量指数 package com.chapter3; import java.util.Scanner; public class ComputeAndInterpret ...
- Java语言程序设计(基础篇)第一章
第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...
- 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词
第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...
- Java语言程序设计(基础篇)第二章
第二章 基本程序设计 2.2 编写简单的程序 1.变量名尽量选择描述性的名字(descriptive name). 2.实数(即带小数点的数字)在计算机中使用一种浮点的方法来表示.因此,实数也称为浮点 ...
- Java语言程序设计(基础篇) 第八章 多维数组
第八章 多维数组 8.2 二维数组的基础知识 二维数组中的元素通过行和列的下标来访问. 8.2.1 声明二维数组变量并创建二维数组 下面是二维数组的语法: 数据类型[][] 数组名; int[][] ...
- Java语言程序设计-助教篇
1. 给第一次上课(软件工程)的老师与助教 现代软件工程讲义 0 课程概述 给学生:看里面的第0个作业要求 2. 助教心得 美国视界(1):第一流的本科课堂该是什么样?(看里面的助教部分) 助教工作看 ...
随机推荐
- java和c#使用hessian通信
介绍 hessian主页:http://hessian.caucho.com/ 一个简单的例子学习hessian服务:服务端为Java,客户端为C#. 先要准备好C#和Java的第三方类库:http: ...
- 简单CSS3动画制作
本贴已重新编辑至http://www.cnblogs.com/fastmover/p/4977358.html 最近需要用到了一些CSS3动画,基本用Animate.css(https://githu ...
- InstallShield Limited Edition制作安装文件
由于InstallShield Limited Edition for Visual Studio的教程.资料太少,所以我今天才决定写这个文章,专门针对C#项目打包,包括打包集成Microsoft . ...
- [转]netty对http协议解析原理
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...
- Useful links
Better JavaScript with ES6 Pt.IPopular Features pt.II A Deep Dive into Classes pt.III Cool Collectio ...
- requirejs:模块加载(require)及定义(define)时的路径小结
原文地址:http://www.tuicool.com/articles/7JBnmy 接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模 ...
- Xamarin的不归路-连接MAC失败
昨天费了老大劲才配置连接好MAC虚拟机,今天居然又连接不上了. 记录一下最后的解决办法: 直接用“Add Mac”添加虚拟机,一定要填写ip地址,为啥要写ip?我也不知道,因为我填写“MacdeMac ...
- *HDU3038 并查集
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- Unity3D DFGUI根据名称获取多个子控件代码
dfPanel control = gameObject.GetComponent<dfPanel>(); dfLabel avatarName = control.Find<dfL ...
- jquery插件学习之元素顶部悬浮
jquery插件的学习: HTML部分及应用 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...