成员方法的传参机制(重中之重)

成员方法的传参机制(重中之重)
1.基本数据类型的传参机制

分析下面的代码,写出结果:

public class MethodParameter01 {
    public static void main(String[] args) {
        int a = 10;//实参
        int b = 20;//实参
        Parameter parameter = new Parameter();
        parameter.swap(a,b);//调用swap方法//实参
        System.out.println("main方法中的a="+a+"b="+b);
    }
}
class Parameter {
    public void swap(int a,int b){//形参
        System.out.println("a和b的值交换之前分别是: a="+a+"b="+b);
        int tmp = a;
        a = b;
        b = tmp;
        System.out.println("a和b的值交换之后分别是: a="+a+"b="+b);
    }
}
/**
 * 返回值:
 *      a和b的值交换之前分别是: a=10	b=20
 *      a和b的值交换之后分别是: a=20	b=10
 *      main方法中的a=10	b=20
 */

分析示意图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ci2eLUz6-1642079419652)(E:\Typora笔记\java笔记\img\image-20220111084833878.png)]

分析是:main栈和swap栈都是分开的

结论:基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参

2.引用数据类型的传参机制

案例:

Parameter02类中编写一个test01方法,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?

parameter02类中编写一个方法test02,可以接收一个Person(age,salary)对象,在方法中修改该对象属性,看看原来的对象是否变化?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdlpa0zQ-1642079419654)(E:\Typora笔记\java笔记\img\4.jpg)]

1.Parameter02类中编写一个test01方法,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?

public class MethodParameter02 {
    public static void main(String[] args) {
        Parameter02 parameter02 = new Parameter02();
        int[] arr = {1,2,3};
        parameter02.test01(arr);
        //遍历数组
        System.out.println("main的数组");
        for (int a:arr
             ) {
            System.out.print(a+"\t");
        }
    }
}
/**
 *  Parameter02类中编写一个test01方法,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?
 */
 
 class Parameter02{

    public void test01(int[] arr){
        arr[0]=100;
        //遍历数组
        System.out.println("test01中的数组");
        for (int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }

    /**
     * 返回值:
     * test01中的数组
     * 100	2	3
     * main的数组
     * 100	2	3
     */
}

在这里插入图片描述

2.parameter02类中编写一个方法test02,可以接收一个Person(new Person())对象,在方法中修改该对象属性,看看原来的对象是否变化?

public class MethodParameter02 {
    public static void main(String[] args) {
        Parameter02 parameter02 = new Parameter02();
        Person p = new Person();
        p.name = "海康";
        p.age = 43;
        parameter02.test02(p);
        System.out.println("年龄是age="+p.age);
    }
}
class Person{
    public String name;
    public int age;
}
 * parameter02类中编写一个方法test02,可以接收一个Person(age,salary)对象,
 *  在方法中修改该对象属性,看看原来的对象是否变化?
 */
class Parameter02{
    public void test02(Person person){
        person.age=100;
    }
}

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

全局变量是在堆中,局部变量在栈

案例:下面的方法会对原来的对象有影响吗?

person = null;p = new Person();对应示意图分析:

public class MethodParameter02 {
    public static void main(String[] args) {
        Parameter02 parameter02 = new Parameter02();
        Person p = new Person();
        p.name = "海康";
        p.age = 43;
        parameter02.test02(p);
        
        //测试题,如果test02执行是p=null,下面的结果是10
        //测试题,如果test02执行是p=new Person()...的代码,下面的结果是10
        System.out.println("年龄是age="+p.age);
        
        
    }
}
class Person{
    public String name;
    public int age;
}

/**
 * parameter02类中编写一个方法test02,可以接收一个Person(age,salary)对象,
 *  在方法中修改该对象属性,看看原来的对象是否变化?
 */

    public void test02(Person person){
//        person.age=100;
        //思考 
//        person = null;
        //思考2
        person = new Person();
        person.name="湛江";
        person.age=86;
    }
}

练习

1.编写MyTools类,编写一个方法可以打印二维数组的数据
2.编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象,注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性值完全相同
public class myTools02 {
    public static void main(String[] args) {
        Tools tools = new Tools();
        int[][]  arr = {{1,2,3},{43,5,6},{7,86,9}};
        tools.print(arr);
        Person person = new Person();
        Person person03 = tools.copyPerson(person);
        System.out.println(person);
        System.out.println(person03);
        /**
         * 返回值:
         *1    2  3
         * 43  5  6
         * 7   86 9
         * Person@1b6d3586
         * Person@4554617c
         * 两个hashCode值不同,说明两个不同的对象
         */
    }
}


class Tools{
    //1.编写MyTools类,编写一个方法可以打印二维数组的数据
    //打印二维数组
    public void print(int[][] arr){
        for (int i=0;i<arr.length;i++){
            for (int j=0;j<arr[i].length;j++){
                System.out.print(arr[i][j]+"\t");
            }
            System.out.println();
        }
    }

    /**
     * 2.编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象,
     * 注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性值完全相同
     */
    /**
     * 分析思路:
     * 返回值类型:Person
     * 方法名:copyPerson
     * 参数列表:Person person   由于设置完全相同的属性
     * */
    public Person copyPerson(Person person){
        Person person02 = new Person();
        person02.name = person.name;
        person02.age = person.age;
        return person02;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值