方法可以用于定义可重用的代码以及组织和简化编码。
6 . 2 定义方法
方法的定义由方法名称、参数、返回值类型以及方法体组成。
定义方法的语法如下所示:
修饰符 返回值类型 方法名( 参数列表 ){
// 方法体 ;
}
方法可以返回一个值。retumValiieType 是方法返回值的数据类型。有些方法只是完成某些要求的操作,而不返回值。在这种情况下,retuniValueType 为关键字 void。方法中返回 值类型也是如此。如果方法有返回值,则称为带返回值的方法(, 否 则就称这个该方法为 void 方法。
================================================================================
定义在方法头中的变量称为形式参数或者简称为形参。参数就像占位符。当调用方法时,就给参数传递一个值,这个值称为实际参数或实参。参数列表指明方法中参数的类型、顺序和 个数。方法名和参数列表一起构成方法签名。参数是可选的,也就是说, 方法可以不包含参数。例如:Math.random()方法就没有参数。
注意:在方法头中,需要对每一个参数进行独立的数据类型声明。例如:max(int numl,1nt num2)是正肩的,而 max(int numl,mim2)是错误的。
6.3调用方法
方法的调用是执行方法中的代码。
在方法定义中,定义方法要做什么。为了使用方法,必须调用它。根 据方法是否有返回值,调用方法有两种途径。
无返回值的函数 只能调用 不能打印、赋值、运算
有返回值的函数 除了调用 参与打印、赋值、运算
函数的运行时基于栈的
栈内存 函数运行叫作函数入栈 函数结束叫作函数出栈
实际参数:实际传递给函数的数据 可以是变量 也可以是常量
形式参数:用于接收调用者传递来的数据
形式参数使其所属函数的局部变量
局部变量:在函数中定义的变量
随着函数进栈而存在
随着函数出栈而消亡
6.4函数的重载
表面上来看:一个类中有若干个重名函数
重载和函数的权限修饰符有关系没?没关系
重载和函数的类型修饰符有关系没?有 为啥
重载和函数的返回值类型有关系没?没
和函数名有关系吗?有 前提重名
和函数的参数列表有关系没?和参数名没关系 和类型有关系
目前而言 重载的前提是函数重名
具体到底是不是重载关系 看参数类型的排列组合(个数,顺序)
add(double,double)
add(int,int)
add(int,double,int)
add(double,int,int)
add(int,int,double)
重载的好处?对函数的参数进行拓展
函数的内存调用:
(图中标号代表了执行的流程),先介绍一下,在运行一个程序时,首先加mian()函数,因为mian()函数时程序的开始,前面已经介绍了函数是在“栈内存”中开始的,所以首先将mian()加载到我们的栈内存中,图中红色圆点代表加载进来的mian()函数。然后mian()函数调用sum()函数并传递给了该函数两个实际参数1和10,此时注意,我们的实际参数并不是直接付给变量了,而是将所有的实际参数都存放在了“常量池”中,并且每个参数都有一个存放的地址,此时程序中变量传递的都是参数的地址,所以执行②和③,此时加载第一个调用的sun()函数,并将两个参数的地址传递给两个变量,在sum()函数中定义的其他变量所赋的初值都是传递的是参数的地址,当sum()函数计算完成后,将结果返回,此时sum()函数弹栈,再调用下一次的sum()函数进行参数传递。与第一次执行流程一样。
import java.util.Scanner;
//运行的流程图 UML
//内存的流程图 UML
class Home26{
public static void main(String[] args){
//1.提示用户输入一个数字
int number=initData();
//2.判断是否是回文素数
if(isHuiWenSuShu(number)){
System.out.println("是");
}else{
System.out.println("不是");
}
}
public static int initData(){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
return scanner.nextInt();
}
public static boolean isHuiWenSuShu(int num){
//3.判断是否是素数且回文
return isHuiWen(num)&&isSuShu(num);
}
public static boolean isHuiWen(int num){
//4.计算翻转数字
int revNum=reverse(num);
return revNum==num;
}
public static int reverse(int num){
int sum=0;
while(true){
sum=sum*10+num%10;
num/=10;
if(num==0){
break;
}
}
return sum;
}
public static boolean isSuShu(int num){
//5.计算素数
boolean flag=true;//是素数
for(int i=2;i<=num/2;i++){
if(num%i==0){
flag=false;
break;
}
}
return flag;
}
}
PS C:\Users\gaoyu\Desktop\javaseday04> javac Home26.java
PS C:\Users\gaoyu\Desktop\javaseday04> java Home26
请输入一个数字:131
是
//计算一个整数n的m次幂 2^3 2^-3
class Demo04{
public static void main(String[] args){
System.out.println(pow(2,4)); //对函数不同传参的条用,查看程序运行结果是否正确
double a=pow(3,2)+10;
a=pow(2,-4);
System.out.println(a);
//System.out.println(pow(0,0));
System.out.println(pow(0,1));
System.out.println(pow(0,-9));
System.out.println(pow(2,0));
}
public static double pow(int n,int m){ //定义一个计算一个整数n的m次幂的函数,返回值为double类型,因为整数的负数次幂是分数
if(n==0&&m==0){ //首先判断特殊情况,0的0次幂是没有意义的,也没有正常返回值
//没有正常返回值了!只能抛异常
throw new ArithmeticException("0 and 0"); //这里可以先用抛异常的方式提示用户输入的不正确
}
if(n==0){ //其次0的任何次幂(除了0)都为0
return 0;
}
if(m==0){ //任何数(除了0)的0次幂都为1
return 1;
}
double multi=1;
for(int i=1;i<=Math.abs(m);i++){ //如果和m都不为0,则将n乘m次,
multi*=n;
}
if(m>0){
return multi; //如果m大于0,表示是整数次幂,为正整数
}else{
return 1/multi; //如果m小于0,表示是负数次幂,为分数
}
}
}
}