方法传参机制

本文探讨了Java中方法参数传递的原理,通过实例展示了对于引用类型(如数组和对象)参数,方法内部的修改会影响原始数据。在练习中,通过`test100`方法修改数组和`test200`方法修改对象属性,验证了引用传递的概念。测试题揭示了方法内对参数对象的重新赋值并不会影响原始对象的引用。
摘要由CSDN通过智能技术生成

方法传参机制

1、引用传递:栈调用的方法所指向的数据空间,和主方法里指向的数据空间是一样的。所以class B里对数组的修改,会影响到主方法里的数组。

结论:引用类型(即对象、数组)传递的是地址(传递也是值,但值是地址),可以通过形参影响实参!

练习1: 在B类中编写一个方法test100,可以接收一个数组,在方法中修改该数组,看看原来数组是否变化。
public class MethodParameter {
    public static void main(String[] args) {
        B b = new B();
        int[] arr = {1,2,3};//数组是引用类型,有地址,会指向堆空间
        b.test100(arr);//只要调用方法,就会产生新栈
        //引用类型不是值拷贝,传递的是地址,
        // 所以新栈test100里的arr也指向main里的arr的地址,在堆空间里是同一个。
        System.out.println("\n"+"main的arr数组");
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
    }
}

class B{
    // 在B类中编写一个方法test100,可以接收一个数组
    //在方法中修改该数组,看看原来数组是否变化
    public void test100(int[] arr){
        arr[0] = 200;//修改元素
        //遍历数组
        System.out.println("test100的arr数组");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");

        }
    }
}

在这里插入图片描述

练习2: 在B类中编写一个test200,可以接收一个Person(age,sal)对象,在方法中修改对象属性,看看原来的对象是否变化。
public class MethodParameter {
    public static void main(String[] args) {
        //测试
        B b = new B();
        Person p = new Person();
        p.name = "jack";
        p.age = 10;
        b.test200(p);//实质:把p对象的地址赋给了test200作形参p,共享一个数据空间。
        System.out.println("main的p.age=" + p.age);
    }
}

//在B类中编写一个test200,可以接收一个Person(age,sal)对象,
// 在方法中修改对象属性,看看原来的对象是否变化。
class Person {
    String name;
    int age;
}

class B {
    public void test200(Person p) {
        p.age = 10000;//修改对象属性
    }

    // 在B类中编写一个方法test100,可以接收一个数组
    //在方法中修改该数组,看看原来数组是否变化
    public void test100(int[] arr) {
        arr[0] = 200;//修改元素
        //遍历数组
        System.out.println("test100的arr数组");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }

}

在这里插入图片描述

测试题1:练习2中class B中test200执行p = null;产生的结果是——

在这里插入图片描述

public class MethodParameter {
    public static void main(String[] args) {
        //测试
        B b = new B();
        Person p = new Person();
        p.name = "jack";
        p.age = 10;
        b.test200(p);//实质:把p对象的地址赋给了test200作形参p,共享一个数据空间。
        System.out.println("main的p.age=" + p.age);
    }
}
//在B类中编写一个test200,可以接收一个Person(age,sal)对象,
// 在方法中修改对象属性,看看原来的对象是否变化。
class Person {
    String name;
    int age;
}
class B {
    public void test200(Person p) {
        //错误哦:p.age = 10000;//修改对象属性
        p = null;//形参地址置空,实参还是原来的地址。不会改变main栈。原先指向你,现在不指向你了!
        //现在指向空的地方,与你无关系了。我把我自己置空,没有办法把你置空。
    }
}

在这里插入图片描述
测试题2:练习2中class B中test200执行p = new Person…产生的结果是——

public class MethodParameter {
    public static void main(String[] args) {
        //测试
        B b = new B();
        Person p = new Person();
        p.name = "jack";
        p.age = 10;
        b.test200(p);//实质:把p对象的地址赋给了test200作形参p,共享一个数据空间。
        System.out.println("main的p.age=" + p.age);//找的仍然是main方法里的p
    }
}

//在B类中编写一个test200,可以接收一个Person(age,sal)对象,
// 在方法中修改对象属性,看看原来的对象是否变化。
class Person {
    String name;
    int age;
}

class B {
    public void test200(Person p) {
        p = new Person();//在堆空间里又产生一个新的人对象,此时不指向main里p的地址。
        //指向新的人对象的地址。
        p.name = "Tom";
        p.age = 99;   
   //尴尬的是:test200里创建了对象,也赋值了,但是直接走了没有用到,所以这个对象会被当做一个垃圾被回收。
   //相当于在test200里创建了个局部变量p,弄完没有用就返回了,返回后这个就变成了没有任何变量引用的对象,就会成为垃圾被回收。
    }
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值