函数

  • 函数
    • Java中如何定义函数
    • 函数的分类
    • 局部变量
    • 函数在内存的调用的本质
    • 函数重载(overload)
    • 函数递归

函数

何为函数:为了解决某一特定问题,具有名称的代码集合,可以当做现实中得到一种行为动作!!
过程:n个小过程组成 最好不要超过20行,简化过程实现代码的高度复用。

Java中如何定义函数

访问修饰符 函数返回值的类型 | void 函数名称([参数列表]){
//函数体
//return 返回值
}

Java中函数是属于类的!!必须定义在类中!!所以说函数是类成员,不要写在main函数中,函数不能包含函数。
注意,在main函数中,如果要调用非静态方法, 必须使用构建对象的方式(这个就是后面的面向对象的知识)。

函数的调用:函数无法自己执行,必须要调用。

class TestFun01 {public static void main(String[] args) {sayHello();  //函数的调用}public static void sayHello() {System.out.println("姓名:xxx");}
}  //该函数灵活度太差,一次执行最多只能输出一个。

函数的分类

  1. 有参数的函数,调用时必须传递对应的参数(让代码更加灵活),如上面的代码一次执行只能输出一个,故可以用有参函数增加输出的个数:
class TestFun02 {public static void main(String[] args) {// 有参数的函数,调用时必须传递对应的参数showInfo("天命", 23, '男');showInfo("项羽", 21, '女');}public static void showInfo(String name, int age, char gender) {System.out.println("我的名字叫:"+ name);System.out.println("我的年龄:"+ age);System.out.println("我的性别:"+ gender);}
}

执行结果:

2. 无参函数,调用时不需要参数的函数,不灵活。
3. 无返回值的函数:函数名称前是void,没有返回值。

访问修饰符 void 函数名称([参数列表]){
//函数体
//return 返回值
}

  1. 有返回值的函数:返回什么类型就用什么类型调用!!!
class TestFun03 {public static void main(String[] args) {// 将函数的返回值使用变量接受int a = add(5, 8);System.out.println("8 + 5 = "+ a);}public static int add(int x, int y) {System.out.println("函数开始了……");// 函数中,如果遇到return关键字,函数立刻返回return x + y;}
}

*不能写 string a=add(5,8);*当然,若能自动转换可以用其他数据类型函数中,如果遇到return关键字函数立刻返回
执行结果:

