Java基础系列12-方法

x33g5p2x  于2021-12-18 转载在 其他  
字(6.2k)|赞(0)|评价(0)|浏览(396)

一.方法概述

假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。

1.1 方法的定义及格式

方法其实就是完成特定功能的代码块,在很多语言里面都有函数的定义 , 函数在Java中被称为方法。

方法实例:

package com.groupies.base.day05;
import org.junit.Test;

public static void main(String[] args) {
    int a = 1;
    //调用有返回值方法 结果为2
    System.out.println(AddOne(a));
    //无法调用SayHello方法
    //因为这里main方法是static修饰的静态类,而SayHello方法是非静态的
    //反之,非静态方法可以调用静态方法,
    SayHello();
}

//有返回值,赋值调用
public static int AddOne(int i){
    return i + 1;
}

//无返回值,static修饰的静态类不能调用
public void SayHello(){
	System.out.println("hello");
}

1.2 方法格式的解释

方法的格:

  1. 修饰符: 目前记住 public static 即可,还有 private、public、protected 等
  2. 返回值类型: 用于限定返回值的数据类型,byte,short,int,long,float,double,char,boolean。
  3. 方法名:方便我们调用方法,调用方法时通过方法名调用,命名规范 lowerCamelCase(小驼峰)。
  4. 传入参数:调用方法时可以要求传入参数,在方法内使用(可以没有参数)。
    1)参数类型:用于限定调用方法时传入的数据的数据类型。
    2)参数名:用于接收调用方法时传入的数据的变量。
  5. 方法体:完成特定功能的代码。
  6. return 返回值: 结束方法,并且把返回值带给调用者
/* 1.有返回值,带参 */
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...) {
	方法体;
	return 返回值;
}

/* 2.无返回值 带参 */
修饰符 void 方法名(参数类型 参数名1,参数类型 参数名2,...) {
	方法体;
}

/* 3.有返回值,无参 */
修饰符 返回值类型 方法名() {
	方法体;
	return 返回值;
}

/* 4.无返回值 无参 */
修饰符 void 方法名() {
	方法体;
}

二.方法案例

2.1 定义求和方法

两个明确:

  1. 返回值类型:其实就是要我们明确方法结果的数据类型
  2. 参数列表:其实就是要我们明确有几个参数参加,并且每个参数都是什么数据类型的

注意事项:方法与方法是平级关系,不能嵌套定义

代码:

package Java_study;

public class fangfa1 {
	public static void main(String[] args) {
		//定义两个int类型的变量a,b
		int a = 1, b = 2;
		//调用明确返回值的方法,返回结果为 a + b = 1 + 2 = 3
		System.out.println(add(a, b));
				
	}
	
	/** * 需求: 求两个数据之和的案例 * * 两个明确: * 返回值类型: int * 参数列表: int a, int b */
	public static int add(int a, int b) {
		int c = a + b;
		return c;
	}

}

测试记录:

3

2.2 方法调用之有明确返回值的方法调用

有明确返回值的方法调用:

  1. 单独调用,没有意义
  2. 输出调用,有意义,但是不够好,因为我不一定非要把结果输出
  3. 赋值调用,推荐方式

代码:

package Java_study;

public class fangfa2 {
	public static void main(String[] args) {
		// 单独调用
		// sum(10,20);
		
		// 输出调用
		// System.out.println(sum(10, 20));
		
		// 赋值调用
		int s = add(10, 20);
		
		// s:30
		print(s, "s");
	}
	
	/** * 有明确返回值的方法的调用: * A:单独调用,没有什么意义。 * B:输出调用,有意义,但是不够好,因为我可能需要对求和的结果进行进一步的操作 * C:赋值调用 */
	public static int add(int a, int b) {
		return a + b;
	}
	
	/** * 快捷打印的方法 * @param a 数值类型a的值 * @param s 数值类型a的变量名 */
	public static void print(int a, String s) {
		System.out.println(s + ":" + a);
	}

}

