一、Java中的方法
方法的本质是一段可以被重复利用的代码片段。
方法之定义不去调用的话是不会执行的
方法的定义:
语法格式: [修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
例如:
返回值类型
返回值类型可以是java语言中任何一种数据类型,包括基本数据类型,引用数据类型。如果方法执行结束没有任何返回值类型给调用者,那么返回值类型写:void。不能空着不写,当返回值类型不是void的时候,方法结束时必须使用return 值;语句来进行结束。
方法名 :只要是合法的标识符即可。最好是反映了这个方法所实现的功能。
形式参数列表
形参个数:0-n个,使用,隔开,形式参数只在方法体内有效(局部变量)。
方法体
任何一个方法都有一个方法体用大括号括起来,遵循自上而下的执行顺序。
方法的调用:
当方法的修饰符有static关键字的时候调用语法格式为:类名.方法名(实际参数列表);
实际参数就是真正往方法里传的参数,要与形式参数列表相对应,比如
方法执行时内存的变化:
1.方法如果只定义不调用是不会分配内存空间的。
2.方法调用的时候会在栈内存中分配空间,发生压栈操作。
3.方法一旦结束,给该方法分配的内存空间就会被释放,发生弹栈操作。
方法重载
构成方法重载的条件:
1.在同一个类中
2.方法名一致
3.形式参数列表不同,包括类型不同 | 顺序不同 | 个数不同只要有一个不同就算不同。
方法重载是编译阶段的机制
当在一个类中方法的功能相似时可以考虑方法重载机制。我们经常使用System.out.println();这个方法就使用的重载机制,因而它可以输出各种类型的数据。
方法的递归
方法的递归就是方法自己调用自己。递归调用如果没有结束条件的话,会出现栈内存溢出错误;所有的递归必须要有结束条件。建议尽量不使用递归,因为递归太消耗内存,每次递归栈内存都要给方法分配栈帧导致频繁的占用栈内存,且可能导致栈溢出错误。在递归调用时即使有时候有结束条件并且结束条件没有错误仍出现栈内存溢出错误可能是因为递归的太深,栈内存不够了导致的,如果因为递归调用发生了栈内存溢出我们可以调整栈内存大小来扩大栈内存,如果还是出错,说明递归结束条件有一定的问题需要修改。
下面是利用递归求5+4+3+2+1的结果的内存图:
利用方法递归求兔子问题(斐波那契数列)
package包机制
包机制的作用:便于代码管理
定义包在java源码的第一行且只能出现在有效代码的第一行。
包命名规范:要求全部小写。
公司域名倒叙(baidu.com的倒叙就是com.百度) + 项目名 + 模块名 + 功能名。
带包编译:假设我们定义一个包叫做com那么在DOS命令窗口编译java包时必须含有一个叫做com的目录才能编译通过,相对来说比较麻烦,所以有了带包编译,带包编译可以一并在编译代码是生成一个叫做包名的目录,比如
这里我定义了一个名叫com的包,但是在编译的时候没有问题,但是在运行时会报错
无法加载主类PackageTest原因是当创建包之后类名也会随之改变,变为包名.类名这里就是com.PackageTest
当我把类名修改为com.PackageTest之后还是不行,因为还少一步,在我的D:\study\Java目录下没有创建一个叫com(包名)的目录,在创建叫做com的目录之后再将之前编译好的PackageTest.class文件放到com目录下,再java运行
就成功了。。。。。。。。。但是这样特别麻烦
这时候就有了带包编译javac -d . java文件
这是com目录就是自动生成并且编译后的.class文件也会自动存储到com目录下!
import机制
import语句用来引入其他类
java.lang不需要import引入
import语句只出现在package语句之后class定义之前
当调用某个包之后该包下面的类在调用时可以省略包名,比如com.ImportTest.out就可以写为ImportTest.out,import语句可以编写多个。
import的模糊导入
比如在import java.util.Scanner时可以写成import java.util.*或者import java.*有点类似于数据库全盘的查找,一般不建议模糊导入。
import的静态导入
也就是将类中的所有静态变量和静态方法全部导入。不建议使用,因为使用后代码可读性太差。