目录
1.方法概述
-
方法:
-
一种语法结构,把一段代码封装成一个功能,方便重复使用;
-
-
好处:
-
提高代码复用性;
-
让程序逻辑更清晰;
-
2.方法定义格式
完整格式:
修饰符 返回值类型 方法名(形参列表){ • 方法体代码(需要执行的功能代码) • return 返回值; }
2.1 方法常见问题
-
编写顺序无所谓;
-
方法间是平级,不能嵌套定义;
-
void,无需return;其他设置类型需return相应类型;
-
方法不调用,不执行,严格匹配参数情况;
-
有返回值的方法,调用可以选择定义变量接收结果;
2.2 求和
/**
* 计算1-n的和
* @param n
* @return
*/
public static int sum(int n){
int sum = 0;
for (int i = 0; i < n; i++) {
sum+=i;
}
return sum;
}
2.3 判断奇数偶数
/**
* 判断是奇数还是偶数
* @param n
* @return
*/
public static int X(int n){
int x;
if (n%2==0){
x=2;
System.out.println(n+"是偶数");
}else {
x=1;
System.out.println(n+"是偶数");
}
return x;
}
2.4 求最值
/**
* 求数组最大值
* @param array
* @return
*/
public static int MaxArray(int[] array){
int max = array[0];
for (int i = 1; i <array.length ; i++) {
if (max<array[i]){
max = array[i];
}
}
return max;
}
3.方法的内存原理
3.1 方法的调用流程,内存图解
-
方法,没有被调用的时候,在方法区的字节码文件中存放;
-
方法,被调用时候,需要进入到栈内存中运行;
-
方法不调用时,存放在方法区;
-
方法main运行时,在栈内存开辟空间;
-
再调用add方法,再开辟空间,将传入值存在开辟的空间;
-
方法使用结束,从栈内存退栈;
4.方法的参数传递机制
4.1基本类型传递机制
-
Java参数传递机制:值传递(不同方法内,只是数值相同);
-
注意:
-
实参:方法内部定义变量
-
形参:定义方法时,()中所声明的参数
-
/**
* 基本类型,值传递
*/
public static void main(String[] args) {
int a=10;
chang(a);
System.out.println(a);//10
}
public static int chang(int a){
System.out.println(a);//10
a=50;
System.out.println(a);//50
return a;
}
4.2 引用类型传递
引用类型:传递地址,修改地址空间内的数据;
/**
* 引用类型,地址传递
*/
public static void main(String[] args) {
int[] a={10,2,6};
chang(a);
System.out.println(a[0]);//50
}
public static void chang(int[] a){
System.out.println(a[0]);//10
a[0]=50;
System.out.println(a[0]);//50
}
4.3 打印整形数组内容
/**
* 引用类型,地址传递
*/
public static void main(String[] args) {
int[] a={10,2,6};
print(a);
}
public static void print(int[] a){
if (a!=null && a.length>0){
System.out.println("该数组内容为:"+ Arrays.toString(a));
}
}
4.4 数组中查询指定元素的索引
/**
* 数组中查询指定元素的索引
*/
public static void main(String[] args) {
int[] a={10,2,6};
int b = 10;
System.out.println(select(a, b));
}
public static int select(int[] a,int b){
if (a!=null && a.length>0){
for (int i = 0; i < a.length; i++) {
if (a[i] == b){
return i;
}
}
}
return -1;
}
4.5 比较任意两个数组是否一样
/**
* 比较任意两个数组是否一样
*/
public static void main(String[] args) {
int[] a={10,2,6};
int[] b={10,2,6};
if (compare(a,b)){
System.out.println("两个数组相等");
}else {
System.out.println("两个数组不等");
}
}
public static boolean compare(int[] a,int[] b){
if (a.length != b.length){
return false;
}
for (int i = 0; i < a.length; i++) {
if (a[i] != b[i]){
return false;
}
}
return true;
}
5.方法重载
-
方法重载:
-
同一个类中,多个名称相同,但形参列表不同,形参类型不同,这些方法就是方法重载;
-
-
重载识别技巧:
-
同一个类,方法名称相同,形参列表不同,就是重载(无关修饰符,返回值类型)
-
形参列表不同:形参个数,类型、顺序不同,不关心形参名称
-
/**
* 方法重载
* @param args
*/
public static void main(String[] args) {
fire();
fire("老A");
fire("老A",666);
Integer a = 666;
System.out.println("嗨嗨"+fire("老A",a));
}
public static void fire(){
fire("老E");
}
public static void fire(String location){
fire(location,1);
}
public static void fire(String location,int number){
System.out.println("给"+location+"的老铁送"+number+"个大火箭!");
}
//无法以返回值类型区分,可以以形参类型区分
public static int fire(String location,Integer number){
System.out.println("给"+location+"的老铁送"+number+"个大火箭!");
return 666;
}
6.单独使用return关键字
-
return:可以立即跳出并结束当前方法的执行
-
break:跳出并结束当前所在的循环
-
continue:跳过当次循环,进入下一次;
7、案例演示
1.买飞机票
/**
* 计算飞机票价格
*/
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入机票价格:");
double price = scanner.nextDouble();
System.out.println("请输入仓位类型(头等舱、经济舱):");
String type =scanner.next();
// scanner.nextLine();
System.out.println("请输入乘机月份(数字):");
int month = scanner.nextInt();
sum(price,type,month);
}
//判断月份
public static void sum(double price,String type,int month){
if (4<month && month<11){
type(price,type,0.9,0.85);
}else if (month==11 || month==12 || (1<=month && month<=4)){
type(price,type,0.7,0.65);
}else {
System.out.println("月份输入错误!无法计算票价");
}
}
//舱类
public static void type(double price,String type,double a,double b){
switch (type){
case "头等舱":
price *= a;
break;
case "经济舱":
price *= b;
break;
default:
System.out.println("舱输入错误!无法计算票价");
break;
}
System.out.println("机票的价格是:"+price);
}
}
2.找素数
/**
* 找素数:
* 101-200间有多少素数,并输出所有素数;
* 素数:除了1和他本身为,不能被其他整数整除
*/
public class Test2 {
public static void main(String[] args) {
int[] arr = new int[50];
boolean flag = false;
int n=0;
for (int i = 101; i <201 ; i++) {
//是否是素数
flag=sushu(i);
if (flag){
//素数,加入数组
arr[n]=i;
n++;
}
}
System.out.println("101-200有素数:"+n+"个"+arr.length);
System.out.println(Arrays.toString(arr));
}
//判断素数素数
public static boolean sushu(int i){
for (int j = 2; j <i ; j++) {
if (i%j == 0){
//能整除,非素数
return false;
}
}
return true;
}
}
3.生成验证码
/**
* 5位验证码:
* 可能是数字、大小写字母
*/
public class Test3 {
public static void main(String[] args) {
String code = createCode(5);
System.out.println(code);
}
//生成n位验证码
public static String createCode(int n){
String code = "";
Random random = new Random();
for (int i = 0; i < n; i++) {
int type = random.nextInt(3);//0-2
//选验证码类型
switch (type){
case 0:
//大写字符 A65 Z65+26
char c = (char) (random.nextInt(26)+65);
code += c;
break;
case 1:
//小写字符 a97 z 97+26
char cc = (char) (random.nextInt(26)+97);
code += cc;
break;
case 2:
code += random.nextInt(10);
break;
}
}
return code;
}
}
4.数组复制
/**
* 复制数组:
* 数组元素赋值给新数组
*/
public class Test4 {
public static void main(String[] args) {
int[] arrOne = {10,20,30,40,50,66};
int[] arrTwo = new int[arrOne.length];
for (int i = 0; i < arrOne.length; i++) {
arrTwo[i] = arrOne[i];
}
System.out.println(Arrays.toString(arrTwo));
}
}
5.评委打分
/**
* 评委打分:
* 六位评分,去掉最高和最低,取平均
*/
public class Test5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入几位评委打分:");
int num = scanner.nextInt();
int[] users = new int[num];
for (int i = 0; i < num; i++) {
System.out.println("请输入第"+(i+1)+"位评委的评分(1-10分)");
users[i] = scanner.nextInt();
}
//评分从小到大
order(users,num);
//最终得分
avg(users,num);
}
//冒泡排序,评分从小到大整理
public static void order(int[] users,int num){
for (int i = 0; i < num-1; i++) {
for (int j = 0; j < num-i-1; j++) {
if (users[j]>users[j+1]){
int temp = users[j+1];
users[j+1] = users[j];
users[j] = temp;
}
}
}
System.out.println(Arrays.toString(users));
}
//取平均值
public static void avg(int[] users,int num){
double score = 0;
for (int i = 1; i < num-1 ; i++) {
score += users[i];
}
double avgScore = score/(num-2);
System.out.println("选手最终得分:"+avgScore);
}
}
6.数字加密
/**
* 数字加密规则:
* 得到每位数,+5,再对10取余,最后所有数字反转(顺序调换)
*/
public class Test6 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一串正整数字:");
String num = scanner.next();
int length = num.length();
//快速获取int位数
//int length1 = String.valueOf(number).length();
int[] passOne = new int[length];
for (int i = 0; i < length; i++) {
//取字符num每位char字符,转为String,再转int
passOne[i] = Integer.parseInt(String.valueOf(num.charAt(i)));
}
System.out.println(Arrays.toString(passOne));
//+5%10
for (int i = 0; i < length; i++) {
passOne[i] = (passOne[i]+5)%10;
}
System.out.println(Arrays.toString(passOne));
//取反
for (int i = 0,j=length-1; i < j; i++,j--) {
int temp = passOne[i];
passOne[i] = passOne[j];
passOne[j] = temp;
}
System.out.println(Arrays.toString(passOne));
}
}
6.1数字解密
/**
* 数字解密规则:
* 得到每位数,+5,再对10取余,最后所有数字反转(顺序调换)
原0-4 加密后是5-9
原5-9 加密后是0-4
*/
public class Test7 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一串正整数字:");
String num = scanner.next();
int length = num.length();
int[] passOne = new int[length];
for (int i = 0; i < length; i++) {
//取字符num每位char字符,转为String,再转int
passOne[i] = Integer.parseInt(String.valueOf(num.charAt(i)));
}
System.out.println(Arrays.toString(passOne));
//取反
for (int i = 0,j=length-1; i < j; i++,j--) {
int temp = passOne[i];
passOne[i] = passOne[j];
passOne[j] = temp;
}
System.out.println(Arrays.toString(passOne));
//解密:分析变化规则
for (int i = 0; i < length; i++) {
if (0<=passOne[i] && passOne[i]<5){
passOne[i] = passOne[i]+5;
}else {
passOne[i] = passOne[i]-5;
}
}
System.out.println(Arrays.toString(passOne));
}
}
7.模拟中奖系统
/**
* 双色球系统:
* 投注号码由6个红球号码和1个篮球号码组成
* 红球号从1-33中选(不可重复);篮球号码从1-16中选
*/
public class Test8 {
public static void main(String[] args) {
int[] luckNumbers = createLuckNumbers();
int[] userNumbers = userInputNumbers();
judge(luckNumbers,userNumbers);
}
//生成中奖号码
public static int[] createLuckNumbers(){
Random random = new Random();
int[] luckNumbers = new int[7];
for (int i = 0; i < luckNumbers.length-1; i++) {
while (true){
int date = random.nextInt(33)+1;
boolean flag = true;
for (int j = 0; j <i ; j++) {
//出现重复值
if (luckNumbers[j] == date){
flag = false;
break;
}
}
//不重复的值加入
if (flag){
luckNumbers[i] = date;
break;//结束while
}
}
}
luckNumbers[luckNumbers.length-1] = random.nextInt(16)+1;
// System.out.println("中奖的号码是:"+Arrays.toString(luckNumbers));
return luckNumbers;
}
//用户输入号码
public static int[] userInputNumbers(){
Random random = new Random();
int[] userNumbers = new int[7];
Scanner scanner = new Scanner(System.in);
System.out.println("请输入双色球号码前六位(1-33),最后一位(1-16):");
while (true){
System.out.println("请输入第1位号码:");
int date = scanner.nextInt();
if (0<date && date<34){
userNumbers[0] = date;
break;
}else {
System.out.println("有误:请输入(1-33)的数字:");
}
}
for (int i = 1; i < userNumbers.length-1; i++) {
while(true){
System.out.println("请输入第"+(i+1)+"位号码:");
int date = scanner.nextInt();
if (0<date && date<34){
boolean flag = false;
for (int j = 0; j <i ; j++) {
//出现重复值
if (userNumbers[j] == date){
System.out.println("请不要输入重复数字:");
flag=true;
break;
}
}
if (flag){
continue;
}
}else {
System.out.println("请输入(1-33)的数字:");
continue;
}
//不重复的值加入
userNumbers[i] = date;
break;
}
}
while (true){
System.out.println("请输入第7位号码:");
int date = scanner.nextInt();
if (0<date && date<17){
userNumbers[userNumbers.length-1] = date;
break;
}else {
System.out.println("请输入(1-16)的数字:");
}
}
// System.out.println("您输入的号码是:"+Arrays.toString(userNumbers));
return userNumbers;
}
//判断中奖情况
public static void judge(int[] luckNumbers,int[] userNumbers){
System.out.println("中奖的号码是:"+Arrays.toString(luckNumbers));
System.out.println("您输入的号码是:"+Arrays.toString(userNumbers));
boolean blue = false;
if (luckNumbers[luckNumbers.length-1] == userNumbers[userNumbers.length-1]){
blue = true;
System.out.println("恭喜您命中了篮球");
}else {
System.out.println("很遗憾,您没有命中篮球");
}
int count = 0;
for (int i = 0; i < luckNumbers.length-1; i++) {
if (luckNumbers[i] == userNumbers[i]){
count++;
}
}
if (count>0){
System.out.println("恭喜您命中了"+count+"个红球");
}else {
System.out.println("很遗憾,您没有命中红球");
}
if (blue){
switch (count){
case 6:
System.out.println("恭喜中了1000万元");
break;
case 5:
System.out.println("恭喜中了3000元");
break;
case 4:
System.out.println("恭喜中了200元");
break;
case 3:
case 2:
System.out.println("恭喜中了10元");
break;
case 1:
System.out.println("恭喜中了5元");
break;
default:
System.out.println("很遗憾,没中奖");
break;
}
}else {
switch (count){
case 6:
System.out.println("恭喜中了500万元");
break;
case 5:
System.out.println("恭喜中了200元");
break;
case 4:
System.out.println("恭喜中了10元");
break;
default:
System.out.println("很遗憾,没中奖");
break;
}
}
}
}