定义&格式
- 定义:方法是一种语法结构,它可以把一段代码封装成一个功能,方便重复调用(可以理解为C语言里的函数)
- 作用:提高了代码的复用性,让程序的逻辑更清晰.
- 方法的调用格式:方法名(传递的形参)
注意事项:
1.方法申明了数据的返回类型,内部必须使return返回对应类型的数据.
2.使用void作为返回值类型的时候不需要return
方法的内存原理
方法的调用流程:
方法在不同的调用情况下会存在不同的内存
图解:
public class MethodDemo1 {
public static void main(String[] args) {
int c = add(10,20);
System.out.println(c);
}
public static int add(int a, int b){
int c = a + b;
return c;
}
}
以上面代码为例:
首先,把class文件提到方法区中,然后启动main方法,放入栈内存中运行,直到需要调用add方法。
之后,add运行,main将数据传递给add进行运算,将答案返回给main,add退出栈内存,main继续运行剩余代码。
最后,main方法运行完,main方法都退出栈内存。
方法的参数传递机制
Java的参数传递机制:值传递
在传递实参给方法的形参的时候,传递的是实参变量中存储的值,这就是值传递。
不同数据类型的参数传递
基本数据类型和引用数据类型的参数传递机制都是值传递,只是前者传递的是数据值,传递后改变也不会影响原方法;而后者传递的是地址值,传递后的改变会影响原方法。
方法重载
定义:在同一个类中,出现多个方法名称相同,但是形参列表是不用的
案例:
tips
开发武器系统,功能需求如下:
1.可以默认发一枚导弹
2.可以指定地区发一枚导弹
3.可以指定地区发射多枚导弹
分析:在此功能中,都有发射的需求,都可以以命名为fire,因为调用方法的时候,会根据参数的不同来区分调用的是哪个方法。
public static void fire(){
System.out.println("默认发射一枚导弹");
}
public static void fire(String location){
System.out.println("向"+location+"发射一枚导弹");
}
public static void fire(String location,int nums){
System.out.println("向"+location+"发射"+nums+"枚导弹");
}
还可以在方法里面再次进行方法重载,使代码更简洁
public static void fire(String location){
fire(location,1);
}
public static void fire(String location,int nums){
System.out.println("向"+location+"发射"+nums+"枚导弹");
}
方法重载的识别技巧
同一个类中,方法名称相同,形参列表不同,就可以认为是重载的方法。
形参列表不同指的是形参的个数、类型、顺序不同,与名称无关。
public static void open(){}
public static void open(int a){}
public static void open(int a,int b){}
public static void open(double a,int b){}
public static void open(int a,double b){}
//下面的就是重复方法(顺序,类型,个数都相同,名字不同)
public static void open(int i,double a){}
//下面的是新方法(方法名称不同)
public static void OPEN(){}
return关键字单独使用
return可以立即跳出并结束当前方法的执行,可以放在任何方法中。
public static void chu(int a,int b){
if(b==0)
return ;
int c=a/b;
System.out.println(c);
}
这属于无返回数据类型的,要用void,否则会报错:不兼容的类型。
每日一练 模拟双色球系统
:::tips
开发一个模拟双色球系统,需求如下:
投注号码由6个红色球号码和1个蓝色球号码,红色球号码从133中选择,蓝色球号码从116中选择
:::
分析:
1.随机生成一个中奖号码(号码不能重复)
2.用户输入一组中奖号码
3.比对中奖情况
import java.util.Random;
import java.util.Scanner;
public class DoubleColorBall {
public static void main(String[] args) {
//1.随机生成中奖号码
int[] LuckNumbers = CreateLuckNumbers();
//2.用户输入号码
int[] HomeNumbers = InputHomenNumbers();
//3.中奖情况判断
judge(LuckNumbers,HomeNumbers);
}
public static int[] InputHomenNumbers(){
int[] numbers = new int[7];
Scanner sc = new Scanner(System.in);
//用户输入前六个号码
for (int i = 0; i < numbers.length-1; i++) {
System.out.print("请您输入第"+(i+1)+"个红球号码(1~33):");
int data = sc.nextInt();//默认此处不输入重复数字
numbers[i] = data;
}
System.out.print("请您输入蓝球号码(1~16):");
numbers[6]=sc.nextInt();
return numbers;
}
public static int[] CreateLuckNumbers(){
int[] numbers = new int[7];//[0,0,0,0,0,0,0]
Random r = new Random();
//生成前六个红色球的数字(1~33)
for (int i = 0; i < numbers.length-1; i++) {
while(true){
int data = r.nextInt(33)+1;
boolean flag = true;
for (int j = 0; j < i; j++) {
if(numbers[j]==data){
flag = false;
break;
}
}
if(flag){
numbers[i]=data;
break;
}
}
}
//生成第七个球的数字(1~16)
numbers[numbers.length-1]=r.nextInt(16)+1;
return numbers;
}
public static void judge(int[] LuckNumbers,int[] HomeNumbers){
//判断是否中奖
//LuckNumbers = {12,23,8,16,15,32, 9}
//HomeNumbers = {23,13,18,6,8,33, 10}
//1.定义两个变量存储命中个数
int redHit = 0;
int blueHit = 0;
//2.判断红球命中几个
for (int i = 0; i < HomeNumbers.length-1; i++) {
for (int j = 0; j < LuckNumbers.length-1; j++) {
//找到重复即为命中
if(HomeNumbers[i]==LuckNumbers[j]){
redHit++;
break;
}
}
}
//判断篮球是否命中
blueHit = LuckNumbers[LuckNumbers.length-1]==HomeNumbers[HomeNumbers.length-1]? 1: 0;
//揭示中奖号码和用户号码
System.out.print("中奖号码是:");
for (int i = 0; i < LuckNumbers.length; i++) {
System.out.print(LuckNumbers[i]+" ");
}
System.out.print("\n");
System.out.print("您的号码是:");
for (int i = 0; i < HomeNumbers.length; i++) {
System.out.print(HomeNumbers[i]+" ");
}
System.out.print("\n");
//判断几等奖
if(blueHit==1 && redHit < 3){
System.out.println("恭喜你!中了六等奖!");
}else if (blueHit == 1 && redHit == 3 || blueHit == 0 && redHit == 4) {
System.out.println("恭喜你!中了五等奖!");
}else if (blueHit == 1 && redHit == 4 || redHit == 5 && blueHit == 0) {
System.out.println("恭喜你!中了四等奖!");
}else if (blueHit == 1 && redHit == 5 ) {
System.out.println("恭喜你!中了三等奖!");
}else if (redHit == 6 && blueHit == 0) {
System.out.println("恭喜你!中了二等奖!");
}else if (blueHit == 1 && redHit == 6 ) {
for (int i = 0; i < 3; i++) {
System.out.println("恭喜你!中了一等奖!");
}
} else {
System.out.println("很遗憾,您未中奖,感谢您的参与");
}
}
}