• [java学习笔记]java语言基础概述之函数的定义和使用&函数传值问题


    1.函数

    1.什么是函数?

    • 定义在类中具有特定功能的一段独立小程序。
    • 函数也叫做方法

    2.函数的格式

    • 修饰符   返回值类型    函数名(参数类型  形式参数1, 参数类型  形式参数2…) {

              执行语句(函数体);

              return 返回值;

          }

    返回值类型:函数运行完成后输出的数据类型。

    参数类型:是形式参数的数据类型。

    形式参数:是一个变量,用于储存调用函数时传递给函数的实际参数。

    实际参数:传递给形参的实际数据。

    return:结束函数,返回数据给调用者的关键字。

    返回值:该函数运行后的结果,返回给调用者。

    特殊情况:函数没有具体的返回值。

           这时return后直接用分号结束。(return在最后一行可以省略)

           用void关键字作为返回值类型。

    3.函数的特点

    • 定义函数可以将功能代码进行封装
    • 便于对该功能进行复用
    • 函数只有被调用才会执行
    • 函数的出现提高了代码的复用性
    • 对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行,可以省略不写
    • 注意:
    1. 函数中只能调用函数,不能在函数中定义函数,即函数不能嵌套调用
    2. 定义函数时,函数的结果应该返回给调用者,交由调用者处理
    3. 两个明确:结果&参数

    4.重载(overload)

    函数的功能一样,仅仅参与运算的未知内容不同时,可以利用重载定义多个函数,使用同一函数名,这样方便阅读,在调用时,虚拟机通过参数列表的不同来区分这些函数。

    • 概念:

                     在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。

    • 特点:

                    与返回值无关,只看参数列表

    • 好处:

                    方便与阅读,优化了程序设计

    • 示例:
    public class Utill{
        
        //返回两个整数的和
        public static int sum(int a, int b){
            return a+b;
        }
        //返回两个小数的和
        public static double sum(double a, double b){
            return a+b;
        }
        //返回三个整数的和
        public static int sum(int a, int b, int c){
            return a+b+c;
        }
    
    }

    不能这样定义:因为虚拟机不确定调用哪个,只能通过参数列表的类型或个数进行区分。

    public class Util{
        
        //返回两个整数的和
        public static int sum(int a, int b){
            return a+b;
        }
        //返回两个小数的和
        public static double sum(int a, int b){
            return a+b;
        }
    
    }

    2.函数传值

      • java函数基本数据类型是传值,引用数据类型是传引用
      • 当参数为引用时,无论函数体内进行了何种操作,都不会改变实参对象的引用
      • 当参数为引用时,只有在函数体内改变了对象的内容时,才会改变实参对象的内容。

    (一)基本数据类型:传值,不会改变实参的值

    public class Demo{
        public static void main(String[] args) {
            
            int a = 3,b = 4;
            fun(a,b);
            System.out.println(a+","+b);
    
        }
        //试图交换a和b的值
        public static void fun(int a, int b){
            int temp = a;
            a = b;
            b = temp;
        }
        
    }

    运行结果为3,4

    分析:当程序执行到main函数时,在栈内存中就会多出一个main方法区,里面有a=3和b=4两个变量,接着执行fun(a,b),又会在栈内存中创建一个fun的方法区,里面有a和b变量。接着把main方法的a和b变量赋值给了fun方法区的a和b变量,即fun方法区的a=3,b=4,然后在fun方法区中交换了fun方法区的a和b的值,即fun方法区的a=4,b=3,fun方法执行完毕了,fun方法区被释放。改变不了main方法区的a和b变量。

    (二)对象类型参数:传引用,函数体内改变形参引用,不会改变实参的引用,但是能改变实参的内容。

    public class FunDemo{
        public static void main(String[] args) {
            
            
            Person p1 = new Person(10);
            Person p2 = new Person(20);
    
            System.out.println("before,p1.age:"+p1.age);
            System.out.println("before,p2.age:"+p2.age);
    
    
            ss(p1,p2);
    
            System.out.println("after,p1.age:"+p1.age);
            System.out.println("after,p1.age:"+p2.age);
    
        }
        //试图交换p1和p2的引用,和改变其中一个的age属性值
        public static void ss(Person p1, Person p2){
            Person p = p1;
            p1 = p2;
            p2 = p;
            p1.age = 30;
        }
    }

    运行结果:

    before,p1.age:10
    before,p2.age:20
    after,p1.age:10
    after,p2.age:30

    分析:当运行到Person p1 = new Person(10);时,会在栈内存中开辟一个新空间来储存变量p1,在堆内存中创建一个Person(10)的实例,p2同理。当调用ss方法时,又会在栈内存中开辟新空间来存储形式变量p1和p2,它们分别指向堆内存中对应实际参数所指向的Person实例,在ss方法内部,交换的是形参的p1和p2的值,即交换了它们的指向。这时候,实参的指向并没有改变。然后,改变形参p1所指向的实例的内容,即改变了实参p2所指向的实例的内容。

  • 相关阅读:
    利用JS判断浏览器种类
    Navicat for MySQL导出表结构脚本的方法
    Spring中Quartz的配置及corn表达式
    easyUI中点击datagrid列标题排序
    JAVA中科学计数法转换普通计数法
    MySQL查询结果复制到新表(更新、插入)
    SVN错误:Attempted to lock an already-locked dir的解决
    TMS320VC5509的外部中断
    TMS320VC5509总线驱动LED灯
    TMS320VC5509的USB口通信
  • 原文地址:https://www.cnblogs.com/ma-fei/p/4854770.html
Copyright © 2020-2023  润新知