测试记录:

s:30

2.3 方法调用图解

三.方法练习

3.1 求两个数据较大值

需要Scanner键盘录入

代码:

package Java_study;
import java.util.Scanner;

/** * * @author 只是甲 * @date 2021-06-23 * 方法: 求两个数较大值 */

public class fangfa3 {
	/** * 需求:键盘录入两个数据,返回两个数中的较大值 * * 思考: * 键盘录入两个数据的动作放在哪里比较合适呢? * 假如键盘录入数据的动作放在了返回两个数中的较大值的方法里面,那么,我如果不想返回键盘录入 * 的数据的较大值,我就想返回两个固定值的较大值,我们是不是又得修改代码了。这个时候发现 * 是不合理的,所以我们应该把键盘录入数据的动作放在main方法中。 * * 命名习惯问题: * 类: * 如果是一个单词,首字母大写。Student * 如果是多个单词,每个单词的首字母大写。HelloWorld * * 方法:和变量的命名是一样的规则。 * 如果是一个单词,首字母小写。sum() * 如果是多个单词,从第二个单词开始,每个单词首字母大写。getMax() */	
	public static void main(String[] args) {
	    // 调用NewScanner方法创建对象实例
	    Scanner sc = newScanner();
	    System.out.println("请依次输入两个数值:");
	    System.out.println("两个数中较大值为:" + getMax(sc.nextInt(), sc.nextInt()));
	}
	    
	/** * @Description 创建键盘录入对象方法,这样可以少打一个System.in * @return 键盘录入对象实例 */
	public static Scanner newScanner() {
	    return new Scanner(System.in);
	}
	    
	/** * * @param a 传入第一个int值 * @param b 传入第二个int值 * @return 返回其中较大的一个值 */
	public static int getMax(int a, int b) {
	    //三元运算符
	    return (a > b) ? a : b;
	}
		

}

测试记录:

请依次输入两个数值:
100
99
两个数中较大值为:100

3.2 void修饰的方法调用

需求:
写一个方法,在控制台输出10次HelloWorld
没有明确返回值的函数调用,其实就是void类型方法的调用,只能单独调用

代码:

package Java_study;

/** * * @author 只是甲 * @date 2021-06-23 * void 修饰的方法调用 */
public class fangfa4 {
	public static void main(String[] args) {
		printHelloWorld();
	}
	
	public static void printHelloWorld() {
		for (int i = 0; i < 10; i ++) {
			System.out.println("HelloWorld");
		}
	}

}

测试记录:

HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld

3.3 在控制台打印1到n的数据

代码:

package Java_study;

/** * @author 只是甲 * @date 2021-06-23 * @remark 在控制台打印1到n的数据 */
public class fangfa5 {
	public static void main(String[] args) {
		// 调用方法结果
		printNumber(3);
	}
	
	 /** * 打印1到n之间的数据(n是调用的时候传递过来的) * * 两个明确: * 返回值类型:void * 参数列表:int * * @param n 1到n之间的数,这里传入n的值 */
	public static void printNumber(int n) {
		for (int i = 1; i <= n; i++) {
			System.out.println(i);
		}
	}

}

测试记录:

1
2
3

四.方法重载

方法重载是在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

方法重载特点:

  1. 与返回值类型无关,只看方法名和参数列表
  2. 在调用时,虚拟机通过参数列表的不同来区分同名方法

4.1 求和的方法重载

代码:

package Java_study;

/** * * @author 只是甲 * @date 2021-06-23 * @remark 方法重载,求和 */
public class fangfa6 {
	/* * 方法重载:在同一个类中,出现了方法名相同的情况。 * * 方法重载的特点: * 方法名相同,参数列表不同。方法重载与返回值无关。 * * 参数列表不同: * 参数的个数不同。 * 参数对应的数据类型不同。 * * 注意事项: * 在调用方法的时候,java虚拟机会根据方法名及参数列表的不同来区分方法。 */
	public static void main(String[] args) {
		// 定义两个变量
		int a = 10;
		int b = 20;
		// 求和
		int result = sum(a, b);
		// result:30
		System.out.println("result:" + result);
		
		//定义变量
		int c = 30;
		int result2 = sum(a, b, c);
		//result2:60
		System.out.println("result2:" + result2);
	}
	
