06.方法的传参机制

方法的传参机制对今后学习的编程非常重要!一定要的清清楚楚明明白白

基本数据类型的传参机制

public class MethodParameter01{  
    public static void main(String[] args){  
        //创建AA类,调用swap,并传入两个整数  
        int a = 10;  
        int b = 20;  
        CC cc = new CC();  
        cc.swap(a,b);  
        //调用完方法之后,在输出a与b的值  
        System.out.println("main方法的a="+a+"\nb="+b);  
    }  
}  
  
class CC{  
    public void swap(int a, int b){  
        System.out.println("a与b交互前的值:\na="+a+"b="+b);  
        //交换a与b的值  
        int temp = a;  
        a = b;  
        b = temp;  
        System.out.println("a与b交换完后的值\na=" + a + "\nb=" + b);  
    }  
}

![[Pasted image 20221122210342.png]]

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

引用数据类型的传参机制

案例:MethodParameter02.java

  • 在D类中编写一个方法test100,接收一个数组,在方法中修改该数组,看看原来的数组是否有变化?
  • D类中编写一个方法test200,可以接受一个Person(aegs,sa)对象,在方法中修改该对象属性,看看原来的对象是否有变化?
public class MethodParameter02 {  
    public static void main(String[] args) {  
        int[] arr = {1, 2, 3, 4, 5};  
        //调用D类的test100方法,并传入数组arr  
        D d = new D();  
        d.test100(arr);  
        System.out.println("\n调用完test100方法后的arr:");  
        for (int i : arr) {  
            System.out.print(i + "\t");  
        }  
  
        //创建对象p,并定义姓名与年龄  
        P p = new P();  
        p.name = "jack";  
        p.age = 10;  
        System.out.println("main方法传递给test200方法前的对象变量为:\n" + "姓名:" + p.name + "\n年龄:" + p.age);  
        //传递对象p的变量给D类的test200方法  
        d.test200(p);  
        System.out.println("main方法传递给test200方法后的对象变量为:\n" + "姓名:" + p.name + "\n年龄:" + p.age);  
    }  
}  
  
//定义P类  
class P {  
    String name;  
    int age;  
}  
  
//定义D类,并定义test100与test200成员方法  
class D {  
  
    //试验修改从main方法传递进来的数组有无改变  
    public void test100(int[] arrNew) {  
        System.out.println("main方法传入进来的数组:");  
        for (int i : arrNew) {  
            System.out.print(i + "\t");  
        }  
        //改变第三个元素的值  
        arrNew[2] = 100;  
        //打印  
        System.out.println("\nmain方法传入进来修改后的数组:");  
        for (int i : arrNew) {  
            System.out.print(i + "\t");  
        }  
    }  
  
    //试验修改从main方法传递进来的对象的成员变量有无改变  
    public void test200(P p) {  
        //修改mian方法对象P的属性初始值  
        p.name = "tom";  
        p.age = 20;  
        System.out.println("test200方法的对象变量为:\n" + "姓名:" + p.name + "\n年龄:" + p.age);  
    }  
}

test100:
![[Pasted image 20221122214251.png]]

test200:
![[Pasted image 20221127210357.png]]

结论

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

案例:

  • 下面方法会对原来的对象有影响吗?

    p = nulll;
    //不会。在test200方法中没有引用对象之后,在main方法使用不会有任何问题,因为是test的形参对象取消指向对象空间,而不是取消main方法的对象
    ![[Pasted image 20221127213154.png]]
    p = new P();
    //不会。当指向传递进来方法的对象值时,test200的对象p指向main方法的对象地址,然而这行代码却让对象p指向新建的对象地址,这跟数组指向另一个数值类似。所以此刻的对象p没有main方法对象p的任何数值,除非自己重新赋值。
    返回main方法之后,在test200新创建的对象不使用的话将会被jvm判断为垃圾清理掉。
    ![[Pasted image 20221127213412.png]]

posted @ 2022-11-27 21:47  大脑修理工  阅读(7)  评论(0)    收藏  举报