相关链接
目录
- 搭建maven项目运行,参考pom.xml 用junit测试类执行代码
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
Part5 方法
1 方法的概述
假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。
1.1 方法的定义及格式
- 方法:其实就是完成特定功能的代码块,在很多语言里面都有函数的定义 , 函数在Java中被称为方法。
- 实例
package com.groupies.base.day05; import org.junit.Test; /** * @author GroupiesM * @date 2021/2/23 */ 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 方法格式的解释
- 方法的格式
- 修饰符: 目前记住 public static 即可,还有 private、public、protected 等
- 返回值类型: 用于限定返回值的数据类型,四类八种 byte,short,int,long,float,double,char,boolean。
- 方法名:方便我们调用方法,调用方法时通过方法名调用,命名规范 lowerCamelCase(小驼峰)。
- 传入参数:调用方法时可以要求传入参数,在方法内使用(可以没有参数)。
- 参数类型:用于限定调用方法时传入的数据的数据类型。
- 参数名:用于接收调用方法时传入的数据的变量。
- 方法体:完成特定功能的代码。
- return 返回值: 结束方法,并且把返回值带给调用者
/* 1.有返回值,带参 */ 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...) { 方法体; return 返回值; } /* 2.无返回值 带参 */ 修饰符 void 方法名(参数类型 参数名1,参数类型 参数名2,...) { 方法体; } /* 3.有返回值,无参 */ 修饰符 返回值类型 方法名() { 方法体; return 返回值; } /* 4.无返回值 无参 */ 修饰符 void 方法名() { 方法体; }
2 方法案例
2.1 定义求和方法
- 两个明确
- 返回值类型:其实就是要我们明确方法结果的数据类型
- 参数列表:其实就是要我们明确有几个参数参加,并且每个参数都是什么数据类型的
- 注意事项:方法与方法是平级关系,不能嵌套定义
案例代码一 定义求和方法
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习1:求两个数据之和的案例
* public static ??? sum(???) {...}
*/
public class OperatorDemo1 {
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;
}
}
2.2 方法调用之有明确返回值的方法调用
- 有明确返回值的方法调用
- 单独调用,没有意义
- 输出调用,有意义,但是不够好,因为我不一定非要把结果输出
- 赋值调用,推荐方式
案例代码二 方法调用之有明确返回值的方法调用
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习2:方法调用之有明确返回值的方法调用
*/
public class OperatorDemo2 {
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);
}
}
2.3 方法调用图解
3 方法练习
3.1 求两个数据较大值
需要Scanner键盘录入
案例代码三 求两个数据较大值
package com.itheima;
import java.util.Scanner;
/**
* @author GroupiesM
* @date 2021/2/23
* 练习3:求两个数据较大值
*/
public class OperatorDemo3 {
/**
* 需求:键盘录入两个数据,返回两个数中的较大值
*
* 思考:
* 键盘录入两个数据的动作放在哪里比较合适呢?
* 假如键盘录入数据的动作放在了返回两个数中的较大值的方法里面,那么,我如果不想返回键盘录入
* 的数据的较大值,我就想返回两个固定值的较大值,我们是不是又得修改代码了。这个时候发现
* 是不合理的,所以我们应该把键盘录入数据的动作放在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;
}
}
3.2 比较两个数据是否相等
需要Scanner键盘录入
案例代码四 比较两个数据是否相等
/**
* @author GroupiesM
* @date 2021/2/23
* 练习4:比较两个数据是否相等
*/
public class OperatorDemo4 {
/**
* 需求:键盘录入两个数据,比较两个数是否相等
*
* 两个明确:
* 返回值类型:boolean
* 参数列表:int a,int b
*/
public static void main(String[] args) {
//调用NewScanner方法创建对象实例
Scanner sc = newScanner();
System.out.println("请依次输入两个数值:");
System.out.println("判断结果为:" + isEqaul(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 String isEqaul(int a, int b) {
return (a == b) ? "相等!" : "不相等!";
}
}
3.3 void修饰的方法调用
- 需求
- 写一个方法,在控制台输出10次HelloWorld
- 没有明确返回值的函数调用,其实就是void类型方法的调用,只能单独调用
案例代码五 void修饰的方法调用
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习5:void修饰的方法调用
*/
public class OperatorDemo5 {
public static void main(String[] args) {
printHelloWorld();
}
public static void printHelloWorld(){
for (int i = 0; i < 10; i++) {
System.out.println("HelloWorld");
}
}
}
3.4 在控制台打印所有的水仙花数
案例代码六 在控制台打印所有的水仙花数
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习6:在控制台打印所有的水仙花数
*/
public class OperatorDemo6 {
public static void main(String[] args) {
/*调用方法结果
153
370
371
407
*/
printFlower();
}
public static void printFlower() {
for (int i = 100; i < 1000; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
if (Power(ge, 3) + Power(shi, 3) + Power(bai, 3) == i) {
System.out.println(i);
}
}
}
/**
* 快速求幂方法: https://blog.csdn.net/timo1160139211/article/details/88727472
* @param n 底数
* @param m 指数
* @return n^m
*/
public static int Power(int n, int m) {
int d = 1;
boolean flag = true;
if (m != 0) {
if (m < 0) {
m = Math.abs(m);
flag = false;
}
while (m > 0) {
if (m % 2 == 1) {
d *= n;
}
n *= n;
m >>= 1;
}
}
if (flag) {
return d;
} else {
return 1 / d;
}
}
}
3.5 在控制台打印1到n的数据
案例代码七 在控制台打印1到n的数据
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习7:在控制台打印1到n的数据
*/
public class OperatorDemo7 {
public static void main(String[] args) {
/*调用方法结果
1
2
3
*/
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);
}
}
}
4 方法的重载
4.1 参数求和
- 方法重载概述
- 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
- 方法重载特点
- 与返回值类型无关,只看方法名和参数列表
- 在调用时,虚拟机通过参数列表的不同来区分同名方法
案例代码八 方法重载——求和
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习8:方法重载——求和
*/
public class OperatorDemo8 {
/*
* 方法重载:在同一个类中,出现了方法名相同的情况。
*
* 方法重载的特点:
* 方法名相同,参数列表不同。方法重载与返回值无关。
*
* 参数列表不同:
* 参数的个数不同。
* 参数对应的数据类型不同。
*
* 注意事项:
* 在调用方法的时候,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;
}
}
4.2 比较两个数据是否相等
案例代码九 方法重载——比较两个数据是否相等
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习9:方法重载——比较两个数据是否相等
*/
public class OperatorDemo9 {
/**
* 需求:比较两个数据是否相等。
* 参数类型分别为两个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 方法参数类型详解
5.1 方法中参数传递
5.1.1 方法参数是基本类型的情况和图解
- 方法的参数是基本类型的时候:形式参数的改变不影响实际参数;
- 形式参数:用于接收实际数据的变量;
- 实际参数:实际参与运算的变量。
案例代码十 方法参数是基本类型的情况和图解
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习10:方法参数是基本类型的情况和图解
*/
public class OperatorDemo10 {
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
}
}
方法参数是基本类型的情况和图解
案例代码十一 方法参数是引用类型的情况和图解
package com.itheima;
/**
* @author GroupiesM
* @date 2021/3/18
* 练习11:方法参数是引用类型的情况和图解
*/
public class OperatorDemo11 {
public static void main(String[] args) {
//静态初始化一个数组,对象的引用在栈,对象实例在堆
int[] arr = {1, 2, 3, 4, 5};
for (int x = 0; x < arr.length; x++) {
//1,2,3,4,5
System.out.println(arr[x]);
}
change(arr);
for (int x = 0; x < arr.length; x++) {
//1,4,3,8,5
System.out.println(arr[x]);
}
}
public static void change(int[] arr) {
for (int x = 0; x < arr.length; x++) {
//如果数组元素是偶数,值就变成了以前的2倍
if (arr[x] % 2 == 0) {
arr[x] *= 2;
}
}
}
}
方法参数是引用类型(int[] arr)的情况和图解
21/03/18
M