方法可以理解为要做某件事情,而采取的解决办法。
在java中,方法就是用来完成解决某件事情或实现某个功能的办法。
方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值。
可以通过在程序代码中引用方法名称和所需的参数,实现在该程序中执行(或称调用)该方法。方法一般都有一个返回值,用来作为事情的处理结果。
Tips:
类里面只用于定义:定义变量,容器,方法,其他处理语句不能写。
方法里不能再定义方法。
1语法格式
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){
执行语句
………
return 返回值;
}
1)修饰符:public static(目前只记这一种就可以)
2)返回值类型:方法结束后想要给调用者的数据类型(基本数据类型,引用数据类型都可以)。void就是没有返回值类型,不能写return。如果不是void,则必须有return。
3)方法名:符合标识符规定即可
4)参数列表:需要外界传入参与方法中运算的值,也叫形参(如果方法不需要接收任何参数,则参数列表为空,即()内不写任何内容。)
5)return关键字:用于结束方法以及返回方法指定类型的值
6)返回值:被return语句返回的值,该值会返回给调用者
例:计算圆的面积
class Demo01 { public static void main(String[] args) { //方法调用,并用一个变量接收返回值 double area=getArea(1.2); System.out.println("圆的面积为"+area); } //方法定义 public static double getArea(double r){ double area=Math.PI*r*r; //计算圆的面积 return area; //将结果返回给调用者 } }
2 内存图:
弹栈:方法执行完就弹栈(后进先出)
3 练习1:定义无返回值无参数方法,打印3行,每行3个*号的矩形
class Demo02{ public static void main(String[] args){ printStar(); } public static void printStar(){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ System.out.print("*"); } System.out.println(); } } }
练习2:定义有返回值无参数方法,如键盘录入得到一个整数
import java.util.Scanner; class InNum { public static void main(String[] args){ int n=getNum(); System.out.println("录入的数为"+n); } public static int getNum(){ Scanner sc=new Scanner(System.in); System.out.print("请输入一个整数:"); int n=sc.nextInt(); return n; } }
练习3:定义无返回值有参数方法,如打印指定M行,每行N个*号的矩形
class Star { public static void main(String[] args) { printStar(5,4); } //定义无返回值有参数方法,如打印指定M行,每行N个*号的矩形 public static void printStar(int m,int n){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ System.out.print("*"); } System.out.println(); } } }
练习4:定义有返回值有参数方法,如求三个数的平均值
class AvgNum { public static void main(String[] args) { double avg=calculate(10,10,10); System.out.println(avg); } public static double calculate(double n1,double n2,double n3){ double avg=(n1+n1+n1)/3; return avg; } }
4方法的重载
4.1定义
Java允许在一个类中定义多个名称相同的方法,但是参数的类型或个数或顺序必须不同,这就是方法的重载。
通过传不同的参数,来调用不同的方法。
4.2注意事项
1)在一个类中
2)方法名相同
3)参数:个数,类型,顺序,只要有一个不同,就是重载
4)与返回值无关(如void method(int x)与int method(int y) 不是方法重载,不能同时存在,属于重复定义)
5)与具体的变量标识符无关(如method(int x)与method(int y) 不是方法重载,不能同时存在,属于重复定义)
System.out.println()就是一个方法重载,
在这个文件中,
可以找到:
等等很多个,这就是方法重载,每次传的参数类型不同。
例:
class Demo03 { public static void main(String[] args) { int sum1=getSum(1,2); System.out.println("和为"+sum1); double sum2=getSum(1.1,2.2); System.out.println("和为"+sum2); double sum3=getSum(1,2.9); System.out.println("和为"+sum3); double sum4=getSum(1.8,2); System.out.println("和为"+sum4); } //定义方法计算两个数之和 public static int getSum(int a,int b){ return a+b; } //方法重载 public static double getSum(double a,double b){ return a+b; } public static double getSum(int a,double b){ return a+b; } public static double getSum(double a,int b){ return a+b; } }
如果这样写,就会报错:
public static double getSum(int a,int b){
return a+b;
}
public static int getSum(int c,int d){
return c+d;
}
5 参数传递
调用一个方法时,会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了。这种传递方式,称为参数传递。
5.1
值传递:
当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响
引用传递:
当调用方法时,如果传入的数值为引用数据类型(String类型除外),形式参数的改变对实际参数有影响
例:
class Demo04 { public static void main(String[] args) { int a=0; double b=1; method01(a,b); System.out.println("a的值为"+a); System.out.println("b的值为"+b); } public static void method01(int a,double b){ a=20; b=30; } }
class Demo05 { public static void main(String[] args) { int[] arr={1,0}; method01(arr); System.out.println("arr[0]的值为"+arr[0]); } public static void method01(int[] arr){ arr[0]=20; } }
5.2参数传递图解
因为数组进了堆,所以值会被改变
6 练习:
1)点名器
import java.util.Scanner; import java.util.Random; class CallName { public static void main(String[] args) { String[] student=storage(5); //调用存储 showAll(student); //调用总览全班同学 callOne(student); //调用点名 } //存储所有同学姓名 public static String[] storage(int num){ String[] student=new String[num]; Scanner sc=new Scanner(System.in); for(int i=0;i<num;i++){ System.out.println("请输入第"+(i+1)+"位同学的名字:"); student[i]=sc.next(); } return student; } //总览全班同学姓名 public static void showAll(String[] student){ System.out.print("全班同学为:"); for(int i=0;i<student.length;i++){ System.out.print(student[i]+" "); } System.out.println(); } //随机点名其中一人,打印到控制台 public static void callOne(String[] student){ Random r=new Random(); int n=r.nextInt(student.length); System.out.println(student[n]+"被点到了!"); } }
2)库存管理
import java.util.Scanner; class Stock { public static void main(String[] args) { //初始数据 String[] proName={"MacBookAir","ThinkpadT450","ASUS-FL5800"}; //商品名 double[] proSize={13.3,14.0,15.6}; //尺寸 double[] proPrice={6988.88,5999.99,4999.5}; //价格 int[] proNum={5,10,18}; //库存 //功能选择 while(true){ System.out.println("----------库存管理----------"); System.out.println("1.查看库存清单"); System.out.println("2.修改商品库存数量"); System.out.println("3.退出"); System.out.println("请输入要执行的操作序号:"); Scanner sc=new Scanner(System.in); int select=sc.nextInt(); if(select==1){ showList(proName,proSize,proPrice,proNum); //把四个数组传进去 } if(select==2){ modifyNum(proNum); //传入库存 } if(select==3){ signOut(); break; } } } //查看库存清单 public static void showList(String[] proName,double[] proSize,double[] proPrice,int[] proNum){ System.out.println(); System.out.println("--------------------商城库存清单----------------------------"); System.out.println("编号 品牌型号 尺寸 价格 库存数"); //打印商品 for(int i=0;i<proName.length;i++){ System.out.println(" "+(i+1)+" "+proName[i]+" "+proSize[i]+" "+proPrice[i]+" "+proNum[i]); } System.out.println("------------------------------------------------------------"); int sumNum=0; //总库存 for(int i=0;i<proNum.length;i++){ sumNum+=proNum[i]; } System.out.println("总库存数:"+sumNum); double sumMoney=0; //总金额 for(int i=0;i<proName.length;i++){ sumMoney+=proPrice[i]*proNum[i]; } System.out.println("库存商品总金额:"+sumMoney); System.out.println(); System.out.println(); } //修改库存 public static void modifyNum(int[] AfterProNum){ System.out.println(); Scanner sc=new Scanner(System.in); while(true){ System.out.println("请输入您要修改的商品编号"); int proId=sc.nextInt(); if(proId<=AfterProNum.length&&proId>0){ System.out.println("请输入您要修改的库存数量"); int afterNum=sc.nextInt(); AfterProNum[proId-1]=afterNum; System.out.println(); break; } } } //退出 public static void signOut(){ System.out.println("您已退出"); } }