一、概述
使用方法的好处是?
- 提高了代码的复用性。
- 让程序的逻辑更清晰。
package com.ith.create;
public class methoddemo1 {
public static void main(String[] args) {
//张工
int c1 = sum(30,10);
System.out.println(c1);
//徐工
int c2 = sum(20,30);
System.out.println(c2);
}
public static int sum(int a,int b){
int c = a+b;
return c;
}
}
二、案例
1. 计算1-n的和返回
package com.ith.demo;
public class test1 {
public static void main(String[] args) {
System.out.println("1-100的和为:" + sum(100));
System.out.println("1-5的和为:" + sum(5));
}
public static int sum(int n){
int sum = 0;
for (int i = 0; i <= n; i++) {
sum+=i;
}
return sum;
}
}
//1-100的和为:5050
//1-5的和为:15
2. 判断整数是奇数还是偶数
package com.ith.demo;
public class test2 {
public static void main(String[] args) {
// 判断数的奇偶
check(9);
System.out.println("----------");
check(100);
}
public static void check(int number){
if(number%2 == 0){
System.out.println(number + "是偶数");
}else{
System.out.println(number + "是奇数");
}
}
}
/*
9是奇数
----------
100是偶数
*/
3. 数组求最值改方法实现
需求:
把找出数组的最大值案例,改造成方法,可以支持返回任意整型数组的最大值数据。
package com.ith.demo;
public class test3 {
public static void main(String[] args) {
int[] ages = {23,19,45,67,86,32};
int max = getArrayMaxData(ages);
System.out.println("最大值数据是:" + max);
}
public static int getArrayMaxData(int[] arr){
//找出数组最大值
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
}
/*
最大值数据是:86
*/
三、方法的内存原理
- 方法没有被调用的时候,在方法区中的字节码文件中存放
- 方法被调用的时候,需要进入到栈内存中运行
方法的运行区域在哪里?
栈内存。
四、方法参数传递机制
基本类型
在传输实参给方法的形参的时候,并不是传输实参变量本身,而是传输实参变量中存储的值,这就是值传递。
package com.ith.param;
public class demo1 {
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a);//10
}
public static void change(int a){
System.out.println(a);///10
a = 20;
System.out.println(a);//20
}
}
1.形参和实参各指什么?
- 形参:以方法为例,就是方法定义时的变量。
- 实参:在方法内部定义的变量。
2.Java的参数传递机制是什么样的?
引用类型
package com.ith.param;
public class demo2 {
public static void main(String[] args) {
int[] arrs = {10,20,30};
change(arrs);
System.out.println(arrs[1]);///222
}
public static void change(int[] arrs){
System.out.println("方法内部:"+arrs[1]);//20
arrs[1] = 222;
System.out.println("方法内部:"+arrs[1]);//222
}
}
1、基本类型和引用类型的参数在传递的时候有什么不同?
- 都是值传递。
-
基本类型的参数传输存储的数据值。
-
引用类型的参数传输存储的地址值。
五、参数传递的案例
1. 打印整型数组内容
package com.ith.param;
public class test3 {
public static void main(String[] args) {
int[] ages = {10,20,30,40};
printArray(ages);
System.out.println("----------");
int[] numbers = {1,2,3,8,30};
printArray(numbers);
System.out.println("----------");
int[] numbers1 = null;
printArray(numbers1);
}
public static void printArray(int[] arr){
if(arr != null && arr.length>0){
System.out.print(("["));
for (int i = 0; i < arr.length; i++) {
System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ",");
}
System.out.println(("]"));
}
}
}
/*
[10,20,30,40]
----------
[1,2,3,8,30]
----------
*/
2. 从数组中查询指定元素的索引
package com.ith.param;
public class test4 {
public static void main(String[] args) {
int [] arr = {11,22,33,44,55,77};
int index = searchIndex(arr,77);
System.out.println("您查询数据的索引是:" + index);
System.out.println("-------------");
index = searchIndex(arr,17);
System.out.println("您查询数据的索引是:" + index);
}
public static int searchIndex(int[] arr,int data){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == data){
return i;
}
}
return -1;
}
}
/*
您查询数据的索引是:5
-------------
您查询数据的索引是:-1
*/
3. 比较2个数组是否一样
package com.ith.param;
public class test5 {
public static void main(String[] args) {
int[] arr1 = {10,20,30};
int[] arr2 = {10,20,30};
System.out.println(compate(arr1, arr2));//true
}
public static boolean compate(int[] arr1,int[] arr2){
if(arr1.length == arr2.length){
for (int i = 0; i < arr1.length; i++) {
if(arr1[i] != arr2[i]){
return false;
}
}
return true;
}else{
return false;
}
}
}
六、方法重载
方法重载:同一个类中,出现多个方法名称相同,但是形参列表是不同的,那么这些方法就是重载方法。
package com.ith.overload;
public class demo1 {
public static void main(String[] args) {
fire();
fire("小日子");
fire("小日子",5);
}
public static void fire(){
System.out.println("默认发射武器给米国");
}
public static void fire(String location){
System.out.println("默认发射武器给"+location);
}
public static void fire(String location,int num){
System.out.println("默认发射"+num+"枚武器给"+location);
}
}
/*
默认发射武器给米国
默认发射武器给小日子
默认发射5枚武器给小日子
*/
1.方法重载是什么样的?
2.使用方法重载的好处?
- 对于相似功能的业务场景:可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择,这是一种专业的代码设计。
3.方法重载的关键要求是什么样的?
- 同一个类中,多个方法的名称相同,形参列表不同,其他无所谓。
4.形参列表不同指的是什么?
七、编程案例
案例一:买飞机票
需求:
- 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
- 机票最终优惠价格的计算方案如下︰旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。
分析:
- 键盘录入机票的原价,仓位类型,月份信息,调用方法返回机票最终的优惠价格。
- 方法内部应该先使用if分支判断月份是是旺季还是淡季,然后使用switch分支判断是头等舱还是经济舱。
代码:
package com.ith.demo;
import java.util.Scanner;
//机票优惠价格
public class test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入机票原价:");
double money = sc.nextDouble();
System.out.println("请输入机票的月份(1-12):");
int month = sc.nextInt();
System.out.println("请您选择仓位类型:");
String type = sc.next();
System.out.println("机票优惠后的价格是 :" + calc(money, month, type));
}
public static double calc(double money,int month,String type){
if(month >= 5 && month <= 10){
switch (type) {
case "头等舱":
money *= 0.9;
break;
case "经济舱":
money *= 0.85;
break;
default:
System.out.println("你选择的仓位有误!!!");
money = -1;
break;
}
}
else if(month ==11||month == 12||( month>=1&&month<=4)){
switch (type) {
case "头等舱":
money *= 0.7;
break;
case "经济舱":
money *= 0.65;
break;
default:
System.out.println("你选择的仓位有误!!!");
money = -1;
break;
}
}
else{
System.out.println("您输入的月份错误!!!");
money = -1;
}
return money;
}
}
/*输出
请输入机票原价:
1000
请输入机票的月份(1-12):
12
请您选择仓位类型:
头等舱
机票优惠后的价格是:700.0
*/
案例二:找素数
需求:
- 判断101-200之间有多少个素数,并输出所有素数。
代码:
package com.ith.demo;
public class test2 {
public static void main(String[] args) {
for (int i = 101; i < 200; i++) {
//信号位:标记
boolean flag = true;
for (int j = 2; j < i/2; j++) {
if(i%j==0){
flag = false;
break;
}
}
if(flag){
System.out.print (i+"\t" );
}
}
}
}
/*输出
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
*/
案例三:开发验证码
需求:
- 定义方法实现随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母。
分析:
- 定义一个方法,生成验证码返回:方法参数是位数、方法的返回值类型是String。
- 在方法内部使用for循环生成指定位数的随机字符,并连接起来。
- 把连接好的随机字符作为一组验证码进行返回。
代码:
package com.ith.demo;
import java.util.Random;
public class test3 {
public static void main(String[] args) {
String code = createCode(5);
System.out.println("随机验证码:" + code);
}
public static String createCode(int n){
String code = " ";
Random r = new Random();
for(int i=0;i<n;i++){
int type = r.nextInt(3);
switch (type){
case 0:
//大写字符
char ch = (char)(r.nextInt(26)+65);
code += ch;
break;
case 1:
//小写字符
char ch1 = (char)(r.nextInt(26)+97);
code += ch1;
break;
case 2:
//数字
code += r.nextInt(10);
break;
}
}
return code;
}
}
/*输出
随机验证码: QWfBk
*/
案例四:数组元素的复制
需求:
分析:
- 需要动态初始化一个数组,长度与原数组一样。
- 遍历原数组的每个元素,依次赋值给新数组。
代码:
package com.ith.demo;
public class test4 {
public static void main(String[] args) {
int[] arr1 = {11,22,33,44};
int[] arr2 = new int[arr1.length];
copy(arr1,arr2);
printArray(arr1);
printArray(arr2);
}
public static void printArray(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");
}
System.out.println("]");
}
public static void copy(int[] arr1,int[] arr2){
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
}
}
/*输出
[11, 22, 33, 44]
[11, 22, 33, 44]
*/
案例五:评委打分
需求∶
- 在唱歌比赛中,有6名评委给选手打分,分数范围是[0-100]之间的整数。选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。
分析:
- 把6个评委的分数录入到程序中去---->使用数组
- 遍历数组中每个数据,进行累加求和,并找出最高分、最低分。
- 按照分数的计算规则算出平均分。
代码:
package com.ith.demo;
import java.util.Scanner;
public class test5 {
public static void main(String[] args) {
int[] scores = new int[6];
Scanner sc = new Scanner(System.in);
for (int i = 0; i < scores.length; i++) {
System.out.println("请输入第" + (i + 1) + "个评委的打分:");
int score = sc.nextInt();
scores[i] = score;
}
int max = scores[0];
int min = scores[0];
int sum=0;
for (int i = 0; i < scores.length; i++) {
if(scores[i] > max){
max = scores[i];
}
if(scores[i] < max){
max = scores[i];
}
sum+=scores[i];
}
double result = 1.0*(sum-max-min)/(scores.length-2);
System.out.println("选手最终得分:" + result);
}
}
/*输出
请输入第1个评委的打分:
100
请输入第2个评委的打分:
90
请输入第3个评委的打分:
77
请输入第4个评委的打分:
45
请输入第5个评委的打分:
23
请输入第6个评委的打分:
12
选手最终得分:58.75
*/
案例六:数字加密
需求:
- 某系统的数字密码:比如1983,采用加密方式进行传输,规则如下︰先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
分析:
- 将每位数据存入到数组中去,遍历数组每位数据按照规则进行更改,把更改后的数据从新存入到数组中。
- 将数组的前后元素进行交换,数组中的最终元素就是加密后的结果。
代码:
package com.ith.demo;
import java.util.Scanner;
public class test6 {
public static void main(String[] args) {
System.out.println("请输入加密数字个数:");
Scanner sc = new Scanner(System.in);
int length = sc.nextInt();
int[] arr = new int[length];
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入加密的第" + (i + 1) + "个数字:");
int number = sc.nextInt();
arr[i] = number;
}
System.out.print("加密之前:");
printArray(arr);
for (int i = 0; i < arr.length; i++) {
arr[i] = (arr[i] + 5) % 10;
}
for (int i = 0,j = arr.length-1; i < j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
System.out.print("加密之前:");
printArray(arr);
}
public static void printArray(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");
}
System.out.println("]");
}
}
/*
请输入加密数字个数:
4
请输入加密的第1个数字:
1
请输入加密的第2个数字:
9
请输入加密的第3个数字:
8
请输入加密的第4个数字:
3
加密之前:[1, 9, 8, 3]
加密之前:[8, 3, 4, 6]
Process finished with exit code 0
*/
案例七:模拟双色球[拓展]
投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择。
package com.ith.demo;
import java.util.Random;
import java.util.Scanner;
public class test7 {
public static void main(String[] args) {
//创造幸运号码
int[] luckNumber = createLuckNumber();
//printArray(luckNumber);
//用户选号
int[] userNumbers = userInputNumbers();
//printArray(userNumbers);
judge(luckNumber,userNumbers);
}
//随机生成中奖号码
public static int[] createLuckNumber(){
int[] numbers = new int[7];
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(data == numbers[j]){
flag = false;
break;
}
}
if(flag){
numbers[i] = data;
break;
}
}
}
//以下是一个蓝球1-16
numbers[numbers.length-1] = r.nextInt(16) + 1;
//返回
return numbers;
}
//用户输入的号码
public static int[] userInputNumbers(){
int[] numbers = new int[7];
Scanner sc = new Scanner(System.in);
//输入六个红球
for (int i = 0; i < numbers.length-1; i++) {
System.out.println("请输入第" + (i + 1) + "个红球号码(1-33,要求不能重复):");
int data = sc.nextInt();
numbers[i] = data;
}
System.out.println("请输入蓝球号码(1-16):");
numbers[6] = sc.nextInt();
//返回
return numbers;
}
//打印数组
public static void printArray(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");
}
System.out.println("]");
}
//判断是否中奖
public static void judge(int[] luckNumbers,int[] userNumbers){
//红球中奖个数
int redHitNumbers = 0;
//蓝球中奖个数
int blueHitNumbers = 0;
//红球中奖情况
for (int i = 0; i < userNumbers.length-1; i++) {
for (int j = 0; j < luckNumbers.length-1; j++) {
if(luckNumbers[j] == userNumbers[i]){
redHitNumbers++;
break;
}
}
}
//蓝球中奖情况
blueHitNumbers = luckNumbers[luckNumbers.length-1] == userNumbers[userNumbers.length-1] ? 1:0;
System.out.println("中奖号码是:");
printArray(luckNumbers);
System.out.println("您投注的号码是:");
printArray(userNumbers);
System.out.println("红球中奖个数:" + redHitNumbers);
System.out.println("蓝球"+((blueHitNumbers == 1)?"中奖了":"没中奖"));
//计算中奖情况
if(redHitNumbers < 3 && blueHitNumbers == 1){
System.out.println("中奖5元!!!");
}else if(redHitNumbers==3 && blueHitNumbers == 1 || redHitNumbers==4 && blueHitNumbers == 0 ){
System.out.println("中奖10元!!!");
}else if(redHitNumbers==4 && blueHitNumbers == 1 || redHitNumbers==5 && blueHitNumbers == 0 ){
System.out.println("中奖200元!!!");
}else if(redHitNumbers==5 && blueHitNumbers == 1){
System.out.println("中奖3000元!!!");
}else if(redHitNumbers==6 && blueHitNumbers == 0 ){
System.out.println("中奖500万元!!!");
}else if(redHitNumbers==6 && blueHitNumbers == 1 ){
System.out.println("中奖1000万元!!!");
}else{
System.out.println("感谢你为福利事业做出的贡献!!");
}
}
}
/*
请输入第1个红球号码(1-33,要求不能重复):
1
请输入第2个红球号码(1-33,要求不能重复):
2
请输入第3个红球号码(1-33,要求不能重复):
3
请输入第4个红球号码(1-33,要求不能重复):
4
请输入第5个红球号码(1-33,要求不能重复):
5
请输入第6个红球号码(1-33,要求不能重复):
6
请输入蓝球号码(1-16):
7
中奖号码是:
[17, 28, 7, 5, 25, 20, 9]
您投注的号码是:
[1, 2, 3, 4, 5, 6, 7]
红球中奖个数:1
蓝球没中奖
感谢你为福利事业做出的贡献!!
*/