开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
成员方法
基本介绍
在某些情况下,我们需要定义成员方法(简称方法),比如人类:除了有一些属性外(年龄,姓名)我们人类还有以下行为,比如:可以说话,跑步,通过学习还可以做算术题,这时就要用成员方法才能完成。现在要求堆Person类完善
成员方法快速入门
Method01.Java
- 添加speak成员方法,输出,我是一个好人
- 添加cal01成员方法,可以计算从一到一千的结果
- 添加cal01成员方法,该方法可以接收一个数 n,计算从一到n的结果
- 添加getSum成员方法,可以计算两个数的和
import org.w3c.dom.ls.LSOutput;
import java.util.MissingFormatArgumentException;
import java.util.Scanner;
public class Method01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//方法使用
//1.方法写好之后,如果不去调用,就不会输出
Person p1 = new Person();
// p1.speak();//调用方法
// p1.cal01();//调用方法
// System.out.println("请输入需要加到的数:");
// int n = scanner.nextInt();
// p1.cal02(n);
System.out.println("请输入第一个数:");
int i = scanner.nextInt();
System.out.println("请输入第二个数:");
int j = scanner.nextInt();
//把方法getSum返回的值赋给变量sum
int sum = p1.getSum(i,j);
System.out.println("和为" + sum);
}
}
class Person{//创建一个人的类
String name;//人的属性
int age;
//方法(成员方法)
//添加speak成员方法,输出“我是一个好人”
//public 表示方法是公开
//void 表示方法没有返回值
//speak() 方法名,()小括号是形参列表
//{}方法体,可以写我们要执行的代码
//System.out.println();输出一句话
public void speak(){//输出一句话
System.out.println("我我是一个好人");
}
public void cal01(){
//计算1-1000的值
int sum = 0;
for (int i = 1; i <= 1000; i++){
sum += i;
}
System.out.println(sum);
}
//(int n) 形参列表,表示当前有一个形参n,可以接收用户输入
public void cal02(int n){//计算从1到n的和
int sum = 0;
for (int i = 1; i <= n; i++){
sum += i;
}
System.out.println("从1到" + n + "的和为" + sum);
}
//传入多个形参
//表示方法执行后,返回一个int值
//形参列表(int i,int j)两个形参,可以接收用户传入的两个数
public int getSum(int i,int j){//计算两个数的和
//
return i + j;
}
}
成员方法的调用机制原理(重要!示意图)
提示:画出程序执行过程[getSum]+说明
为什么需要成员方法
Method02.java
public class Method02 {
public static void main(String[] args) {
//定义原始数组
int[][] map = {{0,0,1},{1,1,1},{1,1,3}};
MyTools tools = new MyTools();
while(true){
for (int i = 0; i < 5; i++){
tools.tool(map);
}
break;
}
}
}
class MyTools{
public void tool(int[][] map){
//用for循环嵌套,遍历二维数组
for (int i = 0; i < map.length; i++){//外层表示二维数组内一维数组的个数
for (int j = 0; j < map[i].length; j++){//每个一维数组的个数
//输出每个元素
System.out.print(map[i][j] + " ");
}
//打印换行
System.out.println();
}
}
}
看一个需求
请遍历一个数组,输出数组的各个元素值
int[][] map = {{0,0,1},{1,1,1},{1,1,3}};
解决思路一:传统的方法,就是使用for循环,将数组输出
解决思路二:定义一个类MyTools,然后写一个成员方法,调用方法实现,看看效果如何
成员方法的好处
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用即可
成员方法的定义
访问修饰符 返回数据类型 方法名(参数列表){
//方法体
语句;
return 返回值;
}
- 形参列表:表示成员方法输入 cal(int n)
- 数据类型(返回类型):表示成员方法输出,void表示没有返回值
- 方法主体:表示为了实现某一功能代码块
- return 语句不是必须的
- 结合示意图来理解
成员方法细节
MethodDetail.java
public class MethodDetail {
public static void main(String[] args) {
AA aa = new AA();
int[] res = aa.getSumAndSub(1,4);
System.out.println("和 = " + res[0]);
System.out.println("差 = " + res[1]);
}
}
class AA{
public int[] getSumAndSub(int n1,int n2){
int[] resArr = new int[2];//创建一个数组
resArr[0] = n1 + n2;
resArr[1] = n1 - n2;
return resArr;
}
}
修饰符 (作用是控制方法的使用范围)
有四种可选【public protected 默认 private】
返回数据类型细节
- 一个方法最多有一个返回值【思考,如何返回多个结果】//返回
- 数组
- 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
- 如果方法要求有返回数据类型,则方法中最后的执行语句必须为return 值;而且要求返回值类型必须和return的值类型一致或兼容
- 如果方法是void,则方法体中可以没有return语句,或者只写return;
- 方法名遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如得到两个数的和getSum,开发中按照规范
参数列表细节
- 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1,int n2)
- 参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(int map)
- 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数【getSum】
- 方法定义时的参数称为形式参数,简称形参:方法调用时用的传入参数称为实际参数,简称实参,实参和形参的类型要一致或兼容,个数,顺序必须一致【演示】
- 方法体
里面写完成功能的具体的语句,可以为输入,输出,变量,运算,分支,循环,方法调用,但里面不能再定义方法!即:方法不能嵌套定义
方法调用细节
-
同一个类中的方法调用:直接调用即可,不用创建对象。比如print(参数);案例演示:MethodDetail02
A类sayOk调用print()
-
跨类中的方法A类调用B类方法:需要通过对象名调用。比如 对象名.方法名(参数);案例演示:B类sayOk调用print()
-
特别说明:跨类的方法调用和方法的访问修饰符相关,先暂时提一下,后面讲访问修饰符会讲到
课堂练习题
1.编写类AA,有一个方法:判断一个数是奇数还是偶数,返回boolean
MethodExercise01.java
2.根据行,列字符打印对应行数和列数的字符#,比如:行:4,列:4,字符#,则打印相应结果
成员方法传参机制
方法的传参机制对以后的学习非常重要,一定要搞清楚,我们通过案例来学习
基本类型的传参机制
MethodParamenter01.java
看一个案例,分析结果是什么
结论:基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
引用数据类型的传参机制
看一个案例MethodParameter02.java
B类中编写一个方法test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?
B类中编写一个方法test200,可以接收一个Person(age sal)对象,在方法中修改该对象属性,看看原来的对象是否变化
结论:引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参
在看一个案例,下面的方法会对原来的对象有影响吗
p = null 和 p = new Person();
成员方法返回类型是引用类型的实例
MethodExercise02.java
- 编写一类MyTools类,编写一个方法可以打印二维数组的数据
- 编写方法copyPerson 可以复制一个Person对象,返回复制的对象。克隆对象,注意要求得到的新对象和原来的对象是两个独立的对象,只是他们的属性相同