Java函数

函数

  • 函数的定义

函数指的是定义在类中的具有特定功能的一段独立代码块。降低了代码冗余复用函数即可,降低了主函数的代码量,将主函数进行适当的拆分,以便内存优化。
特点:   定义函数可以将功能代码进行封装便于对该功能进行复用
               函数只有被调用才会被执行
               函数的出现提高了代码的复用性
               对于函数没有具体返回值的情况,返回值类型用关键字void表示,
               那么该函数中的return语句如果在最后一行可以省略不写。

函数基本格式:
访问权限 函数类型 返回值类型 函数名(参数列表){
      函数体
      return 返回值;
}

访问权限:指的就是函数的使用范围(内部和外部) 

函数类型:指的就是函数类型分类,说的就是函数的具体使用场景和场合

函数名:就是程序员给这一段代码自定义的名称(标识符)

参数列表:参数列表有若干个 参数类型,参数名... 组成 主要用于接收外界传递给函数的一些数据

函数体:就是那些具有独立功能的代码块

return:仅仅表示结束当前函数,如果有返回值,则函数结束前将返回值返回给调用者

返回值:指的就是这一具有独立功能的代码块的计算结果,需要传递给外界 配合return

返回值类型:就是返回值的数据类型(可兼容)

例如: 

//定义了一个加法函数
public static int add(int a,int b){
     
       int c = a+b;
       return c;
}
  •  函数的分类

根据有无返回值和有无参数大致将函数分为四类:有返回值有参数、有返回值无参数、无返回值有参数、无返回值无参数。

注意的是:有返回值的函数调用时需要参与运算、输出、赋值;无返回值的函数只需要直接调用即可。

  • 函数参数的传递

函数的参数总体分为两类:形式参数和实际参数。

形式参数(形参):就是定义函数的时候,参数列表当中的数据,叫做形参

实际参数(实参):就是在调用函数的时候,给函数传递的数据(常量,变量)叫做实参

参数的传递是从实参传递给形参,实参传递给形参的是地址值,这样形参和实参就指向同一段内存单元,在函数体内对形参数据的改变也将影响到实参。实参和形参之间不可双向传递。地址有两种情况:①常量在常量池中的地址②对象在堆内存中的地址。

 局部变量:在函数内部定义的变量称为局部变量 ,其作用域只在当前函数中。所以形式参数一定是局部变量。

  •  函数栈

函数的运行是基于栈内存的。栈是一个先进后出的一个容器结构。可以将每一个函数理解为是子弹(函数帧/栈帧),位于栈顶的函数帧优先运行的.
主函数绝对是第一个进栈的,也是最后一个弹栈的。当一个函数执行到return时当前函数弹栈。原理如下图:

Java函数_第1张图片

Java函数_第2张图片

  • 函数的重载

函数的重载指的就是同一个类(同一个范围)中出现的同名函数。重载的好处就在于我们可以扩展函数的功能(函数重名,但是参数类型不一样,执行内容也可以不一样)。

两个重载函数必须在下列一个或两个方面有所区别:

1、函数的参数个数不同。

2、函数的参数类型不同或者参数类型顺序不同。

注意:函数的重载与函数权限没关系,与函数返回值类型没关系,与函数参数名没关系。

寻找适当函数的流程
1.看是否有确切的参数定义  例如:int+int 查看是否有(int,int)
2.看是否有可兼容的参数定义 例如:int+int 查看是否有(double,double)
3.如果可兼容的参数定义有多个此时报错 引用不明确     例如int+int,存在(double,int)或(int,double),有多个匹配,不能确定。

class Test01{
    public static void main(String[] args){
       int a = 6;
       int b = 7;
       double c = 3.14;
       //以下三个函数都调用了add函数
       System.out.println(add(a,b));//由于a,b都是int型所以他会匹配第一个函数
       System.out.println(add(c,b));//由于c是double,b是int所以会匹配第二个函数
       add(c);//由于只传了一个参数所以匹配第三个函数
        
    }
    public static int add(int x,int y){
        int z = x + y;
        return z;
    }
    public static double add(double x,int y){
        double z = x + y;
        return z;
    }
    public static void add(double x){
         System.out.println(x);
    }
}

 输出:13  10.14  3.14

  • 函数的递归调用

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件

