1、成员方法
1.1 基本介绍
在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名…),我们人类还有一 些行为比如:可以说话、跑步…,通过学习,还可以做算术题。这时就要用成员方法才能完成。
现在要求对 Person 类完善。
1.2 方法的调用机制原理:(重要!-示意图!!!)
1.3 成员方法的好处
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用即可
1.4 成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表..) {
//方法体 语句;
//也可以没有返回值,那么返回的数据类型就是void
return 返回值;
}
- 形参列表:表示成员方法输入 cal(int n) , getSum(int num1, int num2)
- 返回数据类型:表示成员方法输出, void 表示没有返回值
- 方法主体:表示为了实现某一功能代码块
- return 语句不是必须的。
1.5 注意事项和使用细节
public int[] getSumAndSub(int n1, int n2) {
int[] resArr = new int[2]; // resArr[0] = n1 + n2;
resArr[1] = n1 - n2;
return resArr;
}
//细节: 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型 的参数 byte b1 = 1;
byte b2 = 2;
a.getSumAndSub(b1, b2); //byte -> int
//细节:
//1.实参和形参的类型要一致或兼容、个数、顺序必须一致
//a.getSumAndSub(1.1, 1.8); //double ->int(×)
//a.getSumAndSub(100);//× 个数不一致
a.f3("tom", 10); //ok
//a.f3(100, "jack"); // 实际参数和形式参数顺序不对
//2. 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象) // 具体看 getSumAndSub
//
//3. 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return 值; // 而且要求返回值类型必须和 return 的值类型一致或兼容
//4.思考: 一个方法最多有一个返回值 [如何返回多个结果 返回数组 ]
访问修饰符 :
(作用是控制 方法使用的范围)
如果不写默认访问,有四种:
- public,
- protected,
- 默认,
- private
返回数据类型
- 一个方法最多有一个返回值 [思考,如何返回多个结果 返回数组 ]
- 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
- 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return值;而且要求返回值类型必须和return的值类型一致或兼容
- 如果方法是void,则方法体中可以没有return语句,或者只写return;
方法名
遵循驼峰命名法,最好见名知义,表达出该功能的意思即可, 比如 得到两个数的和 getSum, 开发中按照规范:
2、成员方法传参机制(非常非常重要)
方法的传参机制对我们今后的编程非常重要,一定要搞的清清楚楚明明白白。
2.1 基本类型数据传参机制
public class MethodParameter01 {
//编写一个 main 方法
public static void main(String[] args) {
int a = 10;
int b = 20;
//创建 AA 对象 名字
obj AA obj = new AA(); obj.swap(a, b); //调用 swap
System.out.println("main 方法 a=" + a + " b=" + b);
//这里输出的a和b仍然是 a=10 b=20
}
}
class AA {
public void swap(int a,int b){
System.out.println("\na 和 b 交换前的值\na=" + a + "\tb=" + b);//a=10 b=20
//完成了 a 和 b的交换
int tmp = a;
a = b;
b = tmp;
System.out.println("\na 和 b 交换后的值\na=" + a + "\tb=" + b);//a=20 b=10
}
}
由上面的代码片段可得出结论:
基本类型数据,传递的是值(值拷贝),形参的任何改变不影响实参数。
2.2 引用类型数据传参机制
2.2.1 参数为数组
main方法中定义原数组为[1,2,3],传递进入test100方法后,在方法内修改数组的值,然后在main方法中输出数组,数组改变。
然后在
结论:在参数为数组时候,形参的改变会影响实参。
2.2.2 参数为对象
public class TestClass {
public static void main(String[] args) {
// 测试
B b = new B();
// 测试
Person p = new Person();
p.name = "jack";
p.age = 10;
b.test200(p);
// 如果 test200 执行的是 p.age = 10000,下面的结果是 10000
// 如果 test200 执行的是 p = null ,下面的结果是 10
// 如果 test200 执行的是 p = new Person();..., 下面输出的是 10
System.out.println("main 的 p.age=" + p.age);//10
}
}
class B {
public void test200(Person p) {
// p.age = 10000; //修改对象属性
//思考
// p = new Person();
// p.name = "tom";
// p.age = 99;
// 思考
p = null;
}
}
class Person {
String name;
int age;
}
上面有三种情况:
- 如果 test200 执行的是 p.age = 10000,下面的结果是 10000
- 如果 test200 执行的是 p = null ,下面的结果是 10
- 如果 test200 执行的是 p = new Person();…, 下面输出的是 10
第一种:
p.age = 10000,因为引用类型传递的是地址,所以修改p.age的值,实参也会改变。
第二种:
p = null ,相当于形参断开了和堆内存中实参地址的联系,但是栈内存中的实参还是连接着,所以输出的是10。
第三种:
p = new Person();相当于在堆内存中重新开了一个空间,和实参一点关系都没有,肯定不会改变。
结论:引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
本博客引用韩顺平老师Java课程