笔上得来终觉浅,绝知此事要躬行
🔥 个人主页:星云爱编程
🔥 所属专栏:javase
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
![]()
目录
一、成员方法
1.1、基本介绍
在某些情况下,我们需要定义成员方法(简称方法)。比如人类:除了有一些属性外(年龄,姓名..),还有一些行为比如:可以说话、跑步...这时就要用成员方法才能完成。和c语言中的函数类似。
1.2、简单使用
public class Test{
public static void main(String[]args){
Person p1=new Person();
p1.name="星云";
p1.eat();
}
}
class Person{
String name;
int age;
public void eat(){
System.out.println(name+"吃饭");
}
}
运行上述代码可以看到控制台打印了:星云吃饭
那么该方法是怎么调用执行的呢?请看下文。
1.3、方法的调用机制原理:
为了方便理解,我们在Person类中添加一个方法:
public int Add(int num1,int num2){
return num1+num2;
}
现在再来运行下面的代码:
public class Test {
public static void main(String[] args) {
Person p1=new Person();
int ret=p1.Add(10,20);
System.out.println(ret);
}
}
其调用机制如下图:
方法调用小结:
(1)当程序执行到方法时,就会开辟一个独立的空间,也就是栈空间;
(2)当方法执行完毕,或者执行到return语句时,就会返回
(3)返回到调用方法的地方
(4)返回后,继续执行方法后面的代码
(5)当main方法(栈)执行完毕,整个程序退出
1.4、成员方法的好处
(1)提高代码的复用性。
(2)可以将实现的细节封装起来,然后供其他用户来调用即可。
1.5、成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表..){ //方法主体 语句; return返回值; }
(1)形参列表:表示成员方法输入Add(int num1,int num2)。
(2)返回数据类型:表示成员方法输出,void表示没有返回值。
(3)方法主体:表示为了实现某一功能代码块。
(4)return语句不是必须的。返回类型为void型时可省略return语句。
1.6.注意事项及使用细节
(1)调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数.
(2)实参和形参的类型要一致或兼容、个数、顺序必须一致。
(3)方法不能嵌套定义。
(4)一个方法最多有一个返回值。(若是要同时返回多个值,可以用数组)
(5)返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)。
(6)如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return 值; 而且要求返回值类型必须和return的值类型一致或兼容。
(7)如果方法返回类型是void,则方法体中可以没有return语句,或者只写 return。
方法名:
遵循驼峰命名法,最好见名知义,表达出该功能的意思即可, 比如 得到两个数的和 getSum。
形参列表:
(1)一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开。
(2)参数类型可以为任意类型,基本数据类型和引用类型都。
(3)调用带参数方法时,传入的参数一定要对应参数列表中参数的类型或兼容类型的参数。
(4)方法定义时的参数称为形式参数,简称形参;方法调用时传入的参数称为实际参数,简称实参。实参和形参的类型必须相同或兼容,顺序和个数必须一致。
方法调用细节:
(1)在同一个类中调用方法:直接调用。
(2)不同类中调用方法:
若方法为静态方法,通过类名直接调用;
若方法为非静态方法,需要通过创建对象,用对象名调用。
二、成员方法传参机制
2.1、基本数据类型的传参机制
看如下代码:实现两个数的交换
public class Test3 {
public static void main(String[] args) {
C c = new C();
int a=23;
int b=65;
System.out.println("交换前:a="+a+" b="+b);
c.swap(a,b);
System.out.println("交换后:a="+a+" b="+b);
}
}
class C{
public void swap(int a, int b){
int tem=a;
a=b;
b=tem;
System.out.println("swap中"+"a="+a+" b="+b);
}
}
当我们用上面这个方法去实现交换两个数时,会发现并没有做到数值交换。
结论:形参为基本数据类型时,传递的是值(值拷贝),形参的任何改变都不影响实参。
2.2引用数据类型的传参机制
请看如下代码:
public class Test4 {
public static void main(String[] args) {
B b = new B();
int[]arr={1,2,3};
System.out.print("交换前:");
b.print(arr);
b.test11(arr);
System.out.print("交换后:");
b.print(arr);
}
}
class B{
public void test11(int[]arr){
arr[0]=666;
arr[1]=777;
}
public void print(int[]arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
运行后可以看到,arr数组中元素改变了
结论:引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
2.3小测试
在评论区输出下面代码运行后的结果
public class Test5 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name="大白";
dog.age=10;
System.out.println("处理前:main中dog.age="+dog.age);
dog.test22(dog);
//dog.test33(dog);
System.out.println("处理后:main中dog.age="+dog.age);
}
}
class Dog{
String name;
int age;
public void test22(Dog dog){
dog=null;
}
public void test33(Dog dog){
dog=new Dog();
dog.name="小黄";
dog.age=99;
}
}