	/** * 方法重载1:两个参数时的求和 * @param a 参数1 * @param b 参数2 * @return 参数1 + 参数2 */
	public static int sum(int a, int b) {
		return a + b;
	}
	
	/** * 方法重载2:三个参数时的求和 * @param a 参数1 * @param b 参数2 * @param c 参数3 * @return 参数1 + 参数2 + 参数3 */
	public static int sum(int a, int b, int c) {
		return a + b + c;
	}

}

测试记录:

result:30
result2:60

4.2 比较两个数据是否相等

同一个方法,通过重载的方式,可以对比不同的数据类型。

代码:

package Java_study;

/** * * @author 只是甲 * @date 2021-06-23 * @remark 方法重载-比较两个数据是否相等 * */
public class fangfa7 {
	/** * 需求:比较两个数据是否相等。 * 参数类型分别为两个byte类型,两个short类型,两个int类型,两个long类型, * 并在main方法中进行测试 */
	public static void main(String[] args) {
		// 不相等
		System.out.println(compare(10, 20));
		// 不相等
		System.out.println(compare((byte)10, (byte)20));
		// 不相等
		System.out.println(compare((short)10, (short)20));
		// 不相等
		System.out.println(compare(10L, 20L));
	}
	
	/** * 方法重载1:两个 short 类型参数比较是否相等 * @param a short类型参数1 * @param b short类型参数2 * @return 返回判断结果,参数1和参数2是否相等 */
	public static String compare(short a, short b) {
		return (a == b) ? "相等!" : "不相等!";
	}
	
	/** * 方法重载2:两个 int 类型参数比较是否相等 * @param a int类型参数1 * @param b int类型参数2 * @return 返回判断结果,参数1和参数2是否相等 */
	public static String compare(int a, int b) {
		return (a == b) ? "相等" : "不相等!";
	}
	
	/** * 方法重载3:两个 long 类型参数比较是否相等 * @param a long类型参数1 * @param b long类型参数2 * @return 返回判断结果,参数1和参数2是否相等 */
	public static String compare(long a, long b) {
		return (a == b) ? "相等" : "不相等!";
	}

}

测试记录:

不相等!
不相等!
不相等!
不相等!

五. 方法参数类型详解

5.1 方法中参数传递

5.1.1 方法参数是基本类型的情况和图解

方法的参数是基本类型的时候:形式参数的改变不影响实际参数

  1. 形式参数:用于接收实际数据的变量;
  2. 实际参数:实际参与运算的变量。

代码:

package Java_study;

/** * * @author 只是甲 * @date 2021-06-23 * @remark 方法的基本类型的情况和图解 */
public class fangfa8 {
	 public static void main(String[] args) {
	        // 定义变量
	        int a = 10;
	        int b = 20;
	        System.out.println("a:" + a + ",b:" + b);// a:10,b:20
	        change(a, b);
	        System.out.println("a:" + a + ",b:" + b);// a:10,b:20
	    }

	    public static void change(int a, int b) { 
	        System.out.println("a:" + a + ",b:" + b);// a:10,b:20
	        a = b; // a=20;
	        b = a + b;// b=40;
	        System.out.println("a:" + a + ",b:" + b);// a:20,b:40
	    }

}

测试记录:

a:10,b:20
a:10,b:20
a:20,b:40
a:10,b:20

方法参数是基本类型的情况和图解:

参考:

  1. https://blog.csdn.net/qq_43529621/article/details/113975052
上一篇:数组简介
下一篇:面向对象简介

相关文章