在编程过程中有的时候会遇到一些固定套路的代码,我们可以把这些代码封装成方法,这样我们后面去使用的时候就会更加的方便,并且代码也会更加简洁,代码复用性更高。
方法的定义:教计算机某件事情的步骤
方法的调用:指挥计算机去做这件事情
方法的定义格式
修饰符 返回值类型 方法名(参数类型1 参数名1,参数类型2 参数名2,……){
方法体;
return 返回值;
}
修饰符:目前阶段使用public static后期学完权限修饰符和static等修饰符后可以灵活使用
参数:执行方法需要的数据
返回值:方法执行完后得到的结果
方法体:方法中的代码
返回值类型:返回值执行完后结果的数据类型,如果没有结果就写成void
例如:
public static void printInt(int num){
System.out.println(num);
}
public static int getSum(int a,int b){
return a+b;
}
public static void main(String[] args) {
//定义一个方法求两个整数中的最大值
//定义一个方法打印两个整数的和
//调用getMax
int max = getMax(19,66);
System.out.println(max);
//调用printSum
int num1 = 10;
int num2 = 20;
printSum(num1,num2);
}
public static int getMax(int a,int b){
int max = a>b?a:b;
return max;
}
public static void printSum(int a,int b){
int sum = a+b;
System.out.println(sum);
}
方法的优点
public static void main(String[] args) {
String[] arr = {"","今晚","明晚","6点","8点","小树林","图书馆","交易取消","有内鬼"};
int num = 135;
int bai = num/100%10;
int shi = num/10%10;
int ge = num%10;
String str = arr[bai]+arr[shi]+arr[ge];
System.out.println(str);
num = 87;
bai = num/100%10;
shi = num/10%10;
ge = num%10;
str = arr[bai]+arr[shi]+arr[ge];
System.out.println(str);
}
使用方法优化后
public static void main(String[] args) {
//密码解密 135 和87
String str = decode(135);//括号里只用填入135
String str2 = decode(87);
System.out.println(str);
System.out.println(str2);
}
//这个代码相当于教计算机如何解密
private static String decode(int num) {
String[] arr = {"", "今晚", "明晚", "6点", "8点", "小树林", "图书馆", "交易取消", "有内鬼"};
int bai = num / 100 % 10;
int shi = num / 10 % 10;
int ge = num % 10;
return arr[bai] + arr[shi] + arr[ge];
}
方法的调用格式
方法名(参数1,参数2,……);
注意
传参数的时候方法定义里有几个参数就传几个参数。方法定义的时候参数是什么类型就传什么类型。
如果方法有返回值,一般是用变量来接收返回值,返回值是什么类型,就用什么类型的变量来接收。
public class Demo{
public static void printInt(int num){
System.out.println(num);
}
public static int getSum(int a, int b){
return a+b;
}
public static void main(String[] args) {
printInt(10);
printInt(20);
int sum = getSum()
}
}
练习
public static void main(String[] args) {
//定义一个方法,该方法能够求两个整数中的最大值,定义完后尝试调用它
//定义一个方法,该方法能够打印两个整数的最大值,定义完后尝试调用它
int max = getMax(10,99);
System.out.println(max);
getBig(17,20);
}
public static int getMax(int a,int b){
int max = a>b?a:b;
return max;
}
public static void getBig(int a,int b){
int max = a>b?a:b;
System.out.println(max);
}
}
return的作用
1.返回方法的返回值;
2.结束方法(return执行后整个方法执行结束)
例
public static void main(String[] args) {
test(11);
}
public static void test(int num){
if (num%2==0){
//偶数
return;
}else {
//奇数
System.out.println(num);
}
System.out.println("end");
}
方法重载
定义:在同一个类中,方法名相同,参数列表不同的方法才叫重载(与返回值无关)
参数列表不同:1.参数类型不同 2.参数个数不同 3.参数顺序不同
如何判断参数列表是否相同?把参数类型全部拼成一个字符串,如果字符串的内容不同就算参数列表不同。
public class Demo{
public int test(int a;int b){}
public void test(int a,int b){}//错 不是方法重载
public void test(int a,int b,int c){}//和返回值类型没有关系
public void test(int x,int y){}//错 (2 4参数列表和1相同都是 int , int
public void test(int a,double b){}
public void test(double a,int b){}
public void test(double a,double b){}
//参数类型拼接成字符串判断
//1 intint
//2 intint
//3 intintint
//4 intint
//5 intdouble
//6 doubleint
//7 doubledouble
}
例如
打印两个int类型的整数和;
打印两个double类型的数和;
打印两个byte类型的数和;
……
使用的方法都差不多但是参数类型不同
学了方法重载后就可以在定义功能相同的方法的时候时使用同一个方法名去给他们取名字,这样方法调用起来会更加方便。
方法重载优化代码
public class Demo05 {
public static void main(String[] args) {
printSum(3.1,2.5);
printSum(1,2,3);
}
public static void printSum(int a,int b){
System.out.println(a+b);
}
public static void printSum(double a,double b){
System.out.println(a+b);
}
public static void printSum(int a,int b,int c){
System.out.println(a+b+c);
}
public static void printSum(double a,double b,double c){
System.out.println(a+b+c);
}
}
小思考
1.一个方法能不能有两个返回值?
答:不能直接返回,可以把结果放到数组中返回。
public class Demo06 {
public static void main(String[] args) {
int[] arr = {1,2,4,7,3,9};
System.out.println(getMax(arr));
System.out.println(getMin(arr));
int[] r = getMaxAndMin(arr);
System.out.println(r[0]);
System.out.println(r[1]);
///getMaxAndMin() 按CTRL+q可以直接看到方法注释
}
//定义一个方法,该方法能求一个int数组的最大值和最小值
//需文档注释给别人看
/**
* 该方法可以获取一个数组的最大值和最小值
* @param arr 传入需要求最值的数组
* @return 会返回一个数组,数组的长度为2,第一个元素代表最大值,第二个元素代表最小值
*/
public static int[] getMaxAndMin(int[] arr){
int max = arr[0];
int min = arr[0];
int[] result =new int[2];
//遍历比较
for (int i = 1; i < arr.length; i++) {
if (arr[i]>max){
max = arr[i];
}
if (arr[i]<min){
min = arr[i];
}
}
result[0] = max;
result[1] = min;
return result;
}
//定义一个方法,该方法能够求一个int数组中的最大值
public static int getMax(int[] arr){
int max = arr[0];
//遍历比较
for (int i = 1; i < arr.length; i++) {
if (arr[i]>max){
max = arr[i];
}
}
return max;
}
//定义一个方法,该方法能够求一个int数组中的最小值
public static int getMin(int[] arr){
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i]<min){
min = arr[i];
}
}
return min;
}
}
2.没有返回值的方法能不能写return?
答:可以,可以用来结束方法,但是return后面不能跟数据。
3.观察下列代码运行结果
public class Demo {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a="+a);
System.out.println("b="+b);
change(a,b);
System.out.println("方法调用后a="+a);
System.out.println("方法调用后b="+b);
}
public static void change(int a,int b){
int temp = a;
a = b;
b = temp;
}
}
运行结果:
a=10
b=20
方法调用后a=10
方法调用后b=20
change方法交换值得时候min方法中的a,b未发生改变,change出栈后main方法中的a,b并未发生改变。(画内存图)基本数据类型
4.观察下列代码
public class Demo07 {
public static void main(String[] args) {
int[] arr = {1,2};
System.out.println("arr[0]="+arr[0]);
System.out.println("arr[1]="+arr[1]);
change(arr);
System.out.println("方法调用后arr[0]="+arr[0]);
System.out.println("方法调用后arr[1]="+arr[1]);
}
public static void change(int[] arr){
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
}
运行结果:
arr[0]=1
arr[1]=2
方法调用后arr[0]=2
方法调用后arr[1]=1
引用数据类型arr引用堆中地址,12
5.观察下列代码
public static void main(String[] args) {
int[] arr = {1,2};
System.out.println("arr[0]="+arr[0]);
System.out.println("arr[1]="+arr[1]);
change(arr);
System.out.println("方法调用后arr[0]="+arr[0]);
System.out.println("方法调用后arr[1]="+arr[1]);
}
public static void change(int[] arr){
arr = new int[2];
arr[0] = 2;
arr[1] = 1;
}
}
运行结果
arr[0]=1
arr[1]=2
方法调用后arr[0]=1
方法调用后arr[1]=2
形参:方法定义时写的参数
实参:方法调用时实际传入的参数
问题:Java中方法调用的时候,形参的改变会不会影响实参?
答:如果方法的参数时基本数据类型,形参的改变不会影响实参。如果方法的参数时引用数据类型,形参的改变会影响实参。(本质要用从内存的角度去分析理解)
练习1
定义一个方法,该方法可以把一个数组打印出来,打印格式如下{1,2,3,4,5}
public static void main(String[] args) {
//定义一个方法,该方法可以把一个数组打印出来,打印格式如下{1,2,3,4,5}
int[] arr = {1,2,3,4,5};
printArr(arr);
}
public static void printArr(int[] arr){
//先打印左括号
System.out.print("{");
//遍历打印数组,每打印一个元素就打印一个括号,除了最后一个元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i<arr.length-1){
System.out.print(",");
}
}
//打印右括号
System.out.print("}");
}
练习2
定义一个方法,该方法可以求一个数组中的最大值
public static void main(String[] args) {
//定义一个方法,该方法可以求一个数组中的最大值
int[] arr = {1,5,9,23,56,7};
int max = getArrMax(arr);
System.out.println(max);
}
public static int getArrMax(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i]>max){
max = arr[i];
}
}
return max;
}
练习3
定义一个方法,该方法可以把一个数组进行排序(从小到大)
public static void main(String[] args) {
//定义一个方法,该方法可以把一个数组进行排序(从小到大)
int[] arr = {3,8,1,9,4,2};
arraySort(arr);
}
public static void arraySort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
练习4
定义一个方法,该方法可以获取一个任意长度的随机字符串,字符串中的字符可能是英文大小写和数字
分析:
public static void main(String[] args) {
//定义一个方法,该方法可以获取一个任意长度的随机字符串,字符串中的字符可能是英文大小写和数字
Random r = new Random();
//定义一个char[],包含英文大小写和数字
char[] chars = {'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z'};
//随机索引 拿着索引去数组中找对应的元素拼接成字符串
String str = "";
for (int i = 0; i < 4; i++) {
//生成随机索引
r.nextInt(chars.length);//[0,chars.length-1]
int index = r.nextInt(chars.length);
//获取元素
str = str+chars[index];
}
System.out.println(str);
}
答案:
public static void main(String[] args) {
//定义一个方法,该方法可以获取一个任意长度的随机字符串,字符串中的字符可能是英文大小写和数字
// Random r = new Random();
/*/定义一个char[],包含英文大小写和数字
char[] chars = {'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z'};
//随机索引 拿着索引去数组中找对应的元素拼接成字符串
String str = "";
for (int i = 0; i < 4; i++) {
//生成随机索引
r.nextInt(chars.length);//[0,chars.length-1]
int index = r.nextInt(chars.length);
//获取元素
str = str+chars[index];
}
System.out.println(str);*/
String s = randomString(5);
System.out.println(s);
}
public static String randomString(int length){
Random r = new Random();
//定义一个char[],包含英文大小写和数字
char[] chars = {'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z'};
//随机索引 拿着索引去数组中找对应的元素拼接成字符串
String str = "";
for (int i = 0; i < length; i++) {
//生成随机索引
int index = r.nextInt(chars.length);//[0,chars.length-1]
//获取元素
str = str+chars[index];
}
return str;
}
学习内容来自B站up主三更草堂。