java学习06

方法(Method)
  方法是一段可以完成某个特定功能的并且可以被重复利用的代码片段。
  在C语言中,方法被称为“函数”。
  当定义了一个/抽取了一个方法出来,而这个方法却无法完成某个功能,那么抽取的这个方法毫无意义。一般一个方法就是一个“功能单元”。在开发过程中,某个功能是可以独立抽取出来的,应将其定义为方法,这样以后只要需要这个功能,那么直接调用这个方法即可,而不需要重复编写业务逻辑代码。方法的出现,让代码具有了很强的复用性。
  程序开始执行的时候是先执行main方法。main方法是第一入口。
  在Java语言中所有的方法体中的代码都必须遵循自上而下的顺序依次逐行执行。
  main方法不需要程序员手动调用,是由JVM调用的。但是除了main方法之外的其他方法,都需要程序员手动调用,方法只有调用的时候才会执行,方法不调用不会执行。
  方法定义在类体中,方法定义的顺序没有关系,都可以。

方法的定义
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}

注意:中括号里面的内容表示不是必须的,是可选的。方法体由Java语句构成。

修饰符列表
修饰符列表不是必选项,是可选的。

返回值类型
第一:返回值类型可以是任何类型,只要是Java中合法的数据类型就行,数据类型包括基本数据类型和引用数据类型。
第二:返回值一般指的是一个方法执行结束之后的结果,通常是一个数据,所以被称为“返回值”。方法就是为了完成某个特定的功能,方法结束之后大部分情况下都有一个结果的,而体现结果的一般都是数据。数据都有类型,这就是返回值类型。
第三:当一个方法执行结束不返回任何值的时候,返回值类型也不能空白,必须写上void关键字。void表示该方法执行结束后不返回任何结果。(main方法结束之后不需要给JVM返回任何执行结果。)
第四:如果返回值类型不是void,那么你在方法执行结束之后必须使用“return 值;”这样的语句来完成“值”的返回,如果没有“return 值;”这样的语句,编译器会报错。
第五:只要有“return ”关键字的语句执行,当前方法必然结束。
第六:如果返回值类型是void,那么在方法体当中不能有“return 值;”这样的语句,但是可以有“return;”这样的语句,这个语句的作用就是用来终止当前方法的。

形式参数列表
形式参数列表中每一个参数都是“局部变量”,方法结束之后内存释放。
形参的个数是0~N个,形参有多个的话使用“逗号”隔开,形参的数据类型起决定性作用,形参对应的变量名时随意的。

方法体
方法体由Java语句构成,Java语句以“;”结尾,方法体当中编写的是业务逻辑代码,完成某个特定功能。在方法体中处理业务逻辑代码的时候需要数据,数据来源就是这些形参。

方法的调用
调用语法:
  类名.方法名(实际参数列表);
  实参和形参的个数和类型必须一一对应。
在方法调用的时候,a()方法调用b()方法,a/b方法在同一个类中,“类名.”可以省略。如果不在同一个类中,“类名.”不可以省略。
方法调用叫做:压栈。分配空间;方法结束叫做:弹栈。释放空间。

JVM内存结构
JVM中的主要内存空间:栈(stack)、堆、方法区,除了这三块之外,还有其他的。
栈内存
栈:在方法被调用的时候,该方法需要的内存空间在栈中分配。
方法只有在调用的时候才会在栈中分配空间,并且调用的时候就是压栈;方法执行结束之后,该方法所需要的空间就会释放,此时发生弹栈动作。
栈中会存储方法运行过程中需要的内存,以及栈中会储存方法的局部变量。
栈的活动最频繁,一直压栈弹栈。
堆内存
凡是通过new运算符创建的对象,都储存在堆内存当中。new运算符的作用就是在堆内存中开辟一块空间。
堆中储存对象,以及对象的实例变量
方法区
类加载classloader,将硬盘上的xxx.class字节码文件装载到JVM的时候,会将字节码文件存放到方法区当中,也就是说方法区存储的是代码片段。
因为类需要加载,所以方法区当中最先有数据。

数据结构通常是存放数据的容量,而该容器可能存在不同的结构。
常见的数据结构:数组、链表、图、二叉树、栈、队列~~
Java语言把常用的数据结构已经写好了。

方法重载(overload)
方法重载的优点:第一:代码整齐美观。第二:“功能相似”的,可以让“方法名相同”,更易于以后代码的编写。
在Java语言中,是怎么进行方法的区分的?
答:首先Java编译器会通过方法名进行区分,但是在java语言中允许方法名相同的情况出现,如果方法名相同的情况下,编译器会通过方法的参数类型进行方法的区分。
在同一个类中,如果“功能1”和“功能2”他们的功能是相似的。那么可以考虑将它们的方法名一致,这样代码既美观,又便于后期的代码编写。
注意:方法重载overload不能随便使用,如果两个功能压根不相干,不相似,根本没关系,此时两个方法使用重载机制的话,会导致编码更麻烦,无法进行方法功能的区分。
当在同一个类中、方法名相同、参数列表不同(参数的个数不同、参数的类型不同、参数的顺序不同),这样可以认为方法和方法之间发生了重载机制。方法重载与返回值类型和修饰符无关。

方法递归:方法自己调用自己。
当递归时程序没有结束条件,一定会发生:栈内存溢出错误,递归必须要有结束条件。
假设递归结束条件是对的,是合法的,但是有时候也会出现栈内存溢出错误,因为有可能递归的太深,栈内存不够。
尽量不使用递归,能用for循环while循环代替的,尽量使用循环代替。因为循环的效率高,耗费的内存少;递归耗费的内存比较大,另外递归的使用不当,会导致JVM死掉。(但在极少数情况下,不用递归,这个程序无法实现。)
在实际开发中,遇到了栈内存溢出的情况,解决步骤:第一步:先检查递归的结束条件对不对。如果递归的结束条件不对,必须对条件进一步修改,知道正确为止。 第二步:假设递归条件没问题,这个时候需要手动调整JVM的栈内存初始化大小,可以将栈内存的空间调大点。第三步:调整了大小,如果运行时还是出现这个错误,没办法,只能继续扩大栈内存的大小。(java -X)命令可以查看调整堆栈的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值