  1. 系统函数:自带的函数内容,可以使用相关工具查找该类型函数,并调用。
  2. 第三者
  3. 自定义函数:由程序员自己定义的函数。

局部变量

函数体内定义的变量是局部变量!!!只用于函数体内!!,成员变量是整个类的,而局部变量只属于函数。

判断输入的数字是否为质数:

import java.util.Scanner;class TestFun04 {// 成员变量int c = 20;public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print(">");int num = sc.nextInt();boolean primer = isPrimer(num);if (primer) {System.out.println("是质数");} else {System.out.println("不是质数");}}public static void test01(int code) {// 定义一个局部变量int a = 10;a += 100;System.out.println(a);a += code;System.out.println(a);System.out.println(++code);}public static boolean isPrimer(int num) {for (int i = 2; i < num / 2; ++i) {if (num % i == 0) {return false;}}return true;}
}

执行结果:

函数在内存的调用的本质


首先我们要了解栈与堆,
栈:用于存放变量,当函数执行时,相当于运行的进程,而栈就是计算机内存中存放这些进程,变量的地方。他的存放与释放顺序是先进后出(就像把东西装进瓶子,先进去的被压在底部,故出来是最后出来)设计栈是为了让代码执行完后 继续执行。

假如声明并初始化变量a,把a的值赋给b,如果是队列顺序,a是第一个存入栈的,那么a就会第一个释放,所以不能赋值给b,所以要按照先进后出顺序,不能用队列顺序。

int a = 10;
int b = a;

堆:内存中存放新开辟的对象或数组。
压栈(push):调用函数时就压栈,执行所有代码 放入栈中
弹栈(pop):执行完后离开函数体,释放局部变量 从栈中出去

了解完这些后,我们再看图中,我们先定义函数,则出现压栈情况,然后进行调用时:“Test01()”,test01进行压栈,最后执行并返回(或不返回) ,最后弹栈,释放局部变量。

函数重载(overload)

函数名称相同函数内参数数据类型不同参数个数不同,自动匹配对应的函数,返回值的类型要相同(函数重载与返回值无关)

函数重载是所有编程语言都有的吗?
函数重载现象是强数据类型语言(java,c、c++、c#)所持有的现象。弱数据类型语言(javascript、python、ruby 由值决定数据类型)是不具备函数重载,

public static int add(int a , int b){return a+b;
}
public static int add(int a , byte b){return a+b;
}  //重载,参数类型不同
public static int add(int a , int b,int c){return a+b; //重载,参数个数不同
}

函数递归

函数自身调用自身。
优点:分治理念的体现,可以把非常复杂的代码简化
缺点:非常耗费内存,尽量不要超出1000层,递归会不断压栈,可能会导致栈溢出,会触发StackOverflowError 异常!

可设置堆,栈大小,可使用java -x -xss大小。 来调整jvm的栈大小空间
Xms<大小> 设置初始java堆大小
-Xms<大小> 设置最大java堆大小

斐波那契数列:

class TestF {public static void main(String[] args) {System.out.println(getFibo2(10));}// 递归方式求斐波那契数列的public static int getFibo(int n) {if (n == 1 || n == 2) {return 1;}return getFibo(n - 1) + getFibo(n - 2);}public static int getFibo2(int n) {int first = 1, second = 2;int temp;for (int i = 2; i <= n; i++) {temp = second;second = first + second;first = temp;}return first;}public static int getStairs(int n) {if (n == 1) {return 1;}if (n == 2) {return 2;}return getFibo(n - 1) + getFibo(n - 2);}
}

执行结果

Java学习第五日:函数相关推荐

  1. JAVA学习笔记五---函数

    JAVA学习笔记五---函数 5.1 方法的学习 编写一个程序,求圆的周长和面积. package practice; /*** 编写一个程序,求圆的周长和面积.* @author iszhangyo ...

  2. 【Java】Java学习笔记(2)——Java面向对象基础作业函数题

    本人私人博客:Megalomania,大部分文章会现在博客上传,有不足之处欢迎指正. 学校小学期Java课程的练习题,留个档便于以后需要时候有例子可以回忆,写的烂的地方请多多包含 1.求两个数值之和 ...

  3. Java中的回调函数学习-深入浅出

    Java中的回调函数一般来说分为下面几步: 声明回调函数的统一接口interface A.包括方法callback(); 在调用类caller内将该接口设置为私有成员private A XXX; 在c ...

  4. Java正则表达式--Matcher.group函数的用法

    https://www.cnblogs.com/jiafuwei/p/6080984.html Java正则表达式--Matcher.group函数的用法 原来,group是针对()来说的,group ...

  5. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  6. Java学习之 多态 Polymorphism

    Java学习之多态 多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = ne ...

  7. Java必备:java入门、java学习

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为北京尚学堂原创文章,未经允许不得转载. 1.Java入门 1-1.Java具有那些适合在Internet环境中 ...

  8. java学习笔记—EL表达式(38)

    EL表达式 EL即Expression Language,主要的任务是帮助开发者简化获取域属性. 但是一般情况下需要使用EL和JSTL结合使用. 语法: ${ // 隐含对象|直接写域中的属性 }  ...

  9. 学习Kotlin(五)函数与Lambda表达式

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

最新文章

  1. mysql之日志和mysqlbinlog工具的使用
  2. 细谈 对象的初始化过程------内存中的实现过程?
  3. 什么是云计算基础设施?
  4. IIS ARR设置HTTP跳转到HTTPS
  5. java怎么处理ajax请求,java怎么用ajax请求?jquery ajax请求后台的简单例子
  6. Andriod Studio两种签名机制V1和V2的区别
  7. 麒麟810加持,华为nova 5z让你一步从青铜变王者
  8. JQuery插件,轻量级表单模型验证
  9. Build path entry is missing: /src/test/java missing 报错问题解决
  10. 大数据分析入门小技巧
  11. JavaWeb—优化JDBC代码
  12. php变量自减,PHP 中「自增、自减」运算引发的奇怪问题
  13. Windows下一个MySQL有些错误的解决方法
  14. html ui在线生成器,漂亮的CSS按钮样式集以及在线生成工具
  15. 百度离线语音合成SDK使用
  16. 阳振坤:OceanBase 数据库七亿 tpmC 的关键技术
  17. Android Studio属性动画,Android Studio 三种方式建立动画效果
  18. 启明星 ZYNQ 开发板实验平台简介
  19. DSP CCS3.3安装问题与解决方案
  20. 深圳大学软工专硕数二英二改为数一英一,计算机专硕改为英一

热门文章

  1. 【C++】unique_ptr独占型智能指针详解
  2. Android的MVC MVP MVVM模式
  3. 二进制如何进行正负数之间的转换
  4. 蚂蚁金服java研发岗二面:Redis内存满了该怎么办了
  5. -bash: /usr/bin/fap: /bin/bash^M: bad interpreter: No such file or directory
  6. N63044-第十三周
  7. armv8/armv9 MMU深度学习
  8. python 编译器spyder 安装_离线安装spyder的Python环境
  9. 高校实验室应该怎样建设(实验室建设规划)
  10. 微信小程序的重点知识点--递归函数--必须要会的