递归用于解决迭代不容易解决或者无法解决的问题。在某些问题上,递归所写的代码要比迭代写的代码少。但是递归就是函数在反复进栈,进栈的次数多了,势必会占内存,是无法避免的。

递归其实是分治法的一种实现方式(一种实现思路),分治法是一种算法思想,分治法主要解决的问题是将大问题,进行拆分,拆分成若干个小的问题进行求解,最终将每个小问题的解进行合并。其实,分治法就是一种暴力破解法(穷举),也是一种搜索最优答案的算法

递归的步骤(先递后归):前进段:指的就是讲问题从大化小

                                                结束段:问题无法再继续化小,则处理当前的问题

                                                 返回段:将小问题处理完毕之后,向上返回(有些问题是不需要返回的)

//汉诺塔问题
class Hanno{
    public static void main(String[] args){
        //盘子的个数 出发 中间 目的
        hanno(64,"X","Y","Z");
    }                                     
    public static void hanno(int n,String begin,String mid,String end){
        if(n==1){//边界条件,当只剩一个盘子是直接从X->Z.
            System.out.println(begin+" -> "+end);
        }else{
            hanno(n-1,begin,end,mid);
            System.out.println(begin+" -> "+end);
            hanno(n-1,mid,begin,end);
        }
    }
}
//斐波那契数列
class Fibo{
    public static void main(String[] args){
       
        for(int i=1;i<=100;i++){
            System.out.println(fibo(i));
        }
    }
    
    public static int fibo(int n){
        if(n==1||n==2){//边界条件n为1和2时,都返回1;
            return 1;
        }
        return fibo(n-1)+fibo(n-2);
    }
    
}

 

  • 常用的函数

Math类: 

Math.E()自然对数的值        Math.PI 圆周率的值      

Math.abs(a)计算a的绝对值      

Math.ceil(a) 返回大于a的最小整数      

Math.floor(a)返回小于a的最大整数        

Math.hypot(x,y)   Math.max(a,b)计算a,b中的最大值           

Math.min(a,b)计算a,b中的最小值        

Math.pow(a,b)计算a的b次方  

Math.sqrt(a)计算a的平方根

 Math.random() 随机生成一个[0,1)的数        

Math.rint(a)四舍五入返回double值     

Math.round(a)四舍五入float时返回int值,double时返回long值

String类:

查询相关:

char charAt(int index)查询字符串中角标为index的字符

int indexOf(int ch) 查找一个指定的字符串是否存在,返回的是字符串的位置,如果不存在,则返回-1 。

int lastIndexOf(int ch)  返回指定字符在此字符串中最后一次出现处的索引。

int length() 返回字符串的长度值

substring(int beginIndex, int endIndex)截取字符串 

boolean contains(String s)判断一个字符串里面是否包含指定的内容,返回一个布尔值

boolean endsWith(String s)测试此字符串是否以指定的后缀结束。返回一个布尔值

boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始。返回一个布尔值

int compareTo(String anotherString) 按字典顺序比较两个字符串。

boolean equals(String anotherString)比较两个字符串是否相等,返回布尔值

boolean equalsIgnoreCase(String anotherString) 忽略大小写的比较两个字符串的值是否一模一样,返回一个布尔值

boolean isEmpty() 判断字符串是否为空

修改相关:(注意:对字符串的修改永远都不是对其自身进行的修改字符串本身是不可变的,对字符串的修改往往都是新建个字符串将修改后内容赋值并返回新的字符串)

String replace(char oldChar, char newChar) 新字符替换旧字符,也可以达到去空格的效果一种

String toUpperCase() 字符串大小写的转换

String toLowerCase() 字符串大小写的转换

String trim()去掉字符串左右空格

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Java,笔记)