4.1 方法概述和格式说明
所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块。
Java方法是语句的集合,它们在一起执行一个功能。
方法是解决一类问题的步骤的有序组合
方法包含于类或对象中
方法在程序中被创建,在其他地方被引用
-
方法的优点
1)使程序变得更简短而清晰。 2)有利于程序维护。 3)可以提高程序开发的效率。 4)提高了代码的重用性。
-
方法的命名规则
1)方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。 2)下划线可以出现用以分隔名称的逻辑组件。
-
根据方法是否带参、是否带返回值,可将方法分为四类:
实际参数:就是实际参与运算的
形式参数:就是方法定义上的,用于接收实际参数的
1)无参无返回值方法
2)无参带返回值方法
3)带参无返回值方法
4)带参带返回值方法
*4.2 方法的定义
-
方法的定义
修饰符 返回值类型 方法名(参数类型 参数名){ ... 方法体 ... return 返回值; }
方法包含一个方法头和一个方法体。
修饰符:
修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
方法允许被访问的权限范围, 可以是 public、protected、private 甚至可以省略 ,其中 public 表示该方法可以被其他任何代码调用。
返回值类型 :
方法可能会返回值,计算结果类型是方法返回值的数据类型。return 结果;
有些方法执行所需的操作,但没有返回值。在这种情况下,返回值类型是关键字void。
方法名:
定义的方法的名字,必须使用合法的标识符
参数类型:
参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参。
参数列表
是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
传递给方法的参数列表,参数可以有多个,多个参数间以逗号隔开,每个参数由参数类型和参数名组成,以空格隔开 。
方法体:
方法体包含具体的语句,定义该方法的功能。
-
注意:
1)方法体放在一对大括号中,实现特定的操作 2)方法名主要在调用这个方法时使用,需要注意命名的规范,一般采用第一个单词首字母小写,其它单词首字母大写的形式 2)调用带返回值的方法时需要注意,由于方法执行后会返回一个结果,因此在调用带返回值方法时一般都会接收其返回值并进行处理。
4.3方法的调用
- 调用方法
Java 支持两种调用方法的方式,根据方法是否返回值来选择。
当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。
调用分三种:
1)单独调用
2)赋值调用
3)语句调用
(赋值调用)当方法返回一个值的时候,方法调用通常被当做一个值。
例如:
int larger = max(30, 40);
(语句调用)如果方法返回值是void,方法调用是一条语句。
例如:
方法println返回void。下面的调用是个语句:
System.out.println("欢迎来看me的博客!");
我们把定义方法时的参数称为形参,目的是用来定义方法需要传入的参数的个数和类型。
把调用方法时的参数称为实参,是传递给方法真正被处理的值。
- 变量作用域
变量的范围是程序中该变量可以被引用的部分。
方法内定义的变量被称为局部变量。
局部变量的作用范围从声明开始,直到包含它的块结束。
局部变量必须声明才可以使用。
方法的参数范围涵盖整个方法。参数实际上是一个局部变量。
可以在一个方法里,不同的非嵌套块中多次声明一个具有相同的名称的局部变量,但不能在嵌套块内两次声明局部变量。
-
命令行参数的使用
命令行参数是在执行程序时候紧跟在程序名字后面的信息。
有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
4.4 方法的注意事项
1) 调用带参方法时,必须保证实参的数量、类型、顺序与形参一 一对应。
2) 调用方法时,实参需要形参数据类型匹配。
3) 方法的参数可以是基本数据类型,如 int、double 等,也可以是引用数据类型,如 String、数组等。
4) 当方法参数有多个时,多个参数间以逗号分隔。
4.3 有返回值方法的调用
如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法。
单独调用,没有意义
输出调用,有意义,但是不够好,因为我们不一定非要把结果输出
赋值调用,推荐方式
当需要调用方法执行某个操作时,可以先创建类的对象(即new需要调用的方法所在的类),然后通过 对象名.方法名();
例如:
int larger = max(30, 40);
注意:
1) 方法的返回值最多只能有一个,不能返回多个值。
2)方法返回值的类型必须兼容,例如,如果返回值类型为 int ,则不能返回 String 型值。
3)可以通过在方法中加入参数列表接收外部传入的数据信息,参数可以是任意的基本类型数据或引用类型数据。
4)一定有return,返回一个值。
4.5 无返回值方法的定义和调用
如果方法返回值是void,方法调用是一条语句。
单独调用
输出调用(错误)
赋值调用(错误)
例如:
方法println返回void。下面的调用是个语句:
System.out.println("欢迎来看me的博客!");
注意:
1)在调用时必须传入实际的参数值
2)如果方法的返回类型为 void ,则方法中不能使用 return 返回值。
4.7函数内存的图解
//打印从0开始100个回文素数
class Demo1{
public static void main(String[] args){
int count=0; //记录一百个回文素数
int num=2; //一共从1开始打印完100个回文素数要经历全部数的个数
while(count!=100){ //循环 寻找回文素数
if(isWeNeed(num)){
System.out.print(num+" ");
count++;
if(count%10==0){
System.out.println();
}
}
num++;
}
}
public static boolean isWeNeed(int num){ //要找的回文素数
return isSuShu(num)&&isHuiwen(num);
}
public static boolean isSuShu(int num){ //判断该数是否为素数
for(int i=2;i<=num/2;i++){
if(num%i==0){
return false;
}
}
return true;
}
public static boolean isHuiwen(int num){ //判断该数是否是回文数字
return num==reverse(num);
}
public static int reverse(int num){ //实现数字翻转操作
int sum=0;
while(num!=0){
sum=sum*10+num%10;
num/=10;
}
return sum;
}
}
这个程序的内存图解:
4.6 方法重载概述和基本使用
如果同一个类中包含了两个或两个以上方法名相同、方法参数的个数、顺序或类型不同的方法,则称为方法的重载。
当调用被重载的方法时, Java 会根据参数的个数和类型来判断应该调用哪个重载方法,参数完全匹配的方法将被执行。
**判断方法重载的依据:
1、 必须是在同一个类中
2、 方法名相同
3、 方法参数的个数、顺序或类型不同
4、 与方法的修饰符或返回值没有关系
4.8 递归调用
方法的递归调用指的是一个方法自己调用自己的形式。一般如果要进行方法的递归操作往往都具备有以下的特点:
方法必须有一个递归的结束条件;
方法在每次递归处理的时候一定要做出一些变更;
例: 实现1 ~ 100的累加操作
public class TestDemo {
public static void main(String[] args) {
System.out.println(sum(100));
}
public static int sum(int num) {
if(num == 1)
return 1;
return num + sum(--num);
}
}
过程:
[main()调用] 第1次执行sum()方法 return 100 + sum(99);
[sum()递归] 第2次执行sum()方法 return 99 + sum(98);
[sum()递归] 第3次执行sum()方法 return 98 + sum(97);
…
[sum()递归] 倒数第2次执行sum()方法 return 2 + sum(1);
[sum()递归] 倒数第1次执行sum()方法 return 1;
4.10 经典例题
-
求一个整数的各个位数之和。
import java.util.Scanner; class Demo4_01 { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); //输入 System.out.print("Enter a number:"); long num=scanner.nextLong(); int sum=sumDigits(num); //计算 System.out.println("sum="+sum); //输出 } public static int sumDigits(long num){ //将输入的数字各个位分解再求和 int sum=0; while(num!=0){ sum+=num%10; num/=10; } return sum; } }
解题思路:
1.输入一个数字
2.将该数字传入sumDigits方法中- 将传入的数字,循环对10取余将余数进行相加,再除以10
- 直到num==0为止 将相加的和返回
3.返回该数字的各位之和
4.并打印
2.求100以内回文素数:一个数字既是回文数字又是素数。
class Demo4_07{
public static void main(String[] args){
int count=0;
int num=2;
while(count!=100){
if(isWeNeed(num)){
System.out.print(num+" ");
count++;
if(count%10==0){
System.out.println();
}
}
num++;
}
}
public static boolean isWeNeed(int num){
return isSuShu(num)&&isPalindrome(num);
}
public static boolean isSuShu(int num){
for(int i=2;i<=num/2;i++){
if(num%i==0){
return false;
}
}
return true;
}
public static boolean isPalindrome(int num){
return num==reverse(num);
}
public static int reverse(int num){
int sum=0;
while(num!=0){
sum=sum*10+num%10;
num/=10;
}
return sum;
}
}
解题思路:
在主函数:计数count从0开始—>数字num从2开始 判断该数字是否是回文素数 isWeNeed(num)
- 是—>打印 —>count++ ---->每十个换行
- 不是—>不管 —>num++
isWeNeed函数:
- 判断该数字是否是回文isPalindrome && 是否是素数isSushu
- 如果两个函数都返回true 则返回true 否则false
isPalindrome函数: 判断数字是否是回文
reverse(): 将输入的数字翻转输出
isSushu函数: 判断是否是素数
3.掷骰子游戏: 掷两个骰子。每个骰子有六个面,分别表示值1, 2, … 6。检查这两个骰子的和。如果和为2、3或12 (称为掷骰子),你就输了;如果和是7或者11 (称作自然),你就赢了;但如果和是其他数字(例如: 4、5、6、8、9或者10);就确定了一个点。继续掷骰子,直到掷出一个7或者掷出和刚才相同的点数。如果掷出的是7,你就输了。如果掷出的点数和你前一次掷出的点数相同,你就赢了。程序扮演一个独立的玩家。
class Demo4_09{
public static void main(String[] args){
int point=getPoint();
if(point==2||point==3||point==12){
System.out.println("You lose");
}else if(point==7||point==11){
System.out.println("You win");
}else{
while(true){
System.out.println("point is "+point);
int newPoint=getPoint();
if(newPoint==7){
System.out.println("You lose");
break;
}else if(newPoint==point){
System.out.println("You win");
break;
}
point=newPoint;
}
}
}
public static int getPoint(){
int a=(int)(Math.random()*6+1);
int b=(int)(Math.random()*6+1);
System.out.printf("You rolled %d + %d = %d\n",a,b,a+b);
return a+b;
}
}
解题思路:
主函数:
- 随机生成两个点数 并计算其和
- 判断和
2 3 12 直接输
7 11 直接赢
其他 接着摇
getpoint()函数:产生随机的两个数。