标签:特定 说明 out 文件加载 font 不同的 new tac pac
方法(method、函数)概述:
对于上面的语法格式中具体说明如下:
代码举例
/* 注意: 程序开始执行的时候是先执行main方法。 因为main方法是一个入口。 在java语言中所有的方法体中的代码都必须遵循自上而下的顺序依次逐行执行。 这个必须记住。 main方法不需要程序员手动调用,是由JVM调用的。 但是除了main方法之外其他的方法,都需要程序员 手动调用,方法只有调用的时候才会执行,方法不调用 是不会执行的。 */ public class MethodTest { // 方法定义在类体当中。 // 方法定义的先后顺序没有关系。都可以。 // 主方法。入口。 public static void main(String[] args) { // 自上而下依次逐行执行。 // 需求1:请编写程序,计算100和200的求和。 sumInt(100, 200); // 需求2:请编写程序,计算666和888的求和。 sumInt(666, 888); // 需求3:请编写程序,计算111和222的和 sumInt(111, 222); } // 专门在这个类体当中定义一个方法,这个方法专门来完成求和。 // x y z在以下的sumInt方法中都属于局部变量 // 局部变量有一个特点:方法结束之后,局部变量占用的内存会自动释放。 public static void sumInt(int x, int y) { // 自上而下的顺序依次逐行执行。 int z = x + y; System.out.println(x + "+" + y + "=" + z); } }
方法的分类
定义方法时,要做到两个明确
静态方法调用的三种形式
调用方法时的注意:
代码举例:
public class Demo02MethodDefine { public static void main(String[] args) { // 单独调用 sum(10, 20); System.out.println("==========="); // 打印调用 System.out.println(sum(10, 20)); // 30 System.out.println("==========="); // 赋值调用 int number = sum(15, 25); number += 100; System.out.println("变量的值:" + number); // 140 } public static int sum(int a, int b) { System.out.println("方法执行啦!"); int result = a + b; return result; } }
方法使用的注意事项
栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其 他任何位置进行添加、查找、删除等操作。
简单的说:采用该结构的集合,对元素的存取有如下的特点
这里两个名词需要注意:
Java虚拟机的内存划分 :为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。如下图所示:
上图是一张标准的 java 虚拟机内存结构图,目前我们只看其中的“栈”和“方法区”,其它的后期研究,方法区中存储类的信息,或者也可以理解为代码片段,方法在执行过程中需要的内存空间在栈中分配。java 程序开始执行的时候先通过类加载器子系统找到硬盘上的字节码(class)文件,然后将其加载到 java 虚拟机的方法区当中,开始调用 main 方法,main 方法被调用的瞬间,会给 main 方法在“栈”内存中分配所属的活动空间,此时发生压栈动作,main 方法的活动空间处于栈底。
也就是说,方法只定义不去调用的话,只是把它的代码片段存储在方法区当中,java 虚拟机是不会在栈内存当中给该方法分配活动空间的,只有在调用的瞬间,java 虚拟机才会在“栈内存”当中给该方法分配活动空间,此时发生压栈动作,直到这个方法执行结束的时候,这个方法在栈内存中所对应的活动空间就会释放掉,此时发生弹栈动作。由于栈的特点是先进后出,所以最先调用的方法(最先压栈)一定是最后结束的(最后弹栈)。比如:main 方法最先被调用,那么它一定是最后一个结束的。换句话说:main 方法结束了,程序也就结束了(目前来说是这样)。
public class MethodTest { public static void main(String[] args) { System.out.println("main begin"); m1(); System.out.println("main over"); } public static void m1() { System.out.println("m1 begin"); m2(); System.out.println("m1 over"); } public static void m2() { System.out.println("m2 begin"); System.out.println("m2 over"); } }
方法重载(overload)是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java 编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。调用方法时通过传递给它们的不同个数和类型的实参来决定具体使用哪个方法。
总结:
方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
重载的特点:
代码举例
package com.itheima_05; /* 方法重载: 多个方法在同一个类中 多个方法具有相同的方法名 多个方法的参数不相同,类型不同或者数量不同 与返回值无关 在调用的时候,Java虚拟机会通过参数的不同来区分同名的方法 */ public class MethodDemo { public static void main(String[] args) { //调用方法 int result = sum(10,20); System.out.println(result); double result2 = sum(10.0,20.0); System.out.println(result2); int result3 = sum(10,20,30); System.out.println(result3); } //需求1:求两个int类型数据和的方法 public static int sum(int a, int b) { return a + b; } //需求2:求两个double类型数据和的方法 public static double sum(double a, double b) { return a + b; } //需求3:求三个int类型数据和的方法 public static int sum(int a, int b, int c) { return a + b + c; } }
递归:递归其实就是方法在执行的过程中调用了另一个方法,而另一个方法则是自己本身。
注意事项:
代码举例
/* 方法递归? 1、什么是方法递归? 方法自己调用自己,这就是方法递归。 2、当递归时程序没有结束条件,一定会发生: 栈内存溢出错误:StackOverflowError 所以:递归必须要有结束条件。(这是一个非常重要的知识点。) JVM发生错误之后只有一个结果,就是退出JVM。 3、递归假设是有结束条件的,就一定不会发生栈内存溢出错误吗? 假设这个结束条件是对的,是合法的,递归有的时候也会出现栈内存溢出错误。 因为有可能递归的太深,栈内存不够了。因为一直在压栈。 4、在实际的开发中,不建议轻易的选择递归,能用for循环while循环代替的,尽量 使用循环来做。因为循环的效率高,耗费的内存少。递归耗费的内存比较大,另外 递归的使用不当,会导致JVM死掉。 (但在极少数的情况下,不用递归,这个程序没法实现。) 所以:递归我们还是要认真学习的。 5、在实际的开发中,假设有一天你真正的遇到了:StackOverflowError 你怎么解决这个问题,可以谈一下你的思路吗? 我来谈一下我的个人思路: 首先第一步: 先检查递归的结束条件对不对。如果递归结束条件不对, 必须对条件进一步修改,直到正确为止。 第二步:假设递归条件没问题,怎么办? 这个时候需要手动的调整JVM的栈内存初始化大小。 可以将栈内存的空间调大点。(可以调整大一些。) 第三步:调整了大小,如果运行时还是出现这个错误, 没办法,只能继续扩大栈的内存大小。 (java -X)这个可以查看调整堆栈大小的参数 */ // 使用递归,请编写程序,计算1~n的和。 public class RecursionTest03{ public static void main(String[] args){ // 1~3的和 int n = 3; int r = sum(n); System.out.println(r); // 6 } public static int sum(int n){ //n最初等于3 // 3 + 2 (2是怎么的出来的:n - 1) //sum(n - 1); if(n == 1){ return 1; } // 程序能执行到此处说明n不是1 return n + sum(n-1); } }
???????递归的基本使用:
package FileDemo; public class DiGuiDemo { public static void main(String[] args) { //回顾不死神兔问题,求第20个月兔子的对数 // 每个月的兔子对数:1,1,2,3,5,8,... int[] arr = new int[20]; arr[0] = 1; arr[1] = 1; for (int i = 2; i < arr.length; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } System.out.println(arr[19]); System.out.println(f(20)); } /* 递归解决问题,首先就是要定义一个方法: 定义一个方法f(n):表示第n个月的兔子对数 那么,第n-1个月的兔子对数该如何表示呢? f(n-1) 同理,第n-2个月的兔子对数该如何表示呢? f(n-2) StackOverflowError:当堆栈溢出发生时抛出一个应用程序递归太深 */ public static int f(int n) { if (n == 1 || n == 2) { return 1; } else { return f(n - 1) + f(n - 2); } } }
标签:特定 说明 out 文件加载 font 不同的 new tac pac
原文地址:https://www.cnblogs.com/wurengen/p/13237450.html