目录
什么是方法?
方法的作用?
方法的格式:
方法的重载:
方法的内存原理
方法的值传递:
什么是方法?
:程序中最小的执行单元(要么全执行,要么全不执行)
public class methoddeom3 { public static void main(String[] args) { System.out.println("hello"); System.out.println("world"); } } //main方法里面的要么全执行,要么全不执行,不可能说只执行其中一句
方法的作用?
1.提高代码的复用性
2.提高代码的可维护性
假设一个植物大战僵尸的场景,植物发射子弹的代码需要去写20行,如果寒冰射手发射子弹你写了20行,豌豆射手发射子弹你也写了20行,然后卷心菜发射子弹也写了20行,那么如果有几百个植物,你需要写先相同作用的代码几千行,这也太麻烦了。
如果你把发射炮子弹的代码封装在一个方法里,植物需要发射子弹直接调用就可以了。这样可以提高代码的复用性。如果某一天发射子弹的形式发生了变换,那么你也只用去修改发射子弹这个方法,而不是去修改几千行代码,也提高了代码的可维护性。
方法的格式:
1.最简单的方法定义和调用:
public static void 方法名(){
打包的代码;
}
范例:
public static void playGame(){
打印语句;
}
调用:
playGame();
2.带参数的方法定义和调用
单个参数 多个参数 格式 punblic static void 方法名(参数){....} punblic static void 方法名(参数1,参数...){....} 范例 public static void method(int number){.....} punblic static void getSum(int number1,int number2){....} 调用 method(1); getSum(1,2....); 注意:方法调用时,参数的数量与类型必须与方法定义中小括号里的变量一一对应,否则程序会报错
3.带返回值的方法定义和调用
格式:
public static 返回值类型 方法名(参数){
方法体;
reuturn 返回值l
}
public static int getSum(int a,int b){
int c=a+b;
reutrn c;
}
三种调用方式:
1.直接调用:
方法名(实参)
2.赋值调用:
整数类型 变量名=方法名(实参);->>>> int sum=getSum(a,b);
3.输出调用:
System.out.println(方法名(实参))
方法注意点:
1.方法不调用不执行
2.方法与方法之间时平行关系,不能互相嵌套
3.方法的编写顺序和执行顺序没有关系
4.方法返回值类型为void,表示该方法没有返回值,没有返回值可省略return
return关键字:
1.方法没有返回值:可以省略不写。如果书写,表示结束方法
2.方法有返回值:必须写。表示结束方法和返回结果。
return关键字后面的代码不会执行。
方法的重载:
形参:方法定义中的参数
实参:方法调用的参数
public static int getSum(int a,int b){//这里的a,b是形参,我的理解就是要传递这种形式(这里是int)的参数
int c=a+b;
reutrn c;
}
getSum(1,2);//这里的参数是实参,就是实际传递的参数
注意:方法调用时,形参和实参要保持一致
什么是方法重载?
同一类当中,方法名相同,参数不同的方法。与返回值无关
参数不同指以下三种
1.参数类型不同
2.参数个数不同
3.参数顺序不同
方法的内存原理
栈:方法运行时使用的内存,比如main运行,进入方法栈中执行
堆:存储对象或者数组,new来创建的,都存储在堆内存
下面图可以看到,main方法先进栈,然后eat()进栈,eat()方法又调用了study()方法,因为栈遵循先进后出,所以study()会先被调用,打印出学习。
new出来的都是引用数据类型,下面内存图可以看到main方法创建了一个数组,数组定义在了栈内存里,然后在堆内存开辟了一个新的空间,存储数组的具体值,并把数组的地址赋值给了arr,其实堆内存的arr存储的只是对这个数组地址,只是引用。
方法的值传递:
正好在这里介绍值传递,正好告诉大家java只有值传递,没有引用传递,可是有人又会问了,方法传递一个对象,并对其进行改变,最后对象发生了改变,这不是引用传递吗?我们来看几个例子来解决这个问题
我们将一个基本数据类型传递到方法中,然后修改形参的值,然后打印最终的结果,发现形参改变了实参并没有发生改变。这符合值传递。
再看这个非基本数据类型,我们这个非基本类型传递给方法,然后修改形参中的name属性,然后打印结果,发现实参中的值发生了改变,这么看起来好像java也符合引用传递。
那让我们再来看一个例子:
这里我们把非基本类型传递给方法之后,然后修改通过创建一个新的对象修改形参的值,可以发现这了形参和实参就互不影响。那么到底是怎么回事?让我们来看一下内存进行理解:
其实,当我们传递基本类型时,只是创建了一个副本给方法,然后该方法对其进行修改,这样并不会互相影响。
对于非基本数据类型:
这里在传递时,也只是创建了一个引用副本,当我们在形参中不创建的新的对象,形参和实参指向的其实都是同一个对象,所以修改对象属性,会让大家感觉像是引用传递。那么当在形参中创建一个新的对象时:
这时,形参创建了一个新的引用对象,那么他们指向的对象就不同了,这样形参实参的修改也不会互相影响。
所以,java只支持值传递。
内容整理自:
黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)_哔哩哔哩_bilibili
【每天一个技术点】Java到底是值传递还是引用传递?_哔哩哔哩_bilibili