精华内容
下载资源
问答
  • Java方法的形参和实参

    2020-01-22 22:28:41
    Java方法的形参和实参形参实参传值调用传引用调用总结 形参与实参对应两种类型:值类型与引用类型 值类型:包括8种基本类型(byte、short、int、long、double、float、char、boolean)+ String 引用类型:数组、类...

    形参与实参对应两种类型:值类型与引用类型

    • 值类型:包括8种基本类型(byte、short、int、long、double、float、char、boolean)+ String
    • 引用类型:数组、类、接口等类型。

    注意String类型,这个比较特殊,它是存储在常量池中的,你可以把它近似看成值类型的。因为它的值一旦确定,就无法改变。

    • 为值类型时,形参方法内的参数值改变,并不会影响到实参的值。
    • 为引用类型时,形参方法内的参数值改变时,会影响到实参的值。注意是地址所指向的堆中的值,如果形参的地址改变了,那么这个改变不会影响到实参。

    形参

    用来接收调用方法时传递的参数。只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间。因此仅仅在方法内有效。

    public void swap(int a, int b) {
            int temp = a;
            a = b;
            b = temp;
            System.out.println("a:" + a + " b:" + b);
    }
    

    这里边的a,b就是形参,temp是一个局部变量,方法结束,在栈空间中就会被销毁

    实参

    传递给被调用方法的值,预先创建并赋予确定值。

    1. 调用上面的
    2. swap(1,2);
    3. 其中1和2就是实际的参数值,就叫实参

    传值调用

    传值调用中传递的参数为基本数据类型,参数视为形参。

    public class Transform {
    
      public static void main(String[] args) {
        int i = 10;
        int j = 5;
        System.out.println("i: " + i + ", j: " + j);
        Transform.swap(i, j);
        System.out.println("i: " + i + ", j: " + j);
      }
    
      private static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a: " + a + ", b: " + b);
      }
      
    }
    

    这里我们写了一个实现两个 int 型数据交换的方法,并且在 main() 方法中调用,然而结果却并不是我们想要的。
    运行结果如下图所示:
    传值调用测试运行结果
    就是因为基本数据类型是属于传值调用,当我们要实现交换时,方法内可以完成交换,只是形参进行了交换,方法结束,栈空间中就会销毁 swap() 方法内的局部变量,所以当调用 swap() 时,最终值还是实参的初始化值,并没有被修改。值改变作用到了形参,而不会作用到实参。

    传引用调用

    传引用调用中,如果传递的参数是引用数据类型,参数视为实参。在调用的过程中,将实参的地址传递给了形参,形参上的改变会影响到实参。

    /*
    	参数传递:
    	形参:方法声明时,方法小括号内的参数
    	实参:调用方法时,实际传入的参数值
    	java中传递值得机制:
    	形参是基本数据类型的: 将实参的值传递给实参的基本数据类型的变量
    	形参是引用数据类型的: 将实参的引用类型的值(即在堆空间中生成的首地址的值)传递给形参的引用类型的变量
    */
    public class Test {
    
      public static void main(String[] args) {
        Test t = new Test();
        Data data = new Data();
        System.out.println("data.i: " + data.i + ", data.j:" + data.j);
        // 调用
        Test.swap(data);
        System.out.println("data.i: " + data.i + ", data.j:" + data.j);
      }
    
      private static void swap(Data data) {
        int temp = data.i;
        data.i = data.j;
        data.j = temp;
      }
    }
    
    class Data {
      int i = 10;
      int j = 5;
    }
    

    形参部分直接传进去了一个对象,相当于堆空间的首地址值得引用
    运行结果:
    传引用调用测试运行结果

    总结

    1. java的基本数据类型是传值调用,引用类型是传引用调用;
    2. 当传值调用时,改变的是形参的值,并没有改变实参的值,实参的值可以传递给形参,但是,这个传递是单向的,形参不能传递回实参;
    3. 当传引用调用时,如果参数是对象,无论对对象做了何种操作,都不会改变实参对象的引用,但是如果改变了对象的内容,就会对应改变实参对象的内容。
    展开全文
  • java中向方法传递参数是,是将参数副本传递进去,即方法运行时会被分配一...1、什么是形参和实参2、方法调用时参数传递过程3、值传递和引用传递importlombok.AllArgsConstructor;importlombok.Data;importlombok...

    java中向方法传递参数是,是将参数的副本传递进去,即方法运行时会被分配一块内存区域保存一个参数值的copy,修改副本值,对原参数并没有影响。

    要理解形参和实参,并在编码中避免一些必要的错误,需要弄清两个概念。

    1、什么是形参和实参

    2、方法调用时参数传递的过程

    3、值传递和引用传递

    importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;public classArgumentsTest {public static voidmain(String[] args){

    Emp empA= new Emp("ke",22);int num = 22;

    apply(empA);

    System.out.println(empA);

    apply2(num);

    System.out.println(num);

    }public static voidapply(Emp emp){

    emp= new Emp("li",77);

    }public static void apply2(intnum){

    num= 33;

    }

    @AllArgsConstructor

    @NoArgsConstructor

    @Datastatic classEmp{privateString name;private intage;

    }

    }

    首先什么是形参什么是实参?

    在上述代码中,apply方法的参数emp,就是形参,形式参数,它代表实际参数来参与方法的逻辑;而实参就是在调用方法时,向方法传递的参数值,即main方法中empA。

    在方法运行时参数是如何传递的呢?

    首先,每个变量都会在内存中对应一个内存空间,用来存放参数值。而在方法运行时,虚拟机会在栈中创建内存空间保存一个实参的副本,该内存空间会在方法调用结束时销毁,该对副本的修改不会影响原参数的值。

    值传递和引用传递?

    在java中有两种数据类型,基本类型和引用类型。当变量是基本类型是,变量对应的内存空间保存的变量值,如上述代码中num保存22;当变量是引用类型时,内存中保存的是实际对象在堆中的地址。

    而在方法调用时,传递的都是变量对应内存中的值,不同的是基本类型参数传递值给方法,引用类型参数传递对象内存地址给方法。

    引用类型包括:类类型、接口类型、数组。

    运行上述代码:

    结果:

    ArgumentsTest.Emp(name=ke, age=22)22

    原参数值并没有被改变。

    引用类型参数被改变值的情况

    改变apply方法的逻辑:

    public static voidapply(Emp emp){

    emp.setName("li");

    emp.setAge(44);

    }

    结果:

    ArgumentsTest.Emp(name=li, age=44)

    原参数被改变了,为什么。

    因为,方法中的参数虽然是原参数的副本,但是实例对象在堆中的数据只有一份,如果直接去修改对象的属性值,就可以修改原参数值了。

    类似的,对数组,可以修改单个数组元素的值,也是有效的。

    对于包装类,可以通过反射修改内部的value,可以达到相同的效果。

    展开全文
  • java中向方法传递参数是,是将参数副本传递进去,即方法运行时会被分配一...1、什么是形参和实参2、方法调用时参数传递过程3、值传递和引用传递import lombok.AllArgsConstructor;import lombok.Data;import lom...

    java中向方法传递参数是,是将参数的副本传递进去,即方法运行时会被分配一块内存区域保存一个参数值的copy,修改副本值,对原参数并没有影响。

    要理解形参和实参,并在编码中避免一些必要的错误,需要弄清两个概念。

    1、什么是形参和实参

    2、方法调用时参数传递的过程

    3、值传递和引用传递

    import lombok.AllArgsConstructor;

    import lombok.Data;

    import lombok.NoArgsConstructor;

    public class ArgumentsTest {

    public static void main(String[] args){

    Emp empA = new Emp("ke",22);

    int num = 22;

    apply(empA);

    System.out.println(empA);

    apply2(num);

    System.out.println(num);

    }

    public static void apply(Emp emp){

    emp = new Emp("li",77);

    }

    public static void apply2(int num){

    num = 33;

    }

    @AllArgsConstructor

    @NoArgsConstructor

    @Data

    static class Emp{

    private String name;

    private int age;

    }

    }

    首先什么是形参什么是实参?

    在上述代码中,apply方法的参数emp,就是形参,形式参数,它代表实际参数来参与方法的逻辑;而实参就是在调用方法时,向方法传递的参数值,即main方法中empA。

    在方法运行时参数是如何传递的呢?

    首先,每个变量都会在内存中对应一个内存空间,用来存放参数值。而在方法运行时,虚拟机会在栈中创建内存空间保存一个实参的副本,该内存空间会在方法调用结束时销毁,该对副本的修改不会影响原参数的值。

    值传递和引用传递?

    在java中有两种数据类型,基本类型和引用类型。当变量是基本类型是,变量对应的内存空间保存的变量值,如上述代码中num保存22;当变量是引用类型时,内存中保存的是实际对象在堆中的地址。

    而在方法调用时,传递的都是变量对应内存中的值,不同的是基本类型参数传递值给方法,引用类型参数传递对象内存地址给方法。

    引用类型包括:类类型、接口类型、数组。

    运行上述代码:

    结果:

    ArgumentsTest.Emp(name=ke, age=22)22

    原参数值并没有被改变。

    引用类型参数被改变值的情况

    改变apply方法的逻辑:

    public static voidapply(Emp emp){

    emp.setName("li");

    emp.setAge(44);

    }

    结果:

    ArgumentsTest.Emp(name=li, age=44)

    原参数被改变了,为什么。

    因为,方法中的参数虽然是原参数的副本,但是实例对象在堆中的数据只有一份,如果直接去修改对象的属性值,就可以修改原参数值了。

    类似的,对数组,可以修改单个数组元素的值,也是有效的。

    对于包装类,可以通过反射修改内部的value,可以达到相同的效果。

    原文:https://www.cnblogs.com/whalesea/p/13172756.html

    展开全文
  • Java 方法形参和实参

    千次阅读 2019-05-24 16:58:00
    * 形式参数:用于接收实际参数的变量(形式参数一般就在方法的声明上) * 实际参数:实际参与运算的变量 * 方法的参数如果是基本数据类型:形式参数的改变不影响实际参数。 * * 基本数据类型:byte,short,int,...
     * 形式参数:用于接收实际参数的变量(形式参数一般就在方法的声明上)
    * 实际参数:实际参与运算的变量

     * 方法的参数如果是基本数据类型:形式参数的改变不影响实际参数。
    *
    * 基本数据类型:byte,short,int,float,double,char,boolean

     * 方法的参数如果是引用数据类型:形式参数的改变直接影响实际参数        
     *  引用数据类型:数组arr,接口,类
    * string是个类,是引用数据类型

    package method.形式参数OR实际参数;
    
    public class XingCan {
        public static void main(String[] args) {
            int a = 10;
            int b = 20;
            System.out.println("a:"+a+",b:"+b);//a:10,b:20
            change(a,b);
            System.out.println("a:"+a+",b:"+b);//??? a:10,b:20
    
        }
    
        public static void change(int a,int b) {//a=10,b=20
            System.out.println("a:"+a+",b:"+b);//a:10,b:20
            a = b;//a=20
            b = a + b;//b=40
            System.out.println("a:"+a+",b:"+b);//a:20,b:40
        }
    }

    输出结果:

     

     

    package method.形式参数OR实际参数;
    /*
     * 如果参数是引用数据类型:
     *         形式参数的改变直接影响实际参数
     */
    public class ShiCan {
        public static void main(String[] args) {
            int[] arr = {1,2,3,4,5};
            for(int x=0; x<arr.length; x++) {
                System.out.println(arr[x]);
            }
            System.out.println("----------");
            change(arr);
            System.out.println("~~~~~~~~~");
            for(int x=0; x<arr.length; x++) {
                System.out.println(arr[x]);
            }
        }
    
    
        public static void change(int[] arr) {
            for(int x=0; x<arr.length; x++) {
                if(arr[x]%2==0) {
                    arr[x]*=2;
                }
                System.out.println(arr[x]);
            }
        }
    }

    输出:

     

     

     

    一、基本数据类型:

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0

    short:短整型,在内存中占16位,即2个字节,取值范围-32768~32767,默认值0

    int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0

    long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L

    float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0

    double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0

    char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空

    boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

    二、引用数据类型:

    类、接口类型、数组类型、枚举类型、注解类型。

    区别:

    基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。

    引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。

    例如,有一个类Person,有属性name,age,带有参的构造方法,

    Person p = new Person("zhangsan",20);

    在内存中的具体创建过程是:

    1.首先在栈内存中位其p分配一块空间;

    2.在堆内存中为Person对象分配一块空间,并为其三个属性设初值"",0;

    3.根据类Person中对属性的定义,为该对象的两个属性进行赋值操作;

    4.调用构造方法,为两个属性赋值为"Tom",20;(注意这个时候p与Person对象之间还没有建立联系);

    5.将Person对象在堆内存中的地址,赋值给栈中的p;通过引用(句柄)p可以找到堆中对象的具体信息。

    相关知识:

    静态区: 保存自动全局变量和 static 变量(包括 static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。

    堆区:  一般由程序员分配释放,由 malloc 系列函数或 new 操作符分配的内存,其生命周期由 free 或 delete 决定。在没有释放之前一直存在,直到程序结束,由OS释放。其特点是使用灵活,空间比较大,但容易出错

    栈区: 由编译器自动分配释放,保存局部变量,栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限

    文字常量区: 常量字符串就是放在这里的。   程序结束后由系统释放。

    转载于:https://www.cnblogs.com/longesang/p/10919095.html

    展开全文
  • java的形参和实参

    千次阅读 2018-04-16 18:33:57
    形参 形式参数 ...形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。 区别: 形参变量只有在被调用时才分...
  • java形参和实参的区别篇一形参不能离开方法。形参只有在方法内才会发生作用,也只有在方法中使用,不会在方法外可见。而实参可以再程序任何地方都使用。java形参和实参的区别篇二形参代表一个合集,具有不确定...
  • 在具体理解形参和实参的区别前,我们需要明白几个基本概念: 形参:形式参数,方法声明时参数,它用来接收调用者传递来实参;它只有在被调用时JVM才会为其分配内存单元,调用结束后回收内存单元,因此它作用...
  • Java的形参和实参

    千次阅读 2018-05-30 10:17:02
    实参(实际参数): 是在调用时传递给函数参数。...是在定义函数名函数体时使用参数,用来接收调用该函数时传入参数(即实参传值给形参)。所以实参的类型个数应和形参一一对应。例如:void add(...
  • Java方法的形参和实参的区别

    千次阅读 2017-02-13 17:29:14
    很简单,但忘记了它定义而已。  一句话定义方法参数是形参,调用处传过来参数是实参
  • 例如,主方法入栈,基本数据类型变量num入栈,再是其他方法入栈(其他方法中有与主方法相同基本数据类型变量num),弹栈时,其他方法出栈(伴随着num出栈),因此num最终结果是主方法num值 ...
  • * 形式参数:用于接收实际参数的变量(形式参数一般就在方法的声明上)* 实际参数:实际参与运算的变量* 方法的参数如果是基本数据类型:形式参数的改变不影响实际参数。** 基本数据类型:byte,short,int,float,double...
  • 2.实参:传递给被调用方法的值,预先创建并赋予确定值。 3.传值调用:传值调用中传递的参数为基本数据类型,参数视为形参。 4.传引用调用:传引用调用中,如果传递的参数是引用数据类型,参数视为实参。在调用的...
  • JAVA的形参和实参的区别

    千次阅读 2018-09-02 16:05:32
    (1)形参 顾名思义:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元。因此,形参只...
  • 值类型时,形参方法参数值改变,并不会影响到实参的值。 引用类型时,形参方法参数值改变时,会影响到实参的值。注意是地址所指向堆中值,如果形参的地址改变了,那么这个改变不会影...
  • 实参:可以是常量、变量、表达式、函数等, 无论实参是何种类型量,在进行函数调用时,它们都必须具有确定.../*** 注意:* 传递参数:形参(方法中)改变有没有影响实参(main函数中)* 1.基本数据类型 没有影响* ...
  • Java 方法的使用(方法重载、形参和实参调用关系、方法递归)前言一、方法重载二、实参和形参的传递三、方法递归 前言 提示: 本文介绍了方法的三种实际的使用 方法重载、实参与形参传递的形式(有画内存图)方法...
  • java形参和实参的区别(值传递 引用传递) 形参和实参的区别 形参 就是形式参数,用于定义方法的时候使用的参数,用来接收调用者传递的参数。形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用...
  • 其中的参数i就是形参 形参是这个方法的局部变量 只能在方法体中使用当你调用这个方法的时候,比如setter(a);此时a就是实参 实参a把他的值传递给形参i基本数据类型实参传递给形参的是值对象实参传递给形参的是对象的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 988
精华内容 395
关键字:

java方法的形参和实参

java 订阅