• 《疯狂Java讲义》(七)---- 方法


    一  方法的参数传递机制

      Java方法的参数传递方式只有一种:值传递。就是将实际参数值的副本传入方法内,而参数本身不会受到任何影响。

      eg.

      基本类型的值传递

    public class PrimitiveTransferTest {
    
        public static void swap(int a, int b) {
            int tmp = a;
            a = b;
            b = tmp;
    
            System.out.println("in swap(), a =" + a + " b =" + b);
        }
    
        public static void main(String[] args) {
            int a = 6;
            int b = 9;
            swap(a, b);
            System.out.println("after swap(), a =" + a + ", b =" + b);
        }
    
    }

      输出结果:

    in swap(), a =9 b =6
    after swap(), a =6, b =9

    所以main方法中的a和b,并不是swap方法中的a和b。

      main()开始定义了a和b两个局部变量,存在main方法的栈区。当程序执行swap方法时,系统进入swap方法中,并将main方法中的a和b变量作为参数值传入swap方法,传入swap方法的只是a和b的副本,而不是a和b本身,进入swap方法后系统产生了4个变量,即main()的a和b,swap()中的a和b。

      在main方法中调用swap方法时,main方法还没结束,因此系统为main和swap分配两块栈区,用于保存main和swap的局部变量。main方法中a和b变量作为参数值传入swap方法,实际上是在swap方法栈区中重新产生了两个变量a和b,并将main方法栈区中a和b变量的值分别赋给swap方法栈区的a和b参数(就是对swap方法的a和b形参进行初始化),此时,系统存在两个变量a,两个变量b,只是存在不同的方法栈区中。这就是值传递。

      eg.

      引用类型的值传递

      

    public class ReferenceTransferTest {
    
        public static void swap(DataWrap dw) {
            int tmp = dw.a;
            dw.a = dw.b;
            dw.b = tmp;
    
            System.out.println("in swap(), dw.a =" + dw.a + ", dw.b =" + dw.b);
        }
    
        public static void main(String[] args) {
            DataWrap dw = new DataWrap();
            dw.a = 6;
            dw.b = 9;
            swap(dw);
    
            System.out.println("after swap(), dw.a = " + dw.a + ", dw.b =" + dw.b);
    
        }
    
    }
    
    class DataWrap {
    
        public int a;
    
        public int b;
    }

    输出结果:

    in swap(), dw.a =9, dw.b =6
    after swap(), dw.a = 9, dw.b =6

    main方法中开始调用swap方法,main方法并未结束,系统会分别开辟出main和swap两个栈区,用于存放main和swap方法的局部变量。调用swap方法时,dw变量作为实参传入swap方法,同样采用值传递的方式:把main方法里的dw变量值赋给swap方法的dw形参,从而完成swap方法的dw形参的初始化,main方法中dw是一个引用,保存了DataWrap对象的地址值,当把dw的值赋给swap的dw形参后,即swap方法的dw形参也保存这个地址值,也引用对内存中的DataWrap对象。当程序在swap方法中操作dw形参时,由于dw制式一个引用变量,故实际操作的还是对内存中的DataWrap对象。此时,不管操作main方法里的dw变量,还是操作swap方法里的dw参数,其实都是操作它所引用的DataWrap对象。

    二  形参个数可变的方法

      从JDK1.5之后,Java允许定义形参个数可变的参数,从而允许为方法制定数量不确定的形参。在定义方法时,在最后一个形参的类型后增加三点,则表明该形参可以接受多个参数值,多个参数值被当作数组传入。

      test(int a, String... books);

  • 相关阅读:
    windows下的IO模型之选择(select)模型
    tcp通讯中socket套接字accept和listen的关系
    转一篇shell中关于各种括号的讲解
    记两个std接口equal_range,set_difference
    nginx学习
    c++ 读取文本问题
    vim使用常看
    CNN设计一些问题
    什么是反射?反射机制的应用场景有哪些?
    java为什么只有值传递?
  • 原文地址:https://www.cnblogs.com/IvySue/p/6288577.html
Copyright © 2020-2023